AVR教程系列一(12):ATmega16 简介(六)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

ATmega16简介(六)ATmega16控制和状态寄存器MCUCSRAVR控制和状态寄存器提供了有关引起AVR复位的复位源的信息。?Bit4–JTRF:JTAG复位标志通过JTAG指令AVR_RESET可以使JTAG复位寄存器置位,并引发MCU复位,并使JTRF置位。上电复位将使其清零,也可以通过写”0”来清除。?Bit3–WDRF:看门狗复位标志看门狗复位发生时置位。上电复位将使其清零,也可以通过写”0”来清除。?Bit2–BORF:掉电检测复位标志掉电检测复位发生时置位。上电复位将使其清零,也可以通过写”0”来清除。?Bit1–EXTRF:外部复位标志外部复位发生时置位。上电复位将使其清零,也可以通过写”0”来清除。?Bit0–PORF:上电复位标志上电复位发生时置位。只能通过写”0”来清除。为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复位。如果在其他复位发生之前将此寄存器复位,则后续复位源可以通过检查复位标志来了解。ATmega16基准电压使能信号和启动时间ATmega16具有片内能隙基准源,用于掉电检测,或者是作为模拟比较器或ADC的输入。ADC的2.56V基准电压由此片内能隙基准源产生。电压基准的启动时间可能影响其工作方式。启动时间列于Table16。为了降低功耗,可以控制基准源仅在如下情况打开:1.BOD使能(熔丝位BODEN被编程)2.能隙基准源连接到模拟比较器(ACSR寄存器的ACBG置位)3.ADC使能因此,当BOD被禁止时,置位ACBG或使能ADC后要启动基准源。为了降低掉电模式的功耗,用户可以禁止上述三种条件,并在进入掉电模式之前关闭基准源。ATmega16看门狗定时器看门狗定时器由独立的1Mhz片内振荡器驱动。这是VCC=5V时的典型值。请参见特性数据以了解其他VCC电平下的典型值。通过设置看门狗定时器的预分频器可以调节看门狗复位的时间间隔,如P41Table17所示。看门狗复位指令WDR用来复位看门狗定时器。此外,禁止看门狗定时器或发生复位时定时器也被复位。复位时间有8个选项。如果没有及时复位定时器,一旦时间超过复位周期,ATmega16就复位,并执行复位向量指向的程序。具体的看门狗复位时序在P39有说明。为了防止无意之间禁止看门狗定时器,在看门狗禁用后必须跟一个特定的修改序列。详见看门狗定时器控制寄存器。看门狗定时器控制寄存器-WDTCR?Bits7..5–Res:保留位ATmega16保留位,读操作返回值为零。?Bit4–WDTOE:看门狗修改使能清零WDE时必须置位WDTOE,否则不能禁止看门狗。一旦置位,硬件将在紧接的4个时钟周期之后将其清零。请参考有关WDE的说明来禁止看门狗。?Bit3–WDE:使能看门狗WDE为1“时,看门狗使能,否则看门狗将被禁止。只有在WDTOE为1“时WDE才能清零。以下为关闭看门狗的步骤:1.在同一个指令内对WDTOE和WDE写1“,即使WDE已经为1“2.在紧接的4个时钟周期之内对WDE写0”?Bits2..0–WDP2,WDP1,WDP0:看门狗定时器预分频器2,1和0WDP2、WDP1和WDP0决定看门狗定时器的预分频器,如Table17所示。下面的例子分别用汇编和C语言实现了关闭WDT的操作。在此假定中断处于用户控制之下(比如禁止全局中断),因而在执行下面程序时中断不会发生。汇编代码例程WDT_off:;WDT复位WDR;置位WDTOE和WDEinr16,WDTCRorir16,(1WDTOE)|(1WDE)outWDTCR,r16;关闭WDTldir16,(0WDE)outWDTCR,r16retC代码例程voidWDT_off(void){/*WDT复位*/_WDR();/*置位WDTOE和WDE*/WDTCR|=(1WDTOE)|(1WDE);/*关闭WDT*/WDTCR=0x00;}ATmega16中断向量本节描述ATmega16的中断处理。Table19给出了不同的BOOTRST/IVSEL设置下的复位和中断向量的位置。如果程序永远不使能中断,中断向量就没有意义。用户可以在此直接写程序。同样,如果复位向量位于应用区,而其他中断向量位于Boot区,则复位向量之后可以直接写程序。反过来亦是如此。ATmega16典型的复位和中断设置如下:地址符号代码说明$000jmpRESET;复位中断向量$002jmpEXT_INT0;IRQ0中断向量$004jmpEXT_INT1;IRQ1中断向量$006jmpTIM2_COMP;Timer2比较中断向量$008jmpTIM2_OVF;Timer2溢出中断向量$00AjmpTIM1_CAPT;Timer1捕捉中断向量$00CjmpTIM1_COMPA;Timer1比较A中断向量$00EjmpTIM1_COMPB;Timer1比较B中断向量$010jmpTIM1_OVF;Timer1溢出中断向量$012jmpTIM0_OVF;Timer0溢出中断向量$014jmpSPI_STC;SPI传输结束中断向量$016jmpUSART_RXC;USARTRX结束中断向量$018jmpUSART_UDRE;UDR空中断向量$01AjmpUSART_TXC;USARTTX结束中断向量$01CjmpADC;ADC转换结束中断向量$01EjmpEE_RDY;EEPROM就绪中断向量$020jmpANA_COMP;模拟比较器中断向量$022jmpTWSI;两线串行接口中断向量$024jmpEXT_INT2;IRQ2中断向量$026jmpTIM0_COMP;定时器0比较中断向量$028jmpSPM_RDY;SPM就绪中断向量;$02ARESET:ldir16,high(RAMEND);主程序$02BoutSPH,r16;设置堆栈指针为RAM的顶部$02Cldir16,low(RAMEND)$02DoutSPL,r16$02Esei;使能中断$02Finstrxxx.........当熔丝位BOOTRST未编程,Boot区为2K字节,且寄存器GICR的IVSEL置位时,典型的复位和中断设置如下:地址符号代码说明$000RESET:ldir16,high(RAMEND);主程序$001outSPH,r16;设置堆栈指针为RAM的顶部$002ldir16,low(RAMEND)$003outSPL,r16$004sei;使能中断$005instrxxx;.org$1C02$1C02jmpEXT_INT0;IRQ0中断向量$1C04jmpEXT_INT1;IRQ1中断向量.........;$1C28jmpSPM_RDY;SPM就绪中断向量当熔丝位BOOTRST已编程,且Boot区为2K字节时,典型的复位和中断设置如下:地址符号代码说明.org$002$002jmpEXT_INT0;IRQ0中断向量$004jmpEXT_INT1;IRQ1中断向量.........;$028jmpSPM_RDY;SPM就绪中断向量;.org$1C00$1C00RESET:ldir16,high(RAMEND);主程序$1C01outSPH,r16;设置堆栈指针为RAM的顶部$1C02ldir16,low(RAMEND)$1C03outSPL,r16$1C04sei;使能中断$1C05instrxxx当熔丝位BOOTRST已编程,Boot区为2K字节,且寄存器GICR的IVSEL置位时,典型的复位和中断设置如下:地址符号代码说明.org$1C00$1C00jmpRESET;Reset中断向量$1C02jmpEXT_INT0;IRQ0中断向量$1C04jmpEXT_INT1;IRQ1中断向量.........;$1C28jmpSPM_RDY;SPM就绪中断向量;$1C2ARESET:ldir16,high(RAMEND);主程序$1C2BoutSPH,r16;设置堆栈指针为RAM的顶部$1C2Cldir16,low(RAMEND)$1C2DoutSPL,r16$1C2Esei;使能中断$1C2Finstrxxx在应用区和Boot区之间移动中断向量通用中断控制寄存器决定中断向量表的放置地址通用中断控制寄存器-GICR?Bit1–IVSEL:中断向量选择当IVSEL为0“时,中断向量位于Flash存储器的起始地址;当IVSEL为1“时,中断向量转移到Boot区的起始地址。实际的Boot区起始地址由熔丝位BOOTSZ确定。具体请参考P234“支持引导装入程序–在写的同时可以读(RWW,Read-While-Write)的自我编程能力”。为了防止无意识地改变中断向量表,修改IVSEL时需要遵照如下过程:1.置位中断向量修改使能位IVCE2.在紧接的4个时钟周期里将需要的数据写入IVSEL,同时对IVCE写”0”执行上述序列时中断自动被禁止。其实,在置位IVCE时中断就被禁止了,并一直保持到写IVSEL操作之后的下一条语句。如果没有IVSEL写操作,则中断在置位IVCE之后的4个时钟周期保持禁止。需要注意的是,虽然中断被自动禁止,但状态寄存器的位I的值并不受此操作的影响。Note:若中断向量位于Boot区,且Boot锁定位BLB02被编程,则执行应用区的程序时中断被禁止;若中断向量位于应用区,且Boot锁定位BLB12被编程,则执行Boot区的程序时中断被禁止。有关Boot锁定位的细节请参见P234“支持引导装入程序–在写的同时可以读(RWW,Read-While-Write)的自我编程能力”。?Bit0–IVCE:中断向量修改使能改变IVSEL时IVCE必须置位。在IVCE或IVSEL写操作之后4个时钟周期,IVCE被硬件清零。如前面所述,置位IVCE将禁止中断。代码如下:汇编代码例程:Move_interrupts:;使能中断向量的修改ldir16,(1IVCE)outGICR,r16;将中断向量转移到boot区ldir16,(1IVSEL)outGICR,r16retC代码例程voidMove_interrupts(void){/*使能中断向量的修改*/GICR=(1IVCE);/*将中断向量转移到boot区*/GICR=(1IVSEL);}ATmega16通用中断控制寄存器GICR?Bit1–IVSEL:中断向量选择当IVSEL为0“时,中断向量位于Flash存储器的起始地址;当IVSEL为1“时,中断向量转移到Boot区的起始地址。实际的Boot区起始地址由熔丝位BOOTSZ确定。具体请参考P234“支持引导装入程序–在写的同时可以读(RWW,Read-While-Write)的自我编程能力”。为了防止无意识地改变中断向量表,修改IVSEL时需要遵照如下过程:1.置位中断向量修改使能位IVCE2.在紧接的4个时钟周期里将需要的数据写入IVSEL,同时对IVCE写”0”执行上述序列时中断自动被禁止。其实,在置位IVCE时中断就被禁止了,并一直保持到写IVSEL操作之后的下一条语句。如果没有IVSEL写操作,则中断在置位IVCE之后的4个时钟周期保持禁止。需要注意的是,虽然中断被自动禁止,但状态寄存器的位I的值并不受此操作的影响。Note:若中断向量位于Boot区,且Boot锁定位BLB02被编程,则执行应用区的程序时中断被禁止;若中断向量位于应用区,且Boot锁定位BLB12被编程,则执行Boot区的程序时中断被禁止。有关Boot锁定位的细节请参见P234“支持引导装入程序–在写的同时可以读(RWW,Read-While-Write)的自我编程能力”。?Bit0–IVCE:中断向量修改使能改变IVSEL时IVCE必须置位。在IVCE或IVSEL写操作之后4个时钟周期,IVCE被硬件清零。如前面所述,置位IVCE将禁止中断。代码如下:汇编代码例程:Move_interrupts:;使能中断向量的修改ldir16,(1IVCE)outGICR,r16;将中断向量转移到

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功