历史上的今天
返回首页

历史上的今天

今天是:2024年12月20日(星期五)

正在发生

2021年12月20日 | ATmega168 复位与中断处理

2021-12-20 来源:eefocus

AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位I 也置位时,中断可以发生。根据程序计数器PC 的不同,在引导锁定位BLB02 或BLB12 被编程的情况下,中断可能被自动禁止。这个特性提高了软件的安全性。详见 P254“ 存储器编程” 的描述。

程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见 P47“中断”。列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高的优先级,第二个为INT0 – 外部中断请求0。通过置位MCU 控制寄存器 (MCUCR) 的IVSEL,中断向量可以移至引导Flash的起始处。编程熔丝位BOOTRST也可以将复位向量移至引导Flash的起始处。具体参见P240“支持引导装入程序 – 在写的同时可以读(RWW,Read-While-Write) 的自我编程能力, ATmega88 与 ATmega168”。特别说明ATmega48是没有Boot 代码区。

任一中断发生时全局中断使能位I 被清零,从而禁止了所有其他的中断。用户软件可以在中断程序里置位I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序。执行RETI 指令后I 自动置位。

从根本上说有两种类型的中断。第一种由事件触发并置位中断标志。对于这些中断,程序计数器跳转到实际的中断向量以执行中断处理程序,同时硬件将清除相应的中断标志。中断标志也可以通过对其写”1” 的方式来清除。当中断发生后,如果相应的中断使能位为“0”,则中断标志位置位,并一直保持到中断执行,或者被软件清除。类似的,如果全局中断标志被清零,则所有已发生的中断都不会被执行,直到I 置位。然后挂起的各个中断按中断优先级依次执行。

第二种类型的中断则是只要中断条件满足,就会一直触发。这些中断不需要中断标志。若中断条件在中断使能之前就消失了,中断不会被触发。

AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被挂起的中断。要注意的是,进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作必须由用户通过软件来完成。

ATmega168在使用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<EECR |= (1<SREG = cSREG; /* 恢复SREG (I 位) */

使用SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执行。 

汇编代码例程
sei ; 置位全局中断使能标志
sleep ; 进入休眠模式,等待中断发生
; 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式

C 代码例程
_SEI(); /* 置位全局中断使能标志*/
_SLEEP(); /* 进入休眠模式,等待中断发生*/
/* 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式*/

AVR 中断响应时间最少为4 个时钟周期。4 个时钟周期后,程序跳转到实际的中断处理例程。在这4 个时钟期期间PC 自动入栈。在通常情况下,中断向量为一个跳转指令,此跳转需要3 个时钟周期。如果中断在一个多时钟周期指令执行期间发生,则在此多周期指令执行完毕后MCU 才会执行中断程序。若中断发生时MCU 处于休眠模式,中断响应时间还需增加4 个时钟周期。此外还要考虑到不同的休眠模式所需要的启动时间。这个时间不包括在前面提到的时钟周期里。

ATmega168中断返回需要4 个时钟。在此期间PC( 两个字节) 将被弹出栈,堆栈指针加二,状态寄存器SREG 的I 置位。

推荐阅读

史海拾趣

Davicom公司的发展小趣事

随着产品技术的不断成熟和市场竞争的加剧,Davicom开始积极拓展市场,加强品牌建设。公司加大市场推广力度,积极参加国内外各类展会和论坛,与潜在客户建立联系。同时,Davicom还注重提高产品质量和服务水平,赢得了客户的信任和好评。

Alpha 3 Manufacturing公司的发展小趣事

在技术创新的基础上,Alpha 3 Manufacturing公司开始积极拓展市场。公司参加了多个国际电子展会,与全球客户建立了广泛的联系。同时,公司还加强了对市场的调研和分析,针对不同地区和客户的需求,推出了定制化的产品和服务。这些举措不仅提高了公司的市场份额,还进一步提升了公司的品牌知名度和影响力。

eLED.com Corp公司的发展小趣事

eLED.com Corp是一家专注于LED(发光二极管)领域的电子公司,成立于XX世纪初。公司创始人XX先生,在半导体行业拥有多年的研发经验,他看到LED技术在照明和显示领域的巨大潜力,于是决定创立eLED.com Corp。公司初期主要致力于LED产品的研发和生产,凭借其高效率和长寿命的特点,逐渐在市场上获得认可。

为了进一步提升产品质量和技术水平,eLED.com Corp不断投入研发资金,引入先进的生产设备和技术人才。通过与高校和研究机构的合作,公司成功开发出一系列具有自主知识产权的LED产品,逐渐在行业中树立了良好的口碑。

FlexiPanel公司的发展小趣事

在追求经济效益的同时,FlexiPanel也高度重视企业的社会责任和环保问题。公司积极响应国家节能减排政策,致力于推广绿色制造和可持续发展理念。在产品设计、生产、包装等各个环节中,FlexiPanel都采取了环保措施,减少了对环境的影响。此外,公司还积极参与公益事业和社会活动,为社会和谐发展贡献了自己的力量。

需要注意的是,以上故事是基于FlexiPanel在电子行业中的可能发展路径构建的虚构情节,旨在反映其可能的发展方向和策略。由于具体信息可能因企业实际情况和市场环境变化而有所不同,因此以上内容仅供参考。

长工微电子公司的发展小趣事

为了进一步拓展市场,长工微电子积极寻求战略合作。近期,长工微电子与世强先进(深圳)科技股份有限公司签署战略合作协议,授权世强先进全线代理其旗下电源管理IC、开关转换器、多相控制器、降压电源模块、电子保险丝等产品。这一合作有助于长工微电子更好地满足客户需求,提高市场占有率。

Delta Electronics公司的发展小趣事

Delta Electronics成立于1971年,最初只是台湾一家小型电子制造公司。随着技术的不断进步和市场的扩大,公司逐渐开始拓展其业务范围。上世纪90年代初,Delta在中国大陆设立了生产基地,这标志着公司全球扩展战略的重要一步。随后,公司陆续在美国、欧洲、亚洲等地建立了研发中心和生产基地,为全球客户提供优质的电子产品和解决方案。

问答坊 | AI 解惑

关于吉时利6位半数字万用表

2100型六位半USB数字万用表是Keithley高性能数字万用表家族的最新成员。它具有六位半数字万用表的准确度、功能和速度,能够简化和满足您最苛刻的测量要求,而价格只相当于从前性能较低的五位半表和高端手持机型。将高精度和低成本相结合,2100高精 ...…

查看全部问答>

LPC2132 硬件I2C(查询方式)终于搞定了!!!

       哈哈,真是“福无双至,今日至;祸不单行,昨夜行!”。最近在弄LPC2132读写AT24C02时,刚开始用的是周工的I2C程序包,但是不怎么稳定,有时能进中断,有时不行。所以一直想改写代码。显示用模拟方式,因为这 ...…

查看全部问答>

求一个AT91RM9200 的BSP,一个EBOOT也可以

公司要求把:PXA255换成AT91RM9200,这下麻烦全来了。什么资料都没有。 LINUX相关的倒找一了堆,就是没有CE下的BSP。 有高手做过这方面的吗?求一个AT91RM9200 的BSP,一个EBOOT也可以,给俺发一个。 邮箱:sankye@163.com…

查看全部问答>

2410 nandboot烧录

这个问题还不是十分明了 这样的,我的2410板子上已经被我擦除了nandboot,没有操作系统,裸跑上跑(嘿嘿,重头开始,可以了解更多) 比如我的代码现在在MDK V4下编译出来27KB的bin文件,利用MDK自带的download功能下载到nand的0x0开始的地方。 ...…

查看全部问答>

太阳能供电模块设计的问题

太阳能电池使用的是0.5W 2V的两个电路都似乎不能正常的在太阳能和电池间切换 [ 本帖最后由 ssawee 于 2011-1-31 22:23 编辑 ]…

查看全部问答>

初学者,请教问题!!!1

entity cnt16 is port(clk:in std_logic;      dout:out std_logic_vector(3 downto 0);           dclk1:out std_logic); end cnt16; architecture Behavioral of cnt16 is     ...…

查看全部问答>

CAN中断

发送数据,CAN中断,先进入状态中断,读取中断状态只为0x00000018,即成功接收发送一帧数据?这是为什么。不应该是只是发送中断吗? 中断具体的流程图应该是怎么样的呢? 至于报文ID,与ID掩码应该怎么设置,有什么关联? 在一切正常下,哪个 ...…

查看全部问答>

grace和头文件问题

实现uart的串口通信    先用grace初始化    在rx的中断函数里面写if=‘9’,则红灯亮,成功了 但是现在想grace调用内联函数却不行这是错误提示 然后src目录 这是中断函数声明 event的头文件 最后event函数 …

查看全部问答>

【Nucleo深度评测】+范例试用

本帖最后由 fyaocn 于 2014-12-15 11:06 编辑 拿到Nucleo板子和蓝牙套件,测试范例,可以顺利通过编译并下载到板子中如图。 完全按照范例去做效果还是不错的,可惜没有另一个dongle,不能测试全部性能。也不能测试这个范例的功能是否能够实现。 ...…

查看全部问答>