0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

中断是什么 如何使用它们

454398 来源:工程师吴畏 2019-07-31 14:08 次阅读

原理图

中断是什么 如何使用它们

什么是中断?

微控制器编写的简单程序通常都可以在主函数内部完成,并且几乎不需要使用外设。但是,大多数其他微控制器程序更复杂,需要大量代码。当发生这种情况时,中断会变得非常有用,但究竟什么是中断?

想象一下,我们的微控制器需要同时做两件事:准确跟踪时间并使LED闪烁。我们的程序可以通过重置计时器,递增计数器,然后等待计时器溢出来开始。完成后,我们的代码可以使LED闪烁。虽然这有点完成工作,但是有两个问题。 CPU花费大部分时间坐在延迟循环中,这浪费了CPU时间,并且LED的执行时间很难计算。

那么,我们如何解决这个问题呢?我们可以在计时器上使用中断!因此,我们不是在主代码中递增计数器,而是将代码转换为处理时序的中断服务程序。

通常,微控制器将运行LED闪烁代码,但是一旦定时器生成中断请求,微控制器停止LED闪烁代码,执行定时器中断服务程序,然后返回到LED闪烁代码。这样,LED闪烁代码不会干扰我们的定时器代码,它可以更准确(并且更容易)跟踪时间。

AVR Core上的中断

AVR有一个向量表,每个中断源都跳转到一个唯一的地址。这是非常有利的,因为我们不再需要执行比较来查看触发了哪个中断,这可能需要一些时间。

下表显示了Atmega168上可用的不同中断以及它们跳转到的地址。程序记忆。但是,在我们使用它们之前必须配置几个中断选项。

从ATmega168数据表中提取

表位置

Atmega168具有允许的引导加载程序区域它可以动态地重写自己的程序存储器,这对固件更新很有用。因此,ISR向量表将位于内存中很重要。如果表位于引导加载程序区域中,则在启用引导加载程序时永远不会更新(不推荐)。

因此,如果没有引导加载程序,则应将向量表放在内存的底部(接近地址0x0000),但如果使用引导加载程序,则应将向量表移动到引导加载程序上方。这可以通过改变MCUCR寄存器中的几个位来轻松完成。

如果IVSEL = 0,则ISR位于向量表的起始,否则ISR驻留在引导加载程序中。现在,将其保留为0,因为我们没有使用引导加载程序

如果IVCE = 1,则执行ISR切换。暂时保留为0

中断启用位

每个中断源(I/O引脚,外设等)都有关联中断使能位。与PIC类似,STATUS寄存器中有一个全局中断使能位,需要将其设置为允许中断工作。要找出这些中断标志所在的位置,需要参考数据手册中的特定外设章节。

例如,我们将在定时器0上使用溢出中断,所以如果我们看一下定时器0在章节中,我们发现中断使能位位于TIMSK0寄存器(第89页)中,称为TOIE0。需要将此位设置为1才能触发定时器溢出。该寄存器还有另外两个中断源,A匹配溢出和B匹配溢出,这对PWM功能很有用(将来会介绍)。

注意,设置我在SREG中的位不是使用SREG本身,而是使用函数sei();设置I位和cei();清除I位。

在WinAVR中编写ISR

所以我们现在明白需要启用中断才能启动,但我们如何使用C和WINAVR编译器编写?答案很简单:我们使用特殊保留字ISR并传递中断名称参数来告诉编译器哪个中断函数处理。注意我们需要包含中断头文件,否则中断函数将不起作用!

#include

ISR(TIMER0_OVF_vect)

{

// Interestingly, the AVR automatically clears interrupt flags.。。.unlike the PIC

// Put your code here

}

简单闪烁示例

在这个例子中,ATmega168会使连接到PD0的LED频繁闪烁,其中闪烁的速率受到控制通过定时器0但是,您可能会注意到主功能为空,并且LED在定时器溢出中断服务程序(ISR)内闪烁。这意味着我们可以在while循环中放入我们想要的任何代码,并且该代码不会阻止中断运行。

/*

* AVR Interrupt.c

*

* Created: 09/01/2018

* Author : RobinLaptop

*/

// These are really useful macros that help to get rid of unreadable bit masking code

#define setBit(reg, bit) (reg = reg | (1 《《 bit))

#define clearBit(reg, bit) (reg = reg & ~(1 《《 bit))

#define toggleBit(reg, bit) (reg = reg ^ (1 《《 bit))

#define clearFlag(reg, bit) (reg = reg | (1 《《 bit))

#include

#include

ISR(TIMER0_OVF_vect)

{

// Interestingly, the AVR automatically clears interrupt flags =) 。。..unlike the PIC =(

// Toggle the LED (PD0 , Pin 2)

toggleBit(PORTD, PD0);

}

int main(void)

{

// Initialize Registers

clearBit(TCCR0A, WGM00); // Configure WGM to be 0x00 for normal mode

clearBit(TCCR0A, WGM01);

clearBit(TCCR0B, WGM02);

setBit(TCCR0B, CS00); // Configure clock source to be clock io at 1024 pre-scale

clearBit(TCCR0B, CS01);

setBit(TCCR0B, CS02);

DDRD = 0xFF; // Make PORT D and output

sei(); // Enable interrupts

setBit(TIMSK0, TOIE0); // Enable the timer interrupt

while (1)

{

// Put any code you want here

// It should not affect the interrupt service routine!

}

}

结论

教程仅涵盖单个中断,即定时器0溢出中断,但它清楚地表明中断是非常强大。如果使用得当,您可以拥有一个系统,它可以在信号到达时立即响应并暂停主代码。这可以用来做很多事情,包括多任务处理,不同外围设备的多重处理,以及创建实时代码!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 中断
    +关注

    关注

    5

    文章

    899

    浏览量

    41561
收藏 人收藏

    评论

    相关推荐

    单片机有哪些中断类型

    单片机中断是指在单片机执行程序的过程中,当外部设备或内部条件发生某个特定事件时,能够暂停当前正在执行的程序,转而去执行一个特定的服务程序(称为中断服务程序或中断处理程序),处理该事件,之后再返回到被
    的头像 发表于 10-17 18:12 834次阅读

    freertos中断优先级在哪设置

    中断优先级之前,我们需要理解中断优先级的概念。在嵌入式系统中,中断是硬件或软件事件,它们可以打断CPU的当前执行流程,让CPU去处理更紧急的任务。
    的头像 发表于 09-02 14:17 715次阅读

    stm32怎样触发软件中断

    了解STM32中断系统 STM32微控制器具有丰富的中断系统,包括NVIC(嵌套向量中断控制器)和SYSTICK定时器。NVIC可以处理多达240个中断源,包括外部
    的头像 发表于 09-02 09:32 952次阅读

    RISC-V的中断处理 中断操作三个步骤

    中断操作三个步骤: 1、中断初始化 2、trap处理 3、用户中断处理
    的头像 发表于 05-20 16:38 1283次阅读

    stm32使用workbench只生成了一些.h和.c文件,然后该如何使用它们

    使用workbench只生成了一些.h和.c文件,然后该如何使用它们?还需要手动在MDK中建立工程添加标准库再把这些文件加进去么?哪位有相关开发经验,请赐教!
    发表于 05-15 07:29

    微控制器和嵌入式系统中的并发和中断

    除了通用 CPU 之外,它们还包含许多用于与外界交互的专用硬件设备(称为外围设备),因此您可以连接诸如按钮和显示器之类的东西以及实现系统所需的其他外部硬件。通常,这些外设具有中断机制,因此 CPU 可以要求它们监视特定事件,然后
    发表于 05-03 10:01 217次阅读
    微控制器和嵌入式系统中的并发和<b class='flag-5'>中断</b>

    CPU中断程序:从硬件看什么是中断

    CPU响应中断转去执行中断服务程序前,需要把被中断程序的现场信息保存起来,以便执行完中断服务程序后,接着从被中断程序的断点处继续往下执行。
    发表于 03-26 11:36 4008次阅读
    CPU<b class='flag-5'>中断</b>程序:从硬件看什么是<b class='flag-5'>中断</b>?

    稳压管起稳压作用是利用它的什么特性

    稳压管(Voltage Regulator),也称为稳压二极管、稳压二极管、稳压二极管、硅稳压二极管等,是一种能够稳定输出电压的电子元件。 稳压管起稳压作用是利用它的电流-电压特性。下面是一个深入
    的头像 发表于 02-22 10:09 3102次阅读

    单片机中断功能及其应用

    单片机中断功能及其应用  单片机中断是指在程序执行过程中,根据特定的条件或事件自动暂时中断当前程序的执行,转而执行特定的中断服务程序。中断
    的头像 发表于 01-30 14:45 5644次阅读

    什么是中断向量偏移,为什么要做中断向量偏移?

    当MCU中有两段或以上程序的时候(第一个程序为用户BootLoader程序,其他的为APP程序,这个在前期视频《什么是ISP?什么是IAP》中有讲过),APP程序中都需要做中断向量偏移,那么什么是中断向量偏移,为什么要做中断向量
    的头像 发表于 01-30 09:47 1852次阅读
    什么是<b class='flag-5'>中断</b>向量偏移,为什么要做<b class='flag-5'>中断</b>向量偏移?

    GD32 MCU是如何进入中断函数的

    用过GD32 MCU的小伙伴们都知道,程序是顺序执行的,但当有中断来的时候程序会跳转到中断函数,执行完中断函数后程序又继续回到原来的位置继续执行,那么你们知道MCU是如何找到中断函数入
    的头像 发表于 01-30 09:45 1125次阅读
    GD32 MCU是如何进入<b class='flag-5'>中断</b>函数的

    外部中断的工作原理 外部中断方式有哪些 为什么要使用外部中断

    外部中断的工作原理是单片机响应外部事件的一种机制** **。
    的头像 发表于 01-28 17:37 3803次阅读

    单片机外部中断和定时器中断的区别和用法

    单片机外部中断和定时器中断在触发来源、应用场景以及功能特点上存在明显差异** **。
    的头像 发表于 01-28 17:35 3216次阅读

    图像采集卡到底是什么?为什么要使用它们

    :图像采集卡到底是什么?它们有什么用?何时以及为什么应该使用它们?为什么要使用图像采集卡?帧或视频采集卡的最初目的是将模拟图片转换为数字信号。由于当今纯数字图像处理技
    的头像 发表于 01-26 16:14 1518次阅读
    图像采集卡到底是什么?为什么要使<b class='flag-5'>用它们</b>?

    聊聊KUKA机器人高级编程:中断

    最大数量/BRAKE最多可以同时声明64个中断中断的声明可以随时被新的声明覆盖。可以选择使用BRAKE声明中断。BRAKE语句在检测到声明的中断时立即执行。这意味着当进入
    发表于 01-25 15:16 6814次阅读
    聊聊KUKA机器人高级编程:<b class='flag-5'>中断</b>