新闻  |   论坛  |   博客  |   在线研讨会
C8051F学习笔记2:C8051F振荡器
0750long | 2009-04-20 13:40:26    阅读:6962   发布文章

C8051F学习笔记2C8051F振荡器

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

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

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

点击看大图

   振荡器框图

 

点击看大图

 

可编程内部振荡器

系统复位后内部振动器默认系统时钟并工作在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 配置内部和外部振荡器”。

 

下载: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;   //禁止内部振荡

}

 

 

系统时钟和USB时钟选择

 

        这不是真正的振荡器框图,只是对时钟选择寄存器(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频率。

 

 

程序下载:rar

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客