历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2021年10月14日 | ATmega48 复位与中断处理

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

ATmega48在使用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 个时钟周期。此外还要考虑到不同的休眠模式所需要的启动时间。这个时间不包括在前面提到的时钟周期里。

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


推荐阅读

史海拾趣

DBM Optix公司的发展小趣事

在发展过程中,DBM Optix也面临过不少挑战和危机。例如,某次全球供应链紧张导致公司原材料供应受到影响,生产进度一度受阻。面对这一挑战,DBM Optix迅速调整采购策略,积极寻找新的供应商,并加强与现有供应商的合作。同时,公司还加强了内部管理,优化生产流程,提高生产效率。这些努力使得DBM Optix成功度过了危机,并继续保持良好的发展势头。

Harvatek Corporation公司的发展小趣事

背景:成立于1975年的Hantronix公司,自诞生之初便专注于为工业、医疗市场的多元化客户群提供LCD显示解决方案。在那个电子显示技术刚刚起步的年代,Hantronix凭借其前瞻性的市场洞察力和技术积累,迅速在行业中站稳脚跟。

发展:公司初期便明确了其产品定位,即专注于高品质、高性能的LCD显示产品,以满足工业控制和医疗设备对显示精度、稳定性和耐用性的严苛要求。通过不断的技术研发和产品优化,Hantronix逐渐在市场中建立了良好的口碑。

Antex公司的发展小趣事

近年来,Antex公司不断升级产品,推出了包括Antex滚珠轴承、Antex齿轮环等在内的多款高端产品。这些产品以其卓越的性能和稳定的品质,赢得了全球客户的青睐。凭借这些优秀产品,Antex在大型回转轴承市场中的份额逐渐提升,目前已占据全球约40%的市场份额。

Califia Lighting公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,Califia Lighting开始积极寻求与国际市场的合作。他们与多个国家和地区的合作伙伴建立了稳定的合作关系,将产品出口到全球各地。同时,公司还参加了多个国际电子照明展会,与全球同行交流学习,进一步提升了公司的国际影响力。

Digital公司的发展小趣事

随着业务的不断发展和市场的不断扩大,DIALIGHT公司逐渐实现了全球化布局。他们在美国、英国、丹麦、德国、马来西亚、新加坡、澳大利亚、墨西哥和巴西等地设立了分支机构或办事处,为全球客户提供及时、高效的服务。此外,DIALIGHT还积极寻求与其他企业的合作与共赢,通过战略合作协议的签署,为双方带来新的业务机遇和合作空间。这些举措不仅增强了DIALIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。

请注意,由于篇幅限制,以上三个故事仅为DIALIGHT公司发展历程的简要概述。如需更详细的信息和更多故事,建议查阅相关资料或访问公司官网。

GE Oil & Gas Digital Solutions公司的发展小趣事
在电子爱好者进行DIY制作时,用于快速测试电路中的电阻元件。

问答坊 | AI 解惑

cadence原理图设计详解

cadence原理图设计详解…

查看全部问答>

WinCE自带的简单数据库排序字段问题

就是用CeCreateDatabaseEx2 / CeOpenDatabaseEx2.....等API创建打开的简单数据库 现在的情况是:创建、打开、添加、删除、关闭等,统统OK 。 我的问题出现再排序字段上:   我的一条记录有5个字段,其中有两个字段(都是字符串类型) ...…

查看全部问答>

SMDK2410问题

我在我的开发板上运行CE5.0的SMDK2410(flash读写已经修改了) EBoot,运行到OEMPreDownload函数时 打印调试信息发现始终没运行到EbootInitEtherTransport这个函数中 请高人指点一下啊??…

查看全部问答>

mini2440 如何输出串口调试信息?

我用的友善的mini2440开发板,这个板子默认不输出调试信息,该怎么样才可以输出? 谢谢。 …

查看全部问答>

cc2430串口接收程序?

#define SET_MAIN_CLOCK_SOURCE(source) \\    do {                                   \\     ...…

查看全部问答>

lattice 1016

怎么大家都不用LATTICE公司的芯片的吗?怎么相关的帖子这样稀少呢?…

查看全部问答>

所有人都进来看看(我是新人)

大家好,我是一个爱好单片机的初学者。 这几天我一直在关注这个论坛,真的不错这个论坛,   学习单片机是因为我看到汽车的底盘灯很好看,自己想做一个,然后想让他呈流水状,就是流水灯,跑马灯,开始以为就是像汽车的转向器一样,结果上网 ...…

查看全部问答>

EMI与高速PCB设计

EMI与高速PCB设计…

查看全部问答>

【视频】TI制胜解决方案(二):高输入电压、低噪音电源解决方案

好东西陆续有来。 今天给大家介绍TI制胜解决方案——高输入电压、低噪音电源解决方案,该方案主要面向医疗、车载以及工业等对噪音敏感的领域。 欢迎大家评价并关注我的更新与分享哟!…

查看全部问答>

用fpga实现以太网通信,如何进行测试

手上有个spartan6的板子,自带PHY芯片和网口。设计时从XPS里面创建了microblaze软核,并向里面添加了以太网的IP核,测试的目的就是用PC机向网口发送一个数据,fpga接受到该数据并显示出来。 这里我有几点疑问:       &nbs ...…

查看全部问答>