ATmega16简介(四)ATmega16时钟系统及其分布时钟系统及其分布Figure11为AVR的主要时钟系统及其分布。这些时钟并不需要同时工作。为了降低功耗,可以通过使用不同的睡眠模式来禁止无需工作的模块的时钟。时钟系统详见Figure11。CPU时钟-clkCPUCPU时钟与操作AVR内核的子系统相连,如通用寄存器文件、状态寄存器及保存堆栈指针的数据存储器。终止CPU时钟将使内核停止工作和计算。I/O时钟-clkI/OI/O时钟用于主要的I/O模块,如定时器/计数器、SPI和USART。I/O时钟还用于外部中断模块。要注意的是有些外部中断由异步逻辑检测,因此即使I/O时钟停止了这些中断仍然可以得到监控。此外,USI模块的起始条件检测在没有clkI/O的情况下也是异步实现的,使得这个功能在任何睡眠模式下都可以正常工作。Flash时钟-clkFLASHFlash时钟控制Flash接口的操作。此时钟通常与CPU时钟同时挂起或激活。异步定时器时钟-clkASY异步定时器时钟允许异步定时器/计数器与LCD控制器直接由外部32kHz时钟晶体驱动。使得此定时器/计数器即使在睡眠模式下仍然可以为系统提供一个实时时钟。ADC时钟-clkADCADC具有专门的时钟。这样可以在ADC工作的时候停止CPU和I/O时钟以降低数字电路产生的噪声,从而提高ADC转换精度。ATmega16时钟源ATmega16芯片有如下几种通过Flash熔丝位进行选择的时钟源。时钟输入到AVR时钟发生器,再分配到相应的模块。不同的时钟选项将在后续部分进行介绍。当CPU自掉电模式或省电模式唤醒之后,被选择的时钟源用来为启动过程定时,保证振荡器在开始执行指令之前进入稳定状态。当CPU从复位开始工作时,还有额外的延迟时间以保证在MCU开始正常工作之前电源达到稳定电平。这个启动时间的定时由看门狗振荡器完成。看门狗溢出时间所对应的WDT振荡器周期数列于Table3。看门狗振荡器的频率由工作电压决定,详见P286“ATmega16典型特性”。缺省时钟源器件出厂时CKSEL=“0010”,SUT=“10”。这个缺省设置的时钟源是1MHz的内部RC振荡器,启动时间为最长。这种设置保证用户可以通过ISP或并行编程器得到所需的时钟源。ATmega16晶体振荡器XTAL1与XTAL2分别为用作片内振荡器的反向放大器的输入和输出,如Figure12所示,这个振荡器可以使用石英晶体,也可以使用陶瓷谐振器。熔丝位CKOPT用来选择这两种放大器模式的其中之一。当CKOPT被编程时振荡器在输出引脚产生满幅度的振荡。这种模式适合于噪声环境,以及需要通过XTAL2驱动第二个时钟缓冲器的情况。而且这种模式的频率范围比较宽。当保持CKOPT为未编程状态时,振荡器的输出信号幅度比较小。其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。对于谐振器,CKOPT未编程时的最大频率为8MHz,CKOPT编程时为16MHz。C1和C2的数值要一样,不管使用的是晶体还是谐振器。最佳的数值与使用的晶体或谐振器有关,还与杂散电容和环境的电磁噪声有关。Table8给出了针对晶体选择电容的一些指南。对于陶瓷谐振器,应该使用厂商提供的数值。若想得到更多的有关如何选择电容以及振荡器如何工作的信息,请参考多用途振荡器应用手册。振荡器可以工作于三种不同的模式,每一种都有一个优化的频率范围。工作模式通过熔丝位CKSEL3..1来选择,如Table4所示。如Table5所示,熔丝位CKSEL0以及SUT1..0用于选择启动时间。Notes:1.这些选项只能用于工作频率不太接近于最大频率,而且启动时的频率稳定性对于应用而言不重要的情况。不适用于晶体。2.这些选项是为陶瓷谐振器设计的,可以保证启动时频率足够稳定。若工作频率不太接近于最大频率,而且启动时的频率稳定性对于应用而言不重要时也适用于晶体。ATmega16低频晶体振荡器为了使用32.768kHz钟表晶体作为器件的时钟源,必须将熔丝位CKSEL设置为“1001”以选择低频晶体振荡器。晶体的连接方式如Figure12所示。通过对熔丝位CKOPT的编程,用户可以使能XTAL1和XTAL2的内部电容,从而去除外部电容。内部电容的标称数值为36pF。选择了这个振荡器之后,启动时间由熔丝位SUT确定,如Table6所示。ATmega16外部RC振荡器对于时间不敏感的应用可以使用Figure13的外部RC振荡器。频率可以通过方程f=1/(3RC)进行粗略地鼓估...