B001-Atmega16-中断(GCC-AVR)-(ques=3)

本文详细介绍了AVR-GCC下Atmega16的中断处理,包括中断概述、配置步骤、中断写法、不同编译器的中断处理方式、伪中断BADISR_vect的作用及测试、中断挂起和中断嵌套的测试。通过实例展示了如何捕捉未定义中断、中断挂起行为以及中断嵌套的实现。
摘要由CSDN通过智能技术生成

编译器    :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、在定时器

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值