AVR单片机C语言应用100例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.3 ATmega128单片机的系统时钟

图1.7所示为ATmega128单片机的系统时钟构成。在实际工作中,使用这些时钟的不同选择和组合来驱动ATmega128工作。

图1.7 ATmega128单片机的系统时钟构成

ATmega128单片机的系统时钟由以下5个部分构成。

● CPU时钟:clkCPU与ATmega128单片机的内核各个模块相连接,如通用寄存器、状态寄存器及保存堆栈指针的数据存储器,终止CPU时钟将使内核停止工作。

●I/O时钟:clkI/O用于驱动主要的I/O模块,如定时/计数器模块、SPI总线接口模块和USART模块等,I/O时钟还用于驱动外部中断模块。但是,有些外部中断由异步逻辑检测,因此即使I/O时钟停止了,这些中断仍然可以得到监控。另外,TWI(I2 C)总线接口模块的启动检测在没有clkI/O的情况下也是使用异步逻辑来检测的,所以该数据总线模块在ATmega128单片机的任何睡眠模式下都可以正常工作。

●Flash时钟:clkFlash用于控制Flash存储器接口的操作,此时钟通常与CPU时钟同时挂起或激活。

● 异步定时器时钟:clkASY异步定时器时钟允许定时/计数器由外部32kHz时钟晶体驱动,使得这些定时/计数器即使在ATmega128的睡眠模式下仍然可以正常工作。

● ADC时钟:clkADC是ADC模块的专用时钟,这样可以在ADC工作时停止CPU和I/O时钟,以降低数字电路产生的噪声,从而提高ADC转换精度。

1. 时钟源选择

ATmega128单片机可以通过对熔丝位的配置来选择时钟源,如表1.4所示。

表1.4 使用熔丝位配置时钟源

当ATmega128单片机从自掉电模式或省电模式被唤醒后,被选择的时钟源用来为启动过程定时,以保证振荡器在开始执行指令之前进入稳定状态。当ATmega128单片机从复位开始工作时,还能提供额外的延迟时间,以保证其开始正常工作之前电源达到稳定电平,这个启动时间的定时工作由看门狗振荡器完成。看门狗溢出时间所对应的WDT振荡器周期数如表1.5所示,其频率由工作电压决定。

表1.5 看门狗溢出时间所对应的WDT振荡器周期数

说明

1. 在ATmega128出厂时,CKSEL=“0001”,SUT=“10”,默认设置的时钟源是内部RC振荡器,启动时间最长,这种设置可以保证用户能够通过ISP或并行编程器得到所需的时钟源。

2. 熔丝位是用于对ATmega128单片机进行配置的一系列位,可以在编程时使用编程/下载工具写入ATmega128单片机,从而控制ATmega128单片机进行相应的工作。

2. 晶体振荡器

ATmega128单片机使用晶体振荡器电路如图1.8所示。引脚XTAL1与XTAL2分别用作片内振荡器的反向放大器的输入和输出。

图1.8 ATmega128单片机使用晶体振荡器电路

晶体振荡器可以使用石英晶体,也可以使用陶瓷谐振器。

熔丝位CKOPT用来选择这两种放大器模式的其中之一。当CKOPT被编程时,振荡器在输出引脚产生满幅度的振荡,这种模式适合于噪声环境,以及需要通过XTAL2驱动第2个时钟缓冲器的情况,而且这种模式的频率范围比较宽。当保持CKOPT为未编程状态时,振荡器的输出信号幅度比较小。其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。

对于谐振器,CKOPT未编程时的最大频率为8MHz,CKOPT编程时的最大频率为16MHz。电容C1 和C2的数值要一样,不管使用的是石英晶体还是陶瓷谐振器。最佳的数值与使用的石英晶体或陶瓷谐振器有关,还与杂散电容和环境的电磁噪声有关。

振荡器可以工作于3种不同的模式,每一种都有一个优化的频率范围。工作模式通过熔丝位CKSEL3~CKSEL1来选择,如表1.6所示。

表1.6 晶体振荡器的相关参数选择

说明

CKPOT=1,CKSEL3~CKSEL0=101的选项不适用于晶体,只适用于陶瓷谐振器。

熔丝位CKSEL0和SUT1~SUT0决定了ATmega128单片机的启动时间,如表1.7所示。

表1.7 ATmega1 28单片机的启动时间

3. 低频晶体振荡器

ATmega128单片机可以使用32.768kHz的钟表晶体作为器件的时钟源。此时,必须将熔丝位CKSEL设置为“1001”,以选择低频晶体振荡器,该晶体的连接方式和使用晶体振荡器相同。通过对熔丝位CKOPT的编程,用户可以使能XTAL1和XTAL2的内部电容,从而节省外部电容,内部电容容量的标称值为36pF。使用低频晶体振荡器之后,启动时间由熔丝位SUT确定,如表1.8所示。

表1.8 低频晶体振荡器的启动时间

4. 外部RC振荡器

如果ATmega128单片机的应用系统不需要特别精确的定时,则可以使用图1.9所示的外部RC振荡器作为时钟源,其频率可以通过公式:

进行大略的计算。其中,C至少要22pF。通过对熔丝位CKOPT的编程,用户可以使能XTAL1和GND之间的片内36pF电容,从而无须外加电容。

图1.9 外部RC振荡器

RC振荡器可以工作于4个不同的模式,每个模式有相应的优化频率范围,工作模式通过对熔丝位CKSEL3~CKSEL0的编程来决定,如表1.9所示。

表1.9 RC振荡器的工作模式

RC振荡器的启动时间由熔丝位SUT决定,如表1.10所示。

表1.10 RC振荡器启动时间

5. 校准片内RC时钟源

ATmega128单片机有一个经过校准的片内RC振荡器,可以给ATmega128单片机提供固定的1.0、2.0、4.0或8.0MHz的时钟频率(这些频率都是5 V、25℃下的标称值)。校准片内时钟源使用熔丝位CKSEL进行控制,如表1.11所示。当使用这个时钟(此时不能对CK-OPT进行编程)时,无须外部振荡器件。当ATmega128单片机复位时,硬件将标定字节加载到OSCCAL寄存器中,自动完成对内部RC振荡器的标定。在5V、25℃和频率为1.0MHz时,这种标定可以提供标称频率±3%的时钟精度。在使用这个振荡器作为系统时钟时,看门狗仍然使用自己的看门狗定时器作为溢出复位的依据。

表1.11 使用校准片内RC时钟源

注意

芯片出厂默认设置为1.0MHz。

当使用RC时钟源时,ATmega128单片机的启动时间由熔丝位SUT决定,如表1.12所示。

表1.12 校准片内RC振荡器启动时间

振荡器标定寄存器OSCCAL的内部结构如表1.13所示。将标定数据写入OSCCAL寄存器,可以对内部振荡器进行调节,以消除由于生产工艺所带来的振荡器频率偏差。复位时,1 MHz的标定数据(标定数据的高字节,地址为0x00)自动加载到OSCCAL寄存器。

表1.13 OSCCAL寄存器

如果需要内部RC振荡器工作于其他频率,其标定数据必须人工加载。首先通过编程器读取标定数据,然后将标定数据保存到Flash或E2 PROM之中。这些数据可以通过软件读取,然后加载到OSCCAL寄存器。当OSCCAL为零时,振荡器以最低频率工作;当对其写入不为零的数据时,内部振荡器的频率将增加,写入0xFF,即得到最高频率。标定的振荡器将用来为访问E2 PROM和Flash定时。需要注意的是,有写E2 PROM和Flash的操作时,不要将频率标定到超过标称频率的10%;否则,写操作有可能失败,如表1.14所示。

注意

振荡器只对1.0、2.0、4.0和8.0MHz 4种频率进行了标定;对于其他频率,则无法保证。

表1.14 内部校准RC时钟源范围

6. 外部时钟源

ATmega128单片机可以使用外部时钟源作为芯片驱动。这时,XTAL1引脚必须按图1.10所示进行连接,同时熔丝位CKSEL必须编程为“0000”。若熔丝位CKOPT也被编程,用户就可以使用内部的XTAL1和GND之间的36pF电容,此时不需要外加电容。

图1.10 外部时钟源电路图

当选择了外部时钟源之后,ATmega128单片机的启动时间由熔丝位SUT确定,如表1.15所示。为了保证ATmega128单片机能够稳定工作,不能突然改变外部时钟源的振荡频率。当工作频率突变超过2%,将会产生异常现象。所以,应该在ATmega128单片机保持复位状态时,改变外部时钟的振荡频率。晶体可以直接与XTAL1和GND引脚连接,无须外部电容器。此振荡器针对32.768kHz的钟表晶体作了优化,不建议在TOSC1引脚输入振荡信号。

表1.15 外部时钟源启动时间