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


(点击图片放大)

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

ATmega16 典型的复位和中断设置如下:
地址 符号代码说明
$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 xxx
... ... ...

当熔丝位BOOTRST 未编程,Boot 区为 2K 字节,且寄存器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 xxx
;
.org $1C02
$1C02 jmp EXT_INT0 ; IRQ0 中断向量
$1C04 jmp EXT_INT1 ; IRQ1 中断向量
... .... .. ;
$1C28 jmp SPM_RDY ; SPM 就绪中断向量
当熔丝位BOOTRST 已编程,且Boot 区为 2K 字节时,典型的复位和中断设置如下:
地址符号代码说明
.org $002
$002 jmp EXT_INT0 ; IRQ0 中断向量
$004 jmp EXT_INT1 ; IRQ1 中断向量
... .... .. ;
$028 jmp SPM_RDY ; SPM 就绪中断向量
;
.org $1C00
$1C00 RESET: ldi r16,high(RAMEND) ; 主程序
$1C01 out SPH,r16 ; 设置堆栈指针为RAM 的顶部
$1C02 ldi r16,low(RAMEND)
$1C03 out SPL,r16
$1C04 sei ; 使能中断
$1C05 xxx

当熔丝位BOOTRST 已编程,Boot 区为2K 字节,且寄存器GICR 的IVSEL 置位时,典
型的复位和中断设置如下:
地址符号代码说明
.org $1C00
$1C00 jmp RESET ; Reset 中断向量
$1C02 jmp EXT_INT0 ; IRQ0 中断向量
$1C04 jmp EXT_INT1 ; IRQ1 中断向量
... .... .. ;
$1C28 jmp SPM_RDY ; SPM 就绪中断向量
;
$1C2A RESET: ldi r16,high(RAMEND) ; 主程序
$1C2B out SPH,r16 ; 设置堆栈指针为RAM 的顶部
$1C2C ldi r16,low(RAMEND)
$1C2D out SPL,r16
$1C2E sei ; 使能中断
$1C2F xxx

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

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

通用中断控制寄存器- 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 锁定位的细节请参见P234“ 支持引导装入程序 – 在写的同时可以读
(RWW, Read-While-Write) 的自我编程能力” 。

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

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


关键字:ATmega16  中断向量  中断处理 引用地址:ATmega16 中断向量

上一篇:ATmega16 通用中断控制寄存器GICR
下一篇:ATmega16 看门狗定时器

推荐阅读

云计算、大数据、物联网、移动互联网、人工智能等新一代信息技术快速演进,硬件、软件、服务等核心技术体系加速重构,正在引发电子信息产业新一轮变革。单点技术和单一产品的创新正加速向多技术融合互动的系统化、集成化创新转变,创新周期大幅缩短。信息技术与制造、材料、能源、生物等技术的交叉渗透日益深化,智能控制、智能材料、生物芯片等交叉融合创...
10月18日,全新单墨水屏新机海信阅读手机A5在京东开启预约,目前京东近公布了其正面外观,预约人数276人,新机将于10月23日在人民日报社正式发布。  信阅读手机A5早在IFA展会上正式亮相,其硬件基于海信原有A系列产品,不过最大特点是搭载了一块(且仅有一块)电子墨水屏,恰如手机版Kindle。  实际体验上,从现场体验视频来看,其墨水屏刷新速...
北京时间本周二凌晨,苹果公司正式推出了旗下2020年年度旗舰机型iPhone 12系列。该系列手机在发布之前,有不少关于该系列机型采用屏幕品牌的猜测,网传京东方、LG和三星等大厂都有向苹果供货,不过,没有确切的证据能证实上述猜测。  10月16日,据Sammobile发布的消息,iPhone 12全系列产品中,有近四分之三的数量配备了三星品牌生产的显...
10月18日消息,博主@数码闲聊站爆料,MIUI 13改动不小,很多系统界面都有新UX,测试底层依旧有Android 11和Android 12版本,预计年底内测,预装MIUI 13的新机得再等等 。  去年,小米带来了全新一代MIUI 12操作系统,最大的升级点之一是动画和隐私保护。  为了挑战最强动画,MIUI 12从底层技术自研重构,完成了包含动画引擎、渲染引擎...

史海拾趣

问答坊 | AI 解惑

一款专业加密IC DM2016

DM2016是一款专业加密芯片,通过I2C总线与主芯片相连,通过在主程序嵌用加密程序,调用时,从RAM里面随机调用一组数据作为明文,与程序里面的密钥混合产生一组暗文,暗文通过I2C总线传到加密芯片,按反算法与加密芯片中密钥产生明文,与RAM中的明文比较,一 ...…

查看全部问答∨

C8051F0X系列C例程(带注释)

本帖最后由 paulhyde 于 2014-9-15 02:58 编辑 C8051F0X系列C例程(带注释)    …

查看全部问答∨

我重新发一个protues7.12与keil3联调

以前的不知为甚没能上传附件,现在再试一次,方便初学者!…

查看全部问答∨

Symbian和3G的关系

作者:华清远见嵌入式学院 或许是由于近一段时间以来,3G的呼声是一浪高过一浪,或许是因为大家对新一代手机的关注热度节节攀升,也许是在许多文章中,Symbian的出现始终和3G息息相关的缘故,在和许多来华清远见咨询培训课程的朋友交流沟通的过程 ...…

查看全部问答∨

作为电子工程师,你家里有多少是你自己做的东东在用呢?

在做的都是电子工程师,想知道大家在自己家里都设计了些什么?   我先说一下我的东东:   1. 每天中午都要回去吃饭,但是如果回去再煮饭太慢了?如果买一个有预约功能的电饭锅又太贵了,而且的扔掉现在的电饭锅,所以没办法就设计了 ...…

查看全部问答∨

USB Serial KITL的驱动问题

最近在看关于KITL的代码,现在有一点关于USB Serial KITL的疑惑。 在使用USB Serial KITL的时候,底层的数据通道是USB驱动来实现的,这里有个疑问是: 在使用USB Serial KITL时,在PC端是不是也需要开发相应的USB驱动来配合?如果不是,PC端使用U ...…

查看全部问答∨

WinCE里如何打开MIC到CPU的通道?

WinCE里如何打开MIC到CPU的通道?以及如何关闭?…

查看全部问答∨

系统运行某个特定的应用程序变慢

wince运行某个特定应用程序后系统变慢,退出该应用程序后,系统依旧很慢,检查了下内存,退出程序后系统只使用了7M内存,整个系统有40M的内存,请各位朋友帮忙分析一下是什么原因?…

查看全部问答∨

串口通讯中方式3,第九位RB8总是零

如题.    不管是在软件上调试(奇校验),还是在硬件上,RB8总是零.比如我发9,RB8==0,发7也是0    请各位帮帮忙。谢谢 void STR_int(void) interrupt 4         using 2 {     if( ...…

查看全部问答∨

郁闷,创业之路在哪里?

  本人研究生毕业后做了6年的通讯软件开发, 一直在琢磨怎么发财阿?      我的qq : 648119149…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved