编译器 :AVR Studio 4.19 + avr-toolchain-installer-3.4.1.1195-win32.win32.x86
芯片型号:ATmega16
芯片主频:8MHz
-------------------------------------------------------------------------------------------------------------------------------------
待解决问题数量 = 3
-------------------------------------------------------------------------------------------------------------------------------------
AVR-GCC中断概述
1、需要包含头文件interrupt.h、它定义了中断函数:#define ISR(vector, [attributes])
2、中断函数一般的格式:
ISR(interrupt_number)
{
}
这里缺省的attributes默认为ISR_BLOCK,表示进入中断后禁止全局中断,这也就禁止了中断嵌套
3、中断号定义在iom16.h中,中断向量地址越低,优先级越高
4、中断标志位会在执行中断程序的时候被自动清0,所以不需要手动清0
-------------------------------------------------------------------------------------------------------------------------------------
中断配置的步骤:
1、配置中断源的触发方式2、允许中断
3、清除中断标志位
4、开启总中断
-------------------------------------------------------------------------------------------------------------------------------------
AVR-GCC中断的写法
如定时器2的中断的例子:
#include <avr/interrupt.h>
……
……
ISR(TIMER2_OVF_vect)
{
PORTA ^= (1 << PA0);
}
完整的定时器2 中断测试详见这篇文章的第一步(普通模式):http://blog.csdn.net/manon_des_source/article/details/51564339
-------------------------------------------------------------------------------------------------------------------------------------
不同编译器的中断写法:
中断是编译器自己实现的,在不同的编译器中,中断函数的定义和写法不一样:
1、旧版GCC-AVR使用signal.h中的SIGNAL(SIG_INTERRUPT0)
2、ICC-AVR的写法是:#pragma interruput_handler TIM1_OVF: 6
-------------------------------------------------------------------------------------------------------------------------------------
伪中断BADISR_vect
作用:
1、程序中需要使用ISR(BADISR_vect){ },用来捕获未定义中断函数的中断
2、如果某个被允许的中断产生了中断请求,但程序中又没有定义它的中断函数,那么系统可能会执行到错误的程序
|<-------------- 待测试 question-001
3、没有包含interrupt.h的文件中的ISR()都不是中断函数、因为编译器找不到定义,将其视为int (int)类型的普通函数,这种ISR请求可以被BADISR_vect这个伪中断捕获
-------------------------------------------------------------------------------------------------------------------------------------
测试准备:
1、在Drv_Timer2.c中允许定时器2溢出中断,并定义定时器2 中断函数如下:
同时屏蔽中断头文件interrupt.h:
让ISR(TIMER2_OVF_vect)被编译器视为int (int)类型的普通函数
这样,定时器2 允许中断,但又没有自己的中断函数
2、在main.c中定义伪中断BADISR_vect如下(包含中断头文件interrupt.h):
……
3、在上面两个函数内都放置断点,进入调试模式
测试结果:
1、每次按下F5、在定时器