对于拥有定时器/ 振荡器引脚(TOSC1 和TOSC2) 的AVR 微处理器,晶体可以直接与这 两个引脚连接,无需外部电容。此振荡器针对32.768 kHz 的钟表晶体作了优化。不建议 在TOSC1 引脚输入振荡信号。
例如,ATmega128:
1.ATmega128 外部时钟:为了从外部时钟源驱动芯片, XTAL1 必须如 Figure 21 所示的进行连接。同时,熔丝位 CKSEL必须编程为“0000”。若熔丝位CKOPT也被编程,用户就可以使用内部的XTAL1和 GND 之间的36 pF 电容。
选择了这个振荡器之后,启动时间由熔丝位 SUT 确定,如 Table 16 所示。
2.ATmega128 标定的片内RC振荡器
标定的片内RC 振荡器提供了固定的1.0、2.0、4.0 或8.0 MHz 的时钟。这些频率都是 5V、25°C下的标称数值。这个时钟也可以作为系统时钟,只要按照Table 13 对熔丝位 CKSEL进行编程即可。
选择这个时钟(此时不能对CKOPT进行编程)之后就无需外部器件 了。复位时硬件将标定字节加载到OSCCAL 寄存器,自动完成对RC 振荡器的标定。在 5V, 25°C 和频率为1.0 MHz 时,这种标定可以提供标称频率 ± 3% 的精度;当 使用这个振荡器作为系统时钟时,看门狗仍然使用自己的看门狗定时器作为溢出复位的 依据。更多的有关标定数据的信息请参见P 270“ 标定字节” 。
选择了这个振荡器之后,启动时间由熔丝位SUT 确定,如Table 14 所示。XTAL1 和 XTAL2 要保持为空(NC)。
振荡器标定寄存器- OSCCAL
• Bits 7..0 – CAL7..0:振荡器标定数据
将标定数据写入这个地址可以对内部振荡器进行调节以消除由于生产工艺所带来的振荡器频率偏差。复位时 1 MHz 的标定数据 ( 标识数据的高字节,地址为 0x00) 自动加载到OSCCAL 寄存器。如果需要内部 RC 振荡器工作于其他频率,标定数据必须人工加载:首先通过编程器读取标识数据,然后将标定数据保存到 Flash 或 EEPROM 之中。这些数据可以通过软件读取,然后加载到 OSCCAL 寄存器。当 OSCCAL 为零时振荡器以最低频率工作。当对其写如不为零的数据时内部振荡器的频率将增长。写入 $FF 即得到最高频率。标定的振荡器用来为访问 EEPROM 和 Flash 定时。有写 EEPROM 和 Flash 的操作时不要将频率标定到超过标称频率的 10%,否则写操作有可能失败。要注意振荡器只对1.0、2.0、4.0 和 8.0 MHz 这四种频率进行了标定,其他频率则无法保证,见 Table 15。
3.ATmega128 外部RC振荡器
对于时间不敏感的应用可以使用 Figure 20 的外部 RC 振荡器。频率可以通过方程 f =1/(3RC) 进行粗略地估计。电容 C 至少要 22 pF。通过编程熔丝位 CKOPT,用户可以使能XTAL1和GND之间的片内 36 pF电容,从而无需外部电容。若想获取有关振荡器如何工作以及如何选择 R 和 C 的具体信息,请参考外部 RC 振荡器应用手册。
振荡器可以工作于四个不同的模式,每个模式有自己的优化频率范围。工作模式通过熔丝位 CKSEL3..0 选取,如 Table 11 所示。
4.ATmega128 低频晶体振荡器
为了使用 32.768 kHz 钟表晶体作为器件的时钟源,必须将熔丝位 CKSEL 设置为 “1001”以选择低频晶体振荡器。晶体的连接方式如 Figure 19 所示。通过对熔丝位 CKOPT 的编程,用户可以使能 XTAL1 和 XTAL2 的内部电容,从而去除外部电容。内部电容的标称数值为 36 pF。
选择了这个振荡器之后,启动时间由熔丝位 SUT 确定,如 Table 10 所示。
5.ATmega128 晶体振荡器
XTAL1 和 XTAL2 分别为用作片内振荡器的反向放大器的输入和输出,如 Figure 19 所示。这个振荡器可以使用石英晶体,也可以使用陶瓷谐振器。熔丝位 CKOPT 用来选择这两种放大器模式的其中之一。当 CKOPT 被编程时振荡器在输出引脚产生满幅度的振荡。这种模式适合于噪声环境,以及需要通过 XTAL2 驱动第二个时钟缓冲器的情况。而且这种模式的频率范围比较宽。当保持 CKOPT 为未编程状态时,振荡器的输出信号幅度比较小。其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。
对于谐振器, CKOPT 未编程时的最大频率为 8 MHz, CKOPT 编程时为 16 MHz。C1和 C2 的数值要一样,不管使用的是晶体还是谐振器。最佳的数值与使用的晶体或谐振器有关,还与杂散电容和环境的电磁噪声有关。Table 8 给出了针对晶体选择电容的一些指南。对于陶瓷谐振器,应该使用厂商提供的数值。若想得到更多的有关如何选择电容以及振荡器如何工作的信息,请参考多用途振荡器应用手册。
振荡器可以工作于三种不同的模式,每一种都有一个优化的频率范围。工作模式通过熔丝位 CKSEL3..1 来选择,如 Table 8 所示。
如 Table 9 所示,熔丝位 CKSEL0 以及 SUT1..0 用于选择启动时间。
6.ATmega128 时钟源芯片有如下几种通过熔丝位选择的时钟源。时钟输入到 AVR 时钟发生器,并通往其他合适的模块。
当CPU 自掉电模式或省电模式唤醒之后,被选择的时 钟源用来为启动过程定时,保证振荡器在开始执行指令之前进入稳定状态。当CPU 从复 位开始工作时,还有额外的延迟时间以保证在开始正常工作之前电源达到稳定电平。看门 狗振荡器用来为自己的启动时间定时。看门狗溢出时间所对应的WDT 振荡器周期数列于 Table 7。看门狗振荡器的频率与工作电压有关,具体请参见 P 313“ATmega128 典型特性 ” 。
器件出厂时CKSEL = “0001”, SUT = “10”。该默认时钟源为最长启动时间的内部 RC 振荡器。该默认设置保证所有的用户通过系统内或并行编程得到其需要的时钟源。
7.ATmega128 时钟系统及其分布Figure 18为AVR的主要时钟系统及其分布。这些时钟并不需要同时工作。为了降低功耗,可以通过使用不同的睡眠模式来禁止无需工作的模块的时钟,如 P41“ 电源管理及睡眠模式 ” 所示。
CPU 时钟- clkCPUCPU时钟与操作AVR内核的子系统相连,如通用工作寄存器文件、状态寄存器以及保存堆 栈指针的数据存储器。终止CPU 时钟将使内核停止工作和计算。
I/O 时钟- clkI/OI/O时钟用于主要的I/O 模块,如定时器/ 计数器、SPI 和USART。I/O 时钟还用于外部中断 模块。但是有些外部中断由异步逻辑检测,因此即使I/O 时钟停止了这些中断仍然可以得 到监控。此外,TWI 模块的地址识别功能在没有clkI/O 的情况下也是异步实现的,使得这 个功能在任何睡眠模式下都可以正常工作。
Flash 时钟- clkFLASHFlash 时钟控制Flash 接口的操作。此时钟通常与CPU 时钟是同步的。
异步定时器时钟- clkASY异步定时器时钟允许异步定时器/ 计数器直接由外部32 kHz 时钟晶体驱动,使得此定时器/ 计数器即使在睡眠模式下仍然可以为系统提供一个实时时钟。
ADC 时钟- clkADCADC具有专门的时钟。这样可以在ADC工作的时候停止CPU和I/O时钟以降低数字电路产生的噪声,从而提高ADC 转换精度。