原创 C8051F学习笔记2:C8051F振荡器

2009-4-18 19:12 9821 8 14 分类: MCU/ 嵌入式

C<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />8051F学习笔记2C8051F振荡器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


C8051F320/1有一个可编程内部振荡器、一个外部振荡器驱动电路和一个4倍时钟乘法器。


系统时钟(SYSCLK)可以来自内部振荡器、外部振荡器电路或4倍时钟乘法器二分频。


USB时钟(USBCLK)可以来自内部振荡器、外部振荡器电路或4倍时钟乘法器。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图


   振荡器框图


 



点击看大图


 


可编程内部振荡器


系统复位后内部振动器默认系统时钟并工作在1.5MHz


两个寄存器:OSCICL(内部振荡器校准寄存器)OSCICN(内部振荡器控制寄存器)


 


OSCICL(内部振荡器校准寄存器)


OSCICL复位值已经过工厂校准,对应的基频为12MHz,精度为±1.5%,该频率适合作为USB时钟。软件可以下面所述修改内部振荡器的频率。 一般情况下是不用对OSCICL进行配置。


 


OSCICN(内部振荡器控制寄存器)



点击看大图


 


IOSCEN:为内部振荡器使能位,0禁止,1使能,手册上写复位值为0,是错误的,应该为1,这样,复位后系统时钟默认为内部振荡器。


 


IFCN1-0:内部振荡器分频选择,复位后为00,系统默认为1.5MHz


 


内部振荡器初始化


   OSCICN |= 0x03;                 //内部振荡器输出为12MHz


程序也可以这样写


OSCICN = 0x83;


//内部振荡器输出为0x83——12MHz; 0x82——6MHz;0x81 3MHz


 


当程序没有对振荡器初始化时,默认系统时钟采用内部振荡器,并运行在1.5MHz频率下。



67f646cd-c2f4-4921-b30f-2746406fb2b7.JPG


OSCICN = 0x83;


 


外部振荡器驱动电路


外部振荡器电路可以驱动外部晶体、陶瓷谐振器、电容或RC网络和外部CMOS时钟提供系统时钟。


当使用外部振荡器电路时,必须对所用端口引脚进行配置。端口I/O交叉开关应被配置为跳过被振荡器占用的引脚。


 


68bc1c25-b1f3-40f1-9230-ec655929dbfc.JPG


 

7d38efae-714f-46fc-a821-f8b69a80ba56.JPG


 



当外部振荡器电路被配置为CMOS时钟方式时,端口引脚P0.3被用作XTAL2


 5253c1d7-851d-4167-a0d5-3b1ca2b368a5.JPG



当外部振荡器电路被配置为晶体/谐振器方式时,端口引脚P0.2P0.3分别被用作XTAL1XTAL2


 

20a9284e-55cf-4c16-879b-9a4fd5f8ba77.JPG 



当外部振荡器电路被配置为RC方式时,端口引脚P0.3被用作XTAL2


 

f4aae3b2-f1c6-49b1-8824-eae2c8d675d9.JPG 



当外部振荡器电路被配置为电容方式时,端口引脚P0.3被用作XTAL2


 


 


OSCXCN:外部振荡器控制寄存器


 



705e64c3-01cb-42d2-b280-20f9729417c2.JPG


  


   OSCXCN(外部振荡器控制寄存器)的具体配置方法可以参考应用笔记“AN002 配置内部和外部振荡器


 


下载:https://static.assets-stash.eet-china.com/album/old-resources/2009/4/18/af44147a-eb7b-40a4-97c8-b89b900ee5d3.rar


 


使用外部RC或外部C连接要注意:


1.由于RC振荡频率误差较大,建议在可能的情况下,波特率尽可能小,以免通讯失误。


2.如果单片机之间通讯,且单片机为同型号,均采用相同值的RC振荡,只要按相同的值设定波特率即可。


3.如果产品是与计算机通讯的,可让计算机以300波特率发00H,用单片机测一下,需编程处理。


4.其它测定频率的办法:


1)用带有晶振振荡的单片机来测,需编程处理。


2)用仿真机来测,需编程处理。


3)用RC振荡的单片机测定频率信号源(频率要稳、准、低),


     需编程处理。


 


4倍时钟乘法器


CLKMUL寄存器配置4倍时钟乘法器。配置和使能4倍时钟乘法器的步骤如下:


1.通过向寄存器CLKMUL0x00来复位时钟乘法器。


2.用MULSEL位选择时钟乘法器的输入。


3.用MULEN位使能时钟乘法器(CLKMUL | = 0x80)。


4.延时大于5 μs


5.用MULINIT位初始化时钟乘法器(CLKMUL | = 0xC0)。


6.查询等待MULRDY =>‘1’


 


注意:当使用外部振荡器作为4倍时钟乘法器的输入时,外部振荡源必须在乘法器被初始化之前被使能并稳定运行。


CLKMUL:时钟乘法器控制寄存器



点击看大图 


 


要注意的是,4倍时钟乘法器使能(MULEN=1)MULSEL选择4倍时钟乘法器的输入,如果选择的是内部振荡器(MULSEL=00),则4倍时钟乘法器的输出为24MHz(12MHzX4÷2),与IFCN1-0无关,既是无论内部振荡器是不分频还是248分频,4倍时钟乘法器的输出都是24MHz(系统初始的出厂校准频率为12MHzOSCICL没动


 


例子:


void Oscillator_Init()


{


    int i = 0;


    CLKMUL    = 0x80;    //时钟乘法器使能,连接时钟乘法器的是内部振荡器


    for (i = 0; i < 20; i++);    // Wait 5us for initialization


    CLKMUL    |= 0xC0;


while ((CLKMUL & 0x20) == 0);


CLKSEL    = 0x02;    //4倍时钟乘法器/2


OSCICN    = 0x83;    //使能内部振荡


}


 


void Oscillator_Init()


{


    int i = 0;


    OSCXCN    = 0x20;   //外部COMS时钟方式


    CLKMUL    = 0x82;    //时钟乘法器使能,连接时钟乘法器的是外部振荡器


    for (i = 0; i < 20; i++);    // Wait 5us for initialization


    CLKMUL    |= 0xC0;


    while ((CLKMUL & 0x20) == 0);


    CLKSEL    = 0x02;   //4倍时钟乘法器/2


    OSCICN    = 0x03;   //禁止内部振荡


}


 


 


系统时钟和USB时钟选择



 


1cc85b59-ccc2-4957-91c7-8b9e500504fe.JPG


 


        这不是真正的振荡器框图,只是对时钟选择寄存器(CLKSEL)的示意图。CLKSEL的位1-0 CLKSL1-0三选一,在


内部振荡器(由寄存器OSCICNIFCN位选择分频系数)12MHz/6MHz/3MHz/1.5MHz


外部振荡器


内部振荡器24MHz/外部振荡器频率


三个中选择一个作为系统时钟。


 


CLKSEL:时钟选择寄存器



点击看大图


 

点击看大图



 


选择振荡器的过程很繁琐,我们可以借助Configuration Wizard 可以为Silicon Laboratories MCU自动生成振荡器的初始化代码,简化了C8051F的开发。




振荡器配置有5个标签页。


 

内部振荡器设置(OSCICN)



 

1e04460a-a49d-4507-a818-6f3e7f98fb52.JPG


 


外部振荡器设置(OSCXCN)


 


86690fe7-cc25-473d-8938-33207cb15695.JPG


 


内部振荡器使能(Enable Internal Oscilator)和外部振荡器禁止(External Oscilator Off)要同时有效。


 


4倍时钟乘法器选择(CLKMUL)



 

     147eb333-78d7-48da-88fd-18adb72725a4.JPG 


 


系统时钟选择(CLKSEL)



 

    72aa68a7-2d02-43f4-adcc-80232272d2d1.JPG 


 

如果选择了4倍时钟乘法器使能(Enable Clock Multiplier),系统时钟选择就选择(Use Clock Multiplier/2 as SYSCLK),否则根据前面是内部振荡器使能还是外部振荡器使能,选择系统时钟。


 


 


              SYSCLK是系统时钟的缓冲输出,输出的是系统时钟。可以在交叉开关中允许其输出到输出端口引脚。也可以通过输出SYSCLK,测试振荡器设置是否满足设计的预期。


     配置管脚P0.0(C8051F3202)为系统时钟SYSCLK输出,数字推免输出。


 


void Port_IO_Init()


{


    // P0.0  -  SYSCLK,      Push-Pull,  Digital


    P0MDOUT   = 0x01;


    XBR0      = 0x08;


    XBR1      = 0x40;


}


 


    下面程序把C8051F320配置成内部振荡,4倍时钟乘法器,SYSCLK管脚输出24MHz频率。



 


befe8c09-fc82-4592-8a6f-3e2bc2acc6d5.JPG


 


程序下载:https://static.assets-stash.eet-china.com/album/old-resources/2009/4/18/fb41dc33-cb7b-48bc-8695-fa4cbdf1a745.rar

文章评论6条评论)

登录后参与讨论

lyl_420819_659650253 2015-11-11 14:53

太好了。多谢了,楼主

coyoo 2012-9-12 10:08

其中: %QUARTUS_ROOTDIR%\bin; 必须加在此path中,不然Virtual JTAG的自动化无法实现。没有这个,所有tcl只能在QII软件里手动source。

用户274627 2010-5-16 22:22

太好了。多谢了,楼主

用户200376 2009-4-27 19:38

不好意思,不小心点了两个,提交了两个一样的。

用户200376 2009-4-27 19:37

我经常用的有F330,300,310这几种,速度确实很快!25MIPS。

用户200376 2009-4-27 19:37

我经常用的有F330,300,310这几种,速度确实很快!25MIPS

用户184981 2009-4-19 19:24

博主是勤奋多才之人
相关推荐阅读
藤井树 2015-10-12 14:43
印制电路板的抗干扰设计 zz
印制电路板的抗干扰设计     作者:中船重工集团第707所 肖麟芬   摘   要:本文以印制电路板的电磁兼容性为核心,分析了电磁干扰的产生机理...
藤井树 2013-10-22 15:32
2010.5.30 黄草梁上包饺子一日登山活动——摘韭菜篇
        上次桃花节的时候也有野韭菜,那时候的我连草和韭菜叶分不清,才回去的韭菜也不敢吃,哈哈,这次可算真正见识了韭菜,黄草梁也叫韭菜梁,因为满山遍野都是野韭菜而闻名,比较圆比较粗的就是野韭...
藤井树 2013-10-22 15:28
2010.5.30 黄草梁上包饺子一日登山活动——包饺子篇
摘韭菜回来,大家已经忙开了 我也装模作样地“工作着” 哈哈,还不让我包,包饺子是技术活,一定要皮薄馅厚才有资格包,像我这样的只能旁观了 摘的韭菜应该足够了,旁边那个袋子是我摘来带回学校的 ...
藤井树 2013-08-09 15:19
datasheet下载网站整理(查IC芯片手册)【原创】
*************************************************************************         作为电子工程师,芯片的dat...
藤井树 2010-06-04 00:21
陈伟宁王辉一家捐助渠道(北京菲亚特—英菲尼迪)
       王辉的最新消息请关注 http://chenweining.org/       目前事故责任认定已经出来了——陈家全责。        发信人: program (程序), 信区: D...
藤井树 2010-06-01 13:43
2010.5.30 黄草梁上包饺子一日登山活动——美景篇
这天不得不说的是天空,蓝蓝的天空,白白的云    绿油油的山脊  我、洪涛哥哥、huangna妹妹还有她同事小艾走在黄草梁上    在蓝天白云下合影       阳光照过来,景色真美 象鼻山,走不...
我要评论
6
8
关闭 站长推荐上一条 /2 下一条