C<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />8051F学习笔记2:C8051F振荡器<?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频率下。
OSCICN = 0x83;
外部振荡器电路可以驱动外部晶体、陶瓷谐振器、电容或RC网络和外部CMOS时钟提供系统时钟。
当使用外部振荡器电路时,必须对所用端口引脚进行配置。端口I/O交叉开关应被配置为跳过被振荡器占用的引脚。
当外部振荡器电路被配置为CMOS时钟方式时,端口引脚P0.3被用作XTAL2。
当外部振荡器电路被配置为晶体/谐振器方式时,端口引脚P0.2和P0.3分别被用作XTAL1和XTAL2
当外部振荡器电路被配置为RC方式时,端口引脚P0.3被用作XTAL2。
当外部振荡器电路被配置为电容方式时,端口引脚P0.3被用作XTAL2。
OSCXCN:外部振荡器控制寄存器
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.通过向寄存器CLKMUL写0x00来复位时钟乘法器。
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无关,既是无论内部振荡器是不分频还是2,4,8分频,4倍时钟乘法器的输出都是24MHz。(系统初始的出厂校准频率为12MHz,OSCICL没动)
例子:
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; //禁止内部振荡
}
这不是真正的振荡器框图,只是对时钟选择寄存器(CLKSEL)的示意图。CLKSEL的位1-0 CLKSL1-0三选一,在
内部振荡器(由寄存器OSCICN中IFCN位选择分频系数)12MHz/6MHz/3MHz/1.5MHz
外部振荡器
内部振荡器24MHz/外部振荡器频率
三个中选择一个作为系统时钟。
CLKSEL:时钟选择寄存器
选择振荡器的过程很繁琐,我们可以借助Configuration Wizard 可以为Silicon Laboratories MCU自动生成振荡器的初始化代码,简化了C8051F的开发。
振荡器配置有5个标签页。
内部振荡器设置(OSCICN)
外部振荡器设置(OSCXCN)
内部振荡器使能(Enable Internal Oscilator)和外部振荡器禁止(External Oscilator Off)要同时有效。
4倍时钟乘法器选择(CLKMUL)
系统时钟选择(CLKSEL)
如果选择了4倍时钟乘法器使能(Enable Clock Multiplier),系统时钟选择就选择(Use Clock Multiplier/2 as SYSCLK),否则根据前面是内部振荡器使能还是外部振荡器使能,选择系统时钟。
SYSCLK是系统时钟的缓冲输出,输出的是系统时钟。可以在交叉开关中允许其输出到输出端口引脚。也可以通过输出SYSCLK,测试振荡器设置是否满足设计的预期。
配置管脚P0.0(C8051F320的2脚)为系统时钟SYSCLK输出,数字推免输出。
void Port_IO_Init()
{
// P0.0 - SYSCLK, Push-Pull, Digital
P0MDOUT = 0x01;
XBR0 = 0x08;
XBR1 = 0x40;
}
下面程序把C8051F320配置成内部振荡,4倍时钟乘法器,SYSCLK管脚输出24MHz频率。
程序下载:https://static.assets-stash.eet-china.com/album/old-resources/2009/4/18/fb41dc33-cb7b-48bc-8695-fa4cbdf1a745.rar
lyl_420819_659650253 2015-11-11 14:53
coyoo 2012-9-12 10:08
用户274627 2010-5-16 22:22
用户200376 2009-4-27 19:38
用户200376 2009-4-27 19:37
用户200376 2009-4-27 19:37
用户184981 2009-4-19 19:24