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

    文章

    920

    浏览量

    43875
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一文看懂PCIe中断机制

    PCIe 中断机制主要分为两类:一类是继承自传统 PCI 的 物理中断线(INTx)中断,通过硬件引脚触发;另一类是 MSI(Message Signaled Interrupt)中断
    的头像 发表于 03-11 09:35 504次阅读
    一文看懂PCIe<b class='flag-5'>中断</b>机制

    Linux中断“搬家”指南:从应用到操作,手把手教你转移中断核心(RK3588)

    在高性能服务器或嵌入式设备(如瑞芯微 RK3588)上,中断处理的 CPU 核心绑定是优化性能的关键手段之一。比如网卡中断默认绑在小核上时,高网络负载会导致小核过载,而大核却“闲置”;通过中断转移,把网卡
    的头像 发表于 02-04 16:20 920次阅读
    Linux<b class='flag-5'>中断</b>“搬家”指南:从应用到操作,手把手教你转移<b class='flag-5'>中断</b>核心(RK3588)

    RISC-V怎么实现核间中断?核心本地中断控制器(CLINT)深度解析

    全称为Core Local Interruptor(核心本地中断控制器),是 RISC-V 特权架构规范(Privileged Architecture Specification)中明确定义的内建
    的头像 发表于 12-13 14:06 2647次阅读
    RISC-V怎么实现核间<b class='flag-5'>中断</b>?核心本地<b class='flag-5'>中断</b>控制器(CLINT)深度解析

    电能质量在线监测装置可监测电压中断持续时间吗?

    电能质量在线监测装置可精准监测电压中断持续时间 ,这是其核心暂态事件监测功能之一,严格遵循 GB/T 30137-2013《电能质量 电压暂升、暂降与短时中断》和国标 IEC 61000-4-30
    的头像 发表于 12-11 10:24 552次阅读
    电能质量在线监测装置可监测电压<b class='flag-5'>中断</b>持续时间吗?

    电能质量在线监测装置能识别电压中断事件吗?

    现代电能质量在线监测装置(无论 A 类还是 S 类精度)均能精准识别电压中断事件,且完全符合 GB/T 30137-2013《电能质量 电压暂降、短时中断和电压暂升》、IEC 61000-4-30
    的头像 发表于 11-27 16:27 1042次阅读
    电能质量在线监测装置能识别电压<b class='flag-5'>中断</b>事件吗?

    SysTick初始化函数和中断服务函数详解

    SysTick定时器的计数器是向下递减计数的,计数一次的时间TDEC=1/CLKICLK,当重装载寄存器中的值VALUELOAD减到0的时候,产生中断,可知中断一次的时间TINT=VALUELOAD*TDEC=VALUE LOAD/CLKICLK,其中CLKICLK=20
    的头像 发表于 09-23 09:57 1019次阅读
    SysTick初始化函数和<b class='flag-5'>中断</b>服务函数详解

    瑞萨RA系列MCU的中断过程介绍

    中断来临的时候会最先经过IRQ寄存器,IRQ寄存器检测到中断的时候,会向中央处理嵌套向量中断控制器NVIC发送中断信号,当NVIC检测到中断
    的头像 发表于 09-23 09:45 1521次阅读
    瑞萨RA系列MCU的<b class='flag-5'>中断</b>过程介绍

    瑞萨RA系列MCU的外部引脚中断详解

    上一章节我们已经详细介绍了NVIC、ICU、ELC、NMI并对RA系列MCU的中断管理系统有个全局的了解,我们这一章节的内容是如何控制外部中断,也是内核里的NVIC的实例应用,这也是RA系列MCU非常重要的一个外部中断资源。
    的头像 发表于 09-23 09:38 2134次阅读
    瑞萨RA系列MCU的外部引脚<b class='flag-5'>中断</b>详解

    CYT2B93CAE如何构建不产生中断的FIFO?

    你好,我正在使用 CYT2B93CAE 使用设备配置器 5.3,我选择将不匹配的 ID 存储在 FIFO 0 中,问题是它正在生成中断,而对于不匹配的 ID,我不想中断 CPU,只是将它们传递给 DMA 线。 如何构建不产生
    发表于 07-15 06:29

    第六章 外部中断

    本章介绍W55MH32的IO口作为外部中断输入的使用。先阐述了NVIC(嵌套向量中断控制器) 的结构、寄存器、优先级及相关函数,再说明EXTI(外部中断和事件控制器)的功能。框图及IO口与
    的头像 发表于 05-26 16:27 1682次阅读
    第六章 外部<b class='flag-5'>中断</b>

    极海APM32F003触发NMI中断的解决方案

    问题:APM32F003F6P6 PC3配置成外部中断口,下拉触发之后没有进入EINTC_IRQHandler外部中断函数,反而一直触发NMI中断
    的头像 发表于 05-24 14:44 1082次阅读
    极海APM32F003触发NMI<b class='flag-5'>中断</b>的解决方案

    AS32X601驱动系列教程 PLIC_中断应用详解

    平台中断控制器(Platform Level Interrupt Controller,PLIC)是国科安芯AS32系列MCU芯片的中断控制器,主要对中断源进行采样,优先级仲裁和分发。各外设
    的头像 发表于 05-23 17:10 827次阅读
    AS32X601驱动系列教程 PLIC_<b class='flag-5'>中断</b>应用详解

    第十章 W55MH32中断应用概览

    本章讲述了W55MH32中断应用,涵盖异常类型、NVIC介绍、优先级定义与分组,阐述中断编程三要点(使能中断、配置 NVIC、编写服务函数),并强调优先级分组设置注意事项。
    的头像 发表于 05-22 17:07 2066次阅读
    第十章 W55MH32<b class='flag-5'>中断</b>应用概览

    如何在CYPD7299中禁用和启用SWD,并在需要时启用它

    基本上,我的要求是在 CYPD7299 中禁用 SWD,并在需要时启用它。 仅供参考,我们正在通过 LIN 使用固件更新。 有人可以指导如何实现这一点吗?
    发表于 05-19 08:02

    求助,关于CM0.c中的USBFS和中断问题求解

    ,USBFS 在 CM0.c 文件中仍无法正常运行。 我已经验证了配置并确保所有必需的设置都已到位,但 USBFS 仍然无法按预期运行。 中断未触发:我已经在 CM0 核心中设置了中断,但它们没有按应有
    发表于 05-16 06:44