首页 理论教育 AVR单片机中断操作简介

AVR单片机中断操作简介

时间:2023-11-20 理论教育 版权反馈
【摘要】:Mega使用2个字作为中断向量,非Mega使用1字作为中断向量。如果希望对多个中断入口使用同一个中断操作,可以在一个interrupt_handler附注中放置多个用空格分开的名称,分别带有多个不同的向量号。;对全部除ATmega以外的MCU.area vectors;中断向量.org 0x6rjmp_timer;对ATmega MCU.area vectors;中断向量.org 0xCjmp_timer

AVR单片机中断操作简介

在中断操作中,C中断可以使用,无论函数定义在文件的什么地方,必须用一个附注(pragma)在函数定义之前通知编译器这个函数是一个中断操作:

#pragma interrupt_handler<name>:<vector number>*

“vector number”中断的向量号,注意向量号是从1开始的,那是复位向量。这个附注有两个作用:对中断操作函数,编译器生成RETI指令代替RET指令,而且保存和恢复在函数中用过的全部寄存器;编译器生成以向量号和目标MCU为基础的中断向量

例如:

编译器生成的指令为

rjmp_timer_handler ;对普通AVR单片机MCU

或者

jmp_timer_handler ;对Mega单片机MCU

上述指令定位在0x06(字节地址,针对普通装置)和0x0c(字节地址,针对Mega装置)。Mega使用2个字作为中断向量,非Mega使用1字作为中断向量。如果希望对多个中断入口使用同一个中断操作,可以在一个interrupt_handler附注中放置多个用空格分开的名称,分别带有多个不同的向量号。例如:

#pragma interrupt_handler timer_ovf:7 timer_ovf:8

汇编中断操作,可以用汇编语言写中断操作。如果在汇编操作内部调用C函数,无论如何要小心。汇编程序要保存和恢复挥发寄存器(参考汇编界面),C函数不做这些工作。(www.xing528.com)

如果使用汇编中断操作,那么必须自己定义向量。使用“abs”属性描述绝对区域,用“.org”来声明rjmp或jmp指令的正确地址。注意这个“.org”声明使用的是字节地址。

;对全部除ATmega以外的MCU

.area vectors(abs);中断向量

.org 0x6

rjmp_timer

;对ATmega MCU

.area vectors(abs);中断向量

.org 0xC

jmp_timer

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈