关注+星标公众,不错过精彩内容

来源 | 技术社区

极术专栏 | 灵动MM32 MCU

如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断该如何处理?

中断一般是由硬件(例如外设、外部引脚)产生,当某种内部或外部事件发生时,MCU的中断系统将迫使 CPU 暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去,所有的Cortex-M 内核系统都有一个用于中断处理的组件NVIC,主要负责处理中断,还处理其他需要服务的事件。嵌套向量式中断控制器(NVIC: Nested Vectored Interrupt Controller)集成在Cortex-M0处理器里,它与处理器内核紧密相连,并且提供了中断控制功能以及对系统异常的支持。

处理器中的NVIC能够处理多个可屏蔽中断通道和可编程优先级,中断输入请求可以是电平触发,也可以是最小的一个时钟周期的脉冲信号。每一个外部中断线都可以独立的使能、清除或挂起,并且挂起状态也可以手动地设置和清除。

主程序正在执行,当遇到中断请求(Interrupt Request)时,暂停主程序的执行转而去执行中断服务例程(Interrupt Service Routine,ISR),称为响应,中断服务例程执行完毕后返回到主程序断点处并继续执行主程序。多个中断是可以进行嵌套的。正在执行的较低优先级中断可以被较高优先级的中断所打断,在执行完高级中断后返回到低级中断里继续执行,采用“咬尾中断”机制。

内核中断(异常管理和休眠模式等),其中断优先级则由SCB寄存器来管理,IRQ的中断优先级是由NVIC来管理。

NVIC的寄存器经过了存储器映射,其寄存器的起始地址为0xE000E100,对其访问必须是每次32bit。

SCB寄存器的起始地址:0xE000ED00,也是每次32bit访问,SCB寄存器主要包含SysTick操作、异常管理和休眠模式控制。

NVIC具有以下特性:

  • 灵活的中断管理:使能\清除、优先级配置

  • 硬件嵌套中断支持

  • 向量化的异常入口

  • 中断屏蔽

1. 中断使能和清除使能

arm将处理器的中断使能设置和清除设置寄存器分在两个不同的地址,这种设计主要有如下优势:一方面这种方式减少了使能中断所需要的步骤,使能一个中断NVIC只需要访问一次,同时也减少了程序代码并且降低了执行时间,另一方面当多个应用程序进程同时访问寄存器或者在读写操作寄存器时有操作其他的中断使能位,这样就有可能导致寄存器丢失,设置和清除分成两个寄存器能够有效防止控制信号丢失。

因此我可以独立的操作每一个中断的使能和清除设置。

1.1 C代码
*(volatile unsigned long) (0xE000E100) = 0x4 ; //使能#2中断
*(volatile unsigned long) (0xE000E180) = 0x4 ; //清除#2中断
1.2 汇编代码
__asm void Interrupt_Enable()
{LDR R0, =0xE000E100  ;  //ISER寄存器的地址MOVS R1, #04         ;  //设置#2中断STR R1, [R0]         ;  //使能中断#2
}__asm void Interrupt_Disable()
{LDR R0, =0xE000E180  ;  //ICER寄存器的地址MOVS R1, #04         ;  //设置#2中断STR R1, [R0]         ;  //使能中断#2
}
1.3 CMSIS标准设备驱动函数
//使能中断#IRQn
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
{if ((int32_t)(IRQn) >= 0) {NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));}
}
//清除中断#IRQn
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
{if ((int32_t)(IRQn) >= 0) {NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));__DSB();__ISB();}
}
//读取使能中断#IRQn
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
{if ((int32_t)(IRQn) >= 0) {return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));}else {return(0U);}
}
2. 中断挂起和清除挂起

如果一个中断发生了,却无法立即处理,这个中断请求将会被挂起。挂起状态保存在一个寄存器中,如果处理器的当前优先级还没有降低到可以处理挂起的请求,并且没有手动清除挂起状态,该状态将会一直保持。

可以通过操作中断设置挂起和中断清除挂起两个独立的寄存器来访问或者修改中断挂起状态,中断挂起寄存器也是通过两个地址来实现设置和清除相关位。这使得每一个位都可以独立修改,并且无需担心在两个应用程序进程竞争访问时出现的数据丢失。

中断挂起状态寄存器允许使用软件来触发中断。如果中断已经使能并且没有被屏蔽掉,当前还没有更高优先级的中断在运行,这时中断的服务程序就会立即得以执行。

2.1 C代码
*(volatile unsigned long)(0xE000E100) = 0x4 ; //使能中断#2
*(volatile unsigned long)(0xE000E200) = 0x4 ; //挂起中断#2
*(volatile unsigned long)(0xE000E280) = 0x4 ; //清除中断#2的挂起状态
2.2 汇编代码
__asm void Interrupt_Set_Pending()
{LDR R0, =0xE000E100   ;  //设置使能中断寄存器地址MOVS R1, #0x4         ;  //中断#2STR R1, [R0]          ;  //使能#2中断LDR R0, =0xE000E200   ; //设置挂起中断寄存器地址MOVS R1, #0x4         ;  //中断#2STR R1, [R0]          ;  //挂起#2中断
}__asm void Interrupt_Clear_Pending()
{LDR R0, =0xE000E100   ;  //设置使能中断寄存器地址MOVS R1, #0x4         ;  //中断#2STR R1, [R0]          ;  //使能#2中断LDR R0, =0xE000E280   ; //设置清除中断挂起寄存器地址MOVS R1, #0x4         ;  //中断#2STR R1, [R0]          ;  //清除#2的挂起状态
}
2.3 CMSIS标准设备驱动函数
//设置一个中断挂起
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
{if ((int32_t)(IRQn) >= 0) {NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));}
}//清除中断挂起
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
{if ((int32_t)(IRQn) >= 0) {NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));}
}//读取中断挂起状态
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
{if ((int32_t)(IRQn) >= 0) {return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));}else {return(0U);}
}

NVIC属于处理器内核部分,因此在MM32 MCU芯片的用户手册中只有简单的提及,没有重点讲述,需要深入了解相关寄存器和功能需要参考《Cortex-M0技术参考手册》。

------------ END ------------

●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

点击“阅读原文”查看更多分享。

单片机中断程序,如何被中断?相关推荐

  1. 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管

    设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序). #inc ...

  2. linux uart中断程序,linux 串口中断实现

    我在linux系统下写的串口程序,需要实时的读取串口来的数据,但串口来的数据又是不定时的,想用中断的方式响应,看了一些资料,总觉的还所有些不妥. 首先,select函数,他需要一直在while中检测读 ...

  3. 中断程序_ABB机器人中断程序详解(安川FANUC)

    ABB机器人中断程序详解 1.新建一个中断程序 test001,类型中断 TRAP hanmianshadiaoliao StopMove; SetDO DO04, 0; !Stop; StartMo ...

  4. java 定时器 的中断程序,STM32定时器中断

    我试图在STM32L073中使用定时器外设但我有问题 . 我在STM32Cube中生成了设置代码,并且只使用了HAL API提供的函数 . 问题是定时器中断只发生一次,它应该始终发生溢出 . 我不知道 ...

  5. PIC单片机之中断程序

    什么是中断程序呢? 形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章.烤地瓜这件事就好比中断程序,他中断了你看 ...

  6. 解决STM32F0/F1内部FLASH写操作导致中断程序无法响应的问题

    必看链接:试图搞懂MDK程序下载到flash(二)–分散加载文件scatter 参考链接:STM32F10x单片机Flash写操作导致中断不响应问题 最近本人在写STM32F0系列的FLASH写操作的 ...

  7. 利用中断程序在屏幕2、4、6、8行显示4句英文诗

    利用中断程序在屏幕2.4.6.8行显示4句英文诗 这里先介绍一下BIOS当中的int 10h的中断程序,这个中断程序主要是拿来设置光标位置功能的 mov ah,2 ;设置光标 mov bh,0 ;设置 ...

  8. c语言编写51单片机中断程序,执行过程是怎样的?

    Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序: #include<reg52.h>   void main(void)   {    EA=1;      //开放总中断 ...

  9. c语言单片机定时器的应用程序,51单片机定时器中断程序(C语言)

    51c程序 51单片机定时器中断程序(C语言) 用C语言实现的,先要定义好定时器的初值 不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶 ...

  10. 单片机中段程序_单片机外部中断详解及程序

    单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态.比如一个电子时钟,它会按时.分.秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来 ...

最新文章

  1. oracle rodm包,由重启引起的Oracle RAC节点宕机分析及追根溯源
  2. 简单两步就能将 Laravel Log 信息发到其他平台上
  3. Java设计模式—代理模式
  4. P1338 末日的传说
  5. build vue 静态化_页面静态化
  6. 数码相机控制点的自动定位检校
  7. 计数器数组_子数组计数
  8. varchar和Nvarchar区别
  9. Oracle 19c: RAC 集群技术的坚持与放弃(含PPT下载)
  10. Illustrator 教程,如何在 Illustrator 中添加一行文字?
  11. BrnShop开源网上商城第三讲:插件的工作机制
  12. Hessian——轻量级的二进制协议远程调用实现方案
  13. 最新版Unity安装和启动教程
  14. 电子皮肤综述阅读-鲍哲南-2019
  15. 多线程通信Queue
  16. 第十六章 - 垃圾回收相关概念
  17. 运动控制器轴回零的配置与实现
  18. 微信小程序支付以及退款功能(超详细)
  19. Container is running beyond physical memory limits
  20. 台湾南海岸一带发生了7.1级地震

热门文章

  1. 2022-2028年全球与中国手持式按摩器行业市场深度调研及投资预测分析
  2. postgresql数据库进行等保测评(审计) 需要修改的参数
  3. shark-0.9.1 安装后测试
  4. 响应式布局基础知识详解
  5. EXCEL常用小技巧系列02----多条件求和
  6. win10计算机桌面快捷方式,win10发送到桌面快捷方式不见了如何解决_win10电脑没有发送到桌面快捷方式选项怎么恢复...
  7. jquery实现登录成功界面_【jQuery实例】Ajax登录页面
  8. 我奋斗十八年不是为了和你一起喝咖啡!
  9. 腾讯云实验室:搭建 LNMP 环境
  10. PyS60记事本源码