历史上的今天
今天是:2024年11月02日(星期六)
2021年11月02日 | ATmega128 复位与中断处理
2021-11-02 来源:eefocus
AVR有不同的中断源。每个中断和复位在程序空间都有一个独立的中断向量。所有的中断 事件都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位I 也置位的情况 下,中断可以发生。根据不同的程序计数器PC 数值,在引导锁定位BLB02 或BLB12 被 编程的情况下,中断可能自动禁止。这个特性提高了软件的安全性。具体请参见 P 267“ 存储器编程” 。
程序存储器空间的最低地址缺省定义为复位和中断向量。完全的向量列表请参见 P 55“ 中 断” 。列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具 有最高的优先级,下一个则为INT0 – 外部中断请求0。通过置位MCU 控制寄存器 (MCUCR)的IVSEL,中断向量可以移至引导Flash的起始处P 55“中断” 一节有详细说明。 编程熔丝位BOOTRST 可以将复位向量也移至引导Flash 的起始处。具体可参见 P 255“ 支持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。
当中断发生时全局中断使能位I 被清零,所有的中断都被禁止。用户软件可以通过置位位 I 来使能中断嵌套。此时所有的中断都可以中断当前中断。执行RETI 指令后I 自动置位。
从根本上说有两种类型的中断。第一种由事件触发并置位中断标志。对于这些中断,程序 计数器跳转到实际的中断向量以执行中断处理例程,同时硬件将清除相应的中断标志。中 断标志也可以通过对其写”1” 来清除。当中断发生后,如果相应的中断使能位为”0”,则中 断标志位置位,并一直保持到中断执行,或者被软件清除。类似的,如果全局中断标志被 清零,则所有以发生的中断都不会被执行,直到I 置位。然后被挂起的各个中断按中断优 先级依次执行。
第二种类型的中断则是只要中断条件满足,就会一直触发。这些中断不需要中断标志。若 中断条件在中断使能之前就消失了,则中断不会被触发。
AVR 退出中断后总是回到主程序并执行一条指令才可以去执行其他被挂起的中断。
进入中断例程时状态寄存器不会自动保存;中断返回时也不会自动恢复。这些工作必须 由软件来完成。
使用CLI 指令来禁止中断时,中断立即禁止。没有中断可以在执行CLI 指令后发生,即使 它是在执行CLI 的同时发生的。下面的例子说明了如何在写EEPROM 时使用这个指令来 防止中断发生。
| 汇编代码例程 |
| in r16, SREG ; 保存SREG cli ; 禁止中断 sbi EECR, EEMWE ; 启动 EEPROM 写操作 sbi EECR, EEWE out SREG, r16 ; 恢复 SREG (I-bit) |
| C 代码例程 |
| char cSREG; cSREG = SREG; /* 保存 SREG */ /* 禁止中断 */ _CLI(); EECR |= (1< |
使用SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前先执行。
| 汇编代码例程 |
| sei ; 置位全局中断使能标志 sleep ; 进入睡眠模式,等待中断发生 ; 注意: 在执行任何被挂起的中断之前首先进入睡眠模式 |
| C 代码例程 |
| _SEI(); /* 置位全局中断使能标志 */ _SLEEP(); /* 进入睡眠模式,等待中断发生 */ /* 注意: 在执行任何被挂起的中断之前首先进入睡眠模式 */ |
中断响应时间
AVR 中断响应时间最少为4 个时钟周期。4 个时钟周期后,程序跳转到实际的中断处理例程。在这4 个时钟期间, PC 自动入栈。在通常情况下,中断向量为一个跳转指令,此跳转要花3 个时钟周期。如果中断在一个多周期指令执行期间发生,则在此多周期指令执行完后MCU 才会执行中断程序。若中断发生时MCU 处于睡眠模式,中断响应时间增加到8 个时钟周期。增加的时钟周期是由于唤醒启动时间引入的。
中断返回需要4 个时钟。在此期间PC( 两个字节) 将被弹出栈,堆栈指针加二,状态寄存 器SREG 的I 置位。
下一篇:ATmega128 指令执行时序
史海拾趣
|
我是一只菜鸟。遇到一个问题,烦请大侠帮忙解决。有一个喷墨墨盒,上有一芯片,记录打印次数,如果超过限制,就不让使用,想解开此芯片,把新墨盒的数据写到老墨盒上,在灌上代用墨汁,就不用买原装的了。本菜鸟在很偏僻的树林(沈阳)没有找到办法 ...… 查看全部问答> |
|
产品设计的可测试性(De sign For Testability. OFT) 也是产品可制造性的主要内容从生产角度考虑也是设计的工艺性之一.它是指在设计时考虑产品性能能够检测的难易程度,也就是说设计产品时应考虑如何以最简单的方法对产品的性能和加工质量进行检测, ...… 查看全部问答> |
|
DEBUGMSG(ZONE_TRACE, (TEXT("XXXX\r\n")));这样的语句在驱动里面怎么打印到调试串口? DEBUGMSG(ZONE_TRACE, (TEXT(\"XXXX\\r\\n\")));这样的语句在驱动里面怎么打印到调试串口? … 查看全部问答> |
|
近期对嵌入式系统开发很有兴趣,像微软的WM,谷歌的android,苹果的iphone OS 本身我学习计算机语言就是想涉足计算机系统开发,但是开始学了C#,被微软的VS小黑盒子式编程给洗脑了...感觉编程好像比画图还简单!好想学了C#跟没学似地, 所以现在觉 ...… 查看全部问答> |
|
程序的目的是把采集的温度通过串口显示,现在做的程度是我把硬件连接好后,用MSP430仿真器查看温湿度的数值不正确,比如humi_val.i用quick watch查看value为62850这样的数据,单片机的txd用示波器观察没有波形,可能程序存在很大问题,现在比 ...… 查看全部问答> |
|
我把所有的程序都只注释掉了,只留IO初始化,SD16_A初始化,和一些延时子程序。 一运行到SD16_A初始化完成 中断允许后 单片机就复位了。这是什么情况 坐等高人解惑~~~~… 查看全部问答> |
|
BB Black 入门基础之Eclipse C++ 控制LED灯(中) 本帖最后由 lonerzf 于 2014-1-13 10:57 编辑 接着上一篇。之前的地方设置是有问题的,先不讲可能是哪,大家帮忙给查个错呗。谢谢啦{:soso_e100:} 补充下,如果用 SSH Only方式进行远程部署,则在某些情况下方便得多。 还是在编译好之后选择绿 ...… 查看全部问答> |




