立即注册 找回密码

微雪课堂

搜索
微雪课堂 AVR AVR单片机内核剖析 ATmega32 查看内容

ATmega32 中断向量

2015-5-27 23:47| 发布者: kaloha| 查看: 3446| 评论: 0

摘要: 本节描述ATmega32的中断处理。更一般的AVR中断处理请参见P11“复位与中断处理” 。(点击图片放大)Notes:1. 熔丝位BOOTRST被编程时,MCU复位后程序跳转到Boot Loader。请参见 P228 “支 持引导装入程序 – 在写的同 ...

本节描述ATmega32的中断处理。更一般的AVR中断处理请参见P11“复位与中断处理” 。

mega32 复位和中断向量
(点击图片放大)

Notes: 
1. 熔丝位BOOTRST被编程时,MCU复位后程序跳转到Boot Loader。请参见 P228 “支 持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write)的自我编程能力 ” 。
2. 当寄存器GICR的IVSEL置位时,中断向量转移到Boot区的起始地址。此时各个中断向 量的实际地址为表中地址与Boot 区起始地址之和。

Table 19给出了不同的BOOTRST/IVSEL设置下的复位和中断向量的位置。如果程序永远不使能中断,中断向量就没有意义。用户可以在此直接写程序。同样,如果复位向量位于应用区,而其他中断向量位于Boot 区,则复位向量之后可以直接写程序。反过来亦是如此。

mega32 复位和中断向量位置的确定

ATmega32 典型的复位和中断设置如下:
地址 符号代码说明
$000 jmp RESET ; 复位中断向量
$002 jmp EXT_INT0 ; IRQ0 中断向量
$004 jmp EXT_INT1 ; IRQ1 中断向量
$006 jmp TIM2_COMP ; Timer2 比较中断向量
$008 jmp TIM2_OVF ; Timer2 溢出中断向量
$00A jmp TIM1_CAPT ; Timer1 捕捉中断向量
$00C jmp TIM1_COMPA ; Timer1 比较A 中断向量
$00E jmp TIM1_COMPB ; Timer1 比较B 中断向量
$010 jmp TIM1_OVF ; Timer1 溢出中断向量
$012 jmp TIM0_OVF ; Timer0 溢出中断向量
$014 jmp SPI_STC ; SPI 传输结束中断向量
$016 jmp USART_RXC ; USART RX 结束中断向量
$018 jmp USART_UDRE ; UDR 空中断向量
$01A jmp USART_TXC ; USART TX 结束中断向量
$01C jmp ADC ; ADC 转换结束中断向量
$01E jmp EE_RDY ; EEPROM 就绪中断向量
$020 jmp ANA_COMP ; 模拟比较器中断向量
$022 jmp TWSI ; 两线串行接口中断向量
$024 jmp EXT_INT2 ; IRQ2 中断向量
$026 jmp TIM0_COMP ; 定时器0 比较中断向量
$028 jmp SPM_RDY ; SPM 就绪中断向量
;
$02A RESET: ldi r16,high(RAMEND) ; 主程序
$02B out SPH,r16 ; 设置堆栈指针为RAM 的顶部
$02C ldi r16,low(RAMEND)
$02D out SPL,r16
$02E sei ; 使能中断
$02F <instr> xxx
... ... ...

当熔丝位BOOTRST 未编程,Boot 区为 4K 字节,且寄存器GICR 的IVSEL 置位时,典
型的复位和中断设置如下:
地址符号代码说明
$000 RESET: ldi r16,high(RAMEND) ; 主程序
$001 out SPH,r16 ; 设置堆栈指针为RAM 的顶部
$002 ldi r16,low(RAMEND)
$003 out SPL,r16
$004 sei ; 使能中断
$005 <instr> xxx
;
.org $3802
$3802 jmp EXT_INT0 ; IRQ0 中断向量
$3804 jmp EXT_INT1 ; IRQ1 中断向量
... .... .. ;
$3828 jmp SPM_RDY ; SPM 就绪中断向量
当熔丝位BOOTRST 已编程,且Boot 区为 4K 字节时,典型的复位和中断设置如下:
地址符号代码说明
.org $002
$002 jmp EXT_INT0 ; IRQ0 中断向量
$004 jmp EXT_INT1 ; IRQ1 中断向量
... .... .. ;
$028 jmp SPM_RDY ; SPM 就绪中断向量
;
.org $3800
$3800 RESET: ldi r16,high(RAMEND) ; 主程序
$3801 out SPH,r16 ; 设置堆栈指针为RAM 的顶部
$3802 ldi r16,low(RAMEND)
$3803 out SPL,r16
$3804 sei ; 使能中断
$3805 <instr> xxx

当熔丝位BOOTRST 已编程,Boot 区为4K 字节,且寄存器GICR 的IVSEL 置位时,典
型的复位和中断设置如下:
地址符号代码说明
.org $3800
$3800 jmp RESET ; Reset 中断向量
$3802 jmp EXT_INT0 ; IRQ0 中断向量
$3804 jmp EXT_INT1 ; IRQ1 中断向量
... .... .. ;
$3828 jmp SPM_RDY ; SPM 就绪中断向量
;
$382A RESET: ldi r16,high(RAMEND) ; 主程序
$382B out SPH,r16 ; 设置堆栈指针为RAM 的顶部
$382C ldi r16,low(RAMEND)
$382D out SPL,r16
$382E sei ; 使能中断
$382F <instr> xxx

在应用区和Boot 区之间移动中断向量 

通用中断控制寄存器决定中断向量表的放置地址

通用中断控制寄存器- GICR

mega32 通用中断控制寄存器GICR

· Bit 1 – IVSEL: 中断向量选择
当IVSEL 为"0" 时,中断向量位于Flash 存储器的起始地址;当IVSEL 为"1" 时,中断向量转移到Boot 区的起始地址。实际的Boot 区起始地址由熔丝位BOOTSZ 确定。具体请参考P234“ 支持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。 为了防止无意识地改变中断向量表,修改IVSEL 时需要遵照如下过程:
1. 置位中断向量修改使能位IVCE
2. 在紧接的4 个时钟周期里将需要的数据写入IVSEL,同时对IVCE 写”0”
执行上述序列时中断自动被禁止。其实,在置位IVCE 时中断就被禁止了,并一直保持到写IVSEL 操作之后的下一条语句。如果没有IVSEL 写操作,则中断在置位IVCE 之后的4 个时钟周期保持禁止。需要注意的是,虽然中断被自动禁止,但状态寄存器的位I 的值并不受此操作的影响。
Note: 若中断向量位于Boot区,且Boot锁定位BLB02被编程,则执行应用区的程序时中断被禁止;若中断向量位于应用区,且Boot 锁定位BLB12 被编程, 则执行Boot 区的程序时中断被禁止。有关Boot 锁定位的细节请参见P228“ 支持引导装入程序 – 在写的同时可以读
(RWW, Read-While-Write) 的自我编程能力” 。

· Bit 0 – IVCE: 中断向量修改使能
改变IVSEL 时IVCE 必须置位。在IVCE 或IVSEL 写操作之后4 个时钟周期, IVCE 被硬件清零。如前面所述,置位IVCE 将禁止中断。代码如下:

汇编代码例程:
Move_interrupts:
; 使能中断向量的修改
ldi r16, (1<<IVCE)
out GICR, r16
; 将中断向量转移到boot Flash区
ldi r16, (1<<IVSEL)
out GICR, r16
ret
C 代码例程
void Move_interrupts(void)
{
/* 使能中断向量的修改*/
GICR = (1<<IVCE);
/* 将中断向量转移到boot Flash区 */
GICR = (1<<IVSEL);
}


以上资料参考马潮老师的中文手册,由微雪电子整理并发布,转载请注明出处:www.waveshare.net,否则追究相应责任!


262

顶一下

刚表态过的朋友 (262 人)

最新评论

所有教程
    01ATmega32 简介
    ATmega32是基于增强的AVRRISC结构的低功耗8位CMOS微控制器。由于其先进的指 令集以及
    02ATmega32 引脚功能
    引脚名称ATmega32引脚功能说明VCC电源正GND电源地端口A(PA7..PA0)端口A 做为A/D 转换
    03ATmega32 内核介绍
    本节从总体上讨论ATMEGA32 AVR 内核的结构。CPU 的主要任务是保证程序的正确执行。因
    04ATmega32 ALU
    ALU- 算术逻辑单元AVR ALU 与32 个通用工作寄存器直接相连。寄存器与寄存器之间、寄存
    05ATmega32 状态寄存器
    状态寄存器包含了最近执行的算术指令的结果信息。这些信息可以用来改变程序流程以实现
    06ATmega32 通用寄存器
    文件寄存器文件针对AVR增强型RISC指令集做了优化。为了获得需要的性能和灵活性,寄存
    07ATmega32 堆栈指针
    堆栈指针主要用来保存临时数据、局部变量和中断/ 子程序的返回地址。堆栈指针总是指向
    08ATmega32 指令执行时序
    这一节介绍指令执行过程中的访问时序。AVR CPU 由系统时钟clkCPU 驱动。此时钟直接来
    09ATmega32 复位与中断处理
    AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件都
    010ATmega32 Flash程序存储器
    系统内可编程的Flash 程序存储器ATmega32具有32K字节的在线编程Flash,用于存放程序指
    011ATmega32 SRAM数据存储器
    SRAM数据存储器Figure 9 给出了ATmega32 SRAM 空间的组织结构。前2144 个数据存储器包
    012ATmega32 EEPROM数据存储器
    ATmega32包含1024 字节的EEPROM数据存储器。它是作为一个独立的数据空间而存在 的,可
    013ATmega32 I/O存储器
    ATmega32 的I/O 空间定义见 P283“ 寄存器概述” 。ATmega32所有的I/O及外设都被放置
    014ATmega32 时钟系统及其分布
    时钟系统及其分布Figure 11为AVR的主要时钟系统及其分布。这些时钟并不需要同时工作。
    015ATmega32 时钟源
    ATmega32芯片有如下几种通过Flash熔丝位进行选择的时钟源。时钟输入到AVR时钟发生器,
    016ATmega32 晶体振荡器
    XTAL1 与XTAL2 分别为用作片内振荡器的反向放大器的输入和输出,如Figure 12 所示,这
    017ATmega32 低频晶体振荡器
    为了使用32.768 kHz 钟表晶体作为器件的时钟源,必须将熔丝位CKSEL 设置为“1001”以
    018ATmega32 外部RC振荡器
    AVR对于时间不敏感的应用可以使用Figure 13 的外部RC 振荡器。频率可以通过方程f =1/(
    019ATmega32 标定的片内RC振荡器
    标定的片内RC振荡器提供了固定的1.0、2.0、4.0 或8.0 MHz 的时钟。这些频率都是5V、25
    020ATmega32 外部时钟
    AVR为了从外部时钟源驱动芯片, XTAL1 必须如Figure 14 所示的进行连接。同时,熔丝位
    021ATmega32 定时器/计时器振荡器
    对于拥有定时器/ 振荡器引脚(TOSC1 和TOSC2) 的AVR 微处理器,晶体可以直接与这两个引
    022ATmega32 MCU控制寄存器MCUCR
    MCU 控制寄存器包含了电源管理的控制位。· Bit7– SE: 休眠使能:为了使 MCU 在执行 S
    023ATmega32 空闲模式
    当SM2..0 为000 时, SLEEP 指令将使MCU 进入空闲模式。在此模式下,CPU 停止运行,而
    024ATmega32 ADC噪声抑制模式
    当SM2..0 为001 时, SLEEP 指令将使MCU 进入噪声抑制模式。在此模式下,CPU 停止运行
    025ATmega32 掉电模式
    当SM2..0 为010 时, SLEEP 指令将使MCU 进入掉电模式。在此模式下,外部晶体停振,而
    026ATmega32 省电模式
    当SM2..0 为011 时, SLEEP 指令将使MCU 进入省电模式。这一模式与掉电模式只有一点不
    027ATmega32 Standby模式
    Standby 模式当SM2..0 为110 时, SLEEP 指令将使MCU 进入Standby 模式。这一模式与掉
    028ATmega32 减少功耗的方法
    试图降低AVR 控制系统的功耗时需要考虑几个问题。一般来说,要尽可能利用睡眠模式,并
    029ATmega32 复位源
    复位AVRAVR复位时所有的I/O 寄存器都被设置为初始值,程序从复位向量处开始执行。复位
    030ATmega32 上电复位
    ATmega32 上电复位(POR) 脉冲由片内检测电路产生。检测电平请参见 Table 15。 无论何
    031ATmega32 外部复位
    外部复位由外加于RESET 引脚的低电平产生。当复位低电平持续时间大于最小脉冲宽度时(
    032ATmega32 掉电检测
    ATmega32 具有片内BOD(Brown-out Detection) 电路,通过与固定的触发电平的对比来检测
    033ATmega32 看门狗复位
    ATmega32 看门狗定时器溢出时将产生持续时间为1 个CK 周期的复位脉冲。在脉冲的下降沿
    034ATmega32 控制和状态寄存器MCUCSR
    AVR 控制和状态寄存器提供了有关引起AVR复位的复位源的信息。· Bit 4 – JTRF: JTAG
    035ATmega32 基准电压使能信号和启动时间
    ATmega32 具有片内能隙基准源,用于掉电检测,或者是作为模拟比较器或ADC的输入。ADC
    036ATmega32 看门狗定时器
    AVR 看门狗定时器由独立的 1 Mhz 片内振荡器驱动。这是 VCC = 5V时的典型值。请参见特
    037ATmega32 中断向量
    本节描述ATmega32的中断处理。更一般的AVR中断处理请参见P11“复位与中断处理” 。(
    038ATmega32 通用中断控制寄存器GICR
    · Bit 1 – IVSEL: 中断向量选择当IVSEL 为"0" 时,中断向量位于Flash 存储器的起始
    039ATmega32 熔丝位
    ATmega32 有两个熔丝位字节。Table 105 - Table 106 简单地描述了所有熔丝位的功能以
    040ATmega32 USART的初始化
    ATmega32 在进行通信之前首先要对 USART 进行初始化。初始化过程通常包括波特率的设定
内核剖析
    01Atmega16
    深入剖析Atmega16芯片内核
    02Atmega48
    深入剖析Atmega48芯片内核
    03ATmega8
    深入剖析ATmega8芯片内核
    04ATmega128
    深入剖析ATmega128芯片内核
    05ATmega64
    深入剖析ATmega64芯片内核
    06ATmega32
    深入剖析ATmega32芯片内核
    07ATmega168
    深入剖析ATmega168芯片内核
    08ATtiny13
    深入剖析ATtiny13芯片内核
    09ATmega88
    深入剖析ATmega88芯片内核
    010ATtiny2313
    深入剖析ATtiny2313芯片内核
AVR

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-12-26 18:04 , Processed in 0.029353 second(s), 20 queries .

返回顶部