历史上的今天
今天是:2024年10月26日(星期六)
2021年10月26日 | ATmega8 复位与中断处理
2021-10-26 来源:eefocus
AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件 都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位I 也置位时,中断可 以发生。根据程序计数器PC 的不同,在引导锁定位BLB02 或BLB12 被编程的情况下, 中断可能被自动禁止。这个特性提高了软件的安全性。详见 P 209“ 存储器编程” 的描述。
程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见P 43“ 中断” 列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高 的优先级,第二个为INT0 – 外部中断请求0。通过置位通用中断控制寄存器 (GICR) 的 IVSEL,中断向量可以移至引导Flash的起始处,参见P 43“中断” 。编程熔丝位BOOTRST 也可以将复位向量移至引导Flash 的起始处。具体参见P 196“ 支持引导装入程序 -在写 的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。
任一中断发生时全局中断使能位I 被清零,从而禁止了所有其他的中断。用户软件可以在 中断程序里置位I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序。执 行RETI 指令后I 自动置位。
从根本上说有两种类型的中断。第一种由事件触发并置位中断标志。对于这些中断,程序 计数器跳转到实际的中断向量以执行中断处理程序,同时硬件将清除相应的中断标志。中 断标志也可以通过对其写”1” 的方式来清除。当中断发生后,如果相应的中断使能位为 "0",则中断标志位置位,并一直保持到中断执行,或者被软件清除。类似的,如果全局 中断标志被清零,则所有已发生的中断都不会被执行,直到I 置位。然后挂起的各个中断 按中断优先级依次执行。
第二种类型的中断则是只要中断条件满足,就会一直触发。这些中断不需要中断标志。若 中断条件在中断使能之前就消失了,中断不会被触发。
AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被挂起的中断。
要注意的是,进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢 复。这些工作必须由用户通过软件来完成。
使用CLI 指令来禁止中断时,中断禁止立即生效。没有中断可以在执行CLI 指令后发生, 即使它是在执行CLI 指令的同时发生的。下面的例子说明了如何在写EEPROM 时使用这 个指令来防止中断发生以避免对EEPROM 内容的破坏。
| 汇编代码例程 |
| in r16, SREG ; 保存SREG cli ; 禁止中断 sbi EECR, EEMWE ; 启动 EEPROM 写操作 sbi EECR, EEWE out SREG, r16 ; 恢复SREG (I 位) |
| C 代码例程 |
| char cSREG; cSREG = SREG; /* 保存SREG */ /* 禁止中断*/ _CLI(); EECR |= (1< |
使用SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执行。
| 汇编代码例程 |
| sei ; 置位全局中断使能标志 sleep ; 进入休眠模式,等待中断发生 ; 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式 |
| C 代码例程 |
| _SEI(); /* 置位全局中断使能标志*/ _SLEEP(); /* 进入休眠模式,等待中断发生*/ /* 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式*/ |
中断响应时间
AVR 中断响应时间最少为4 个时钟周期。4 个时钟周期后,程序跳转到实际的中断处理例程。在这4 个时钟期期间PC 自动入栈。在通常情况下,中断向量为一个跳转指令,此跳转需要3 个时钟周期。如果中断在一个多时钟周期指令执行期间发生,则在此多周期指令执行完毕后MCU 才会执行中断程序。若中断发生时MCU 处于休眠模式,中断响应时间还需增加4 个时钟周期。此外还要考虑到不同的休眠模式所需要的启动时间。
中断返回需要4 个时钟。在此期间PC( 两个字节) 将被弹出栈,堆栈指针加二,状态寄存器SREG 的I 置位。
下一篇:ATmega8 指令执行时序
史海拾趣
|
06年毕业 三年arm7+ucos 刚刚换公司,现在公司需要ARM9+linux 请问各位大虾知道一下: 1 一般来说windows下开发都有集成开发环境,二linux 下开发软件好像没有,需要自己搞定,思想上有点难以转变。linux 采用命令方式有点不习惯,但公司现在项 ...… 查看全部问答> |
|
1、eeworld有无专门wince开发的栏目,在那 2、做了个wince 5的应用程序,最简单的hello world,通过ActiveSync同步到wince 5设备,运行test.exe,出现“忙”的光标闪一下子就消失了,界面也没出来,是什么问题。… 查看全部问答> |
|
请问能稳定运行Wince4.2的板子能否升级为5.0?钱不多了谢谢您!! 大家好! 朋友送了我一块4.2的板子 X86,PC104架构的,外设什么的都挺全。 我非常喜欢Wince,所以想基于这块板子搞点设计。 这块板子已经移植好4.2 了,但是我听说4.2已经被淘汰, 都用5.0和6.0了,所以想请问,一般这种板子能否设计成5.0的? ...… 查看全部问答> |
|
通过编译,已经得到了sys文件,是不是说明我的驱动程序已经编译成功了? 我想把这个程序先在我的网卡上运行一下,能否不用INF文件,直接安装? 在网上搜到好像可以通过注册表里面键值的修改来安装sys文件,我写的是PCI的网卡驱动,请问用这种方法 ...… 查看全部问答> |
|
Tms320vc5402硬件上如何连接到异步SRam?address与data对应的dsp和ram端直接连接就行了,但是其他的ram pin该如何连接?… 查看全部问答> |
|
STM32做三相电机控制、变频器设计,TIM/PWM模块功能实在太弱了!OC1,OC1N.......OC3,OC3NTIM1_CH1 ..... TIM1_CH3N,TIME_CH3;下面是dsPIC30F2010 介绍PWM 模块具有以下特性:• 6个具备3 占空比发生器的PW ...… 查看全部问答> |




