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

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

3天内不再提示

详解中断使能、清除或挂起等实现方式

安芯教育科技 来源:极术社区 作者:灵动MM32 MCU 2022-04-14 09:54 次阅读

在前几天有客户问了一个问题:如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断该如何处理?

在研究了arm的官方手册后,了解中断有使能、清除或挂起等实现方式,今天分享给大家。

中断一般是由硬件(例如外设、外部引脚)产生,当某种内部或外部事件发生时,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代码

	*(volatileunsignedlong)(0xE000E100)=0x4;//使能#2中断 *(volatileunsignedlong)(0xE000E180)=0x4;//清除#2中断
	
1.2 汇编代码

	__asmvoidInterrupt_Enable() { LDRR0,=0xE000E100;//ISER寄存器的地址 MOVSR1,#04;//设置#2中断 STRR1,[R0];//使能中断#2 } __asmvoidInterrupt_Disable() { LDRR0,=0xE000E180;//ICER寄存器的地址 MOVSR1,#04;//设置#2中断 STRR1,[R0];//使能中断#2 }
	
1.3 CMSIS标准设备驱动函数

	//使能中断#IRQn __STATIC_INLINEvoid__NVIC_EnableIRQ(IRQn_TypeIRQn) { 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代码

	*(volatileunsignedlong)(0xE000E100)=0x4;//使能中断#2 *(volatileunsignedlong)(0xE000E200)=0x4;//挂起中断#2 *(volatileunsignedlong)(0xE000E280)=0x4;//清除中断#2的挂起状态
	
2.2 汇编代码

	__asmvoidInterrupt_Set_Pending() { LDRR0,=0xE000E100;//设置使能中断寄存器地址 MOVSR1,#0x4;//中断#2 STRR1,[R0];//使能#2中断 LDRR0,=0xE000E200;//设置挂起中断寄存器地址 MOVSR1,#0x4;//中断#2 STRR1,[R0];//挂起#2中断 } __asmvoidInterrupt_Clear_Pending() { LDRR0,=0xE000E100;//设置使能中断寄存器地址 MOVSR1,#0x4;//中断#2 STRR1,[R0];//使能#2中断 LDRR0,=0xE000E280;//设置清除中断挂起寄存器地址 MOVSR1,#0x4;//中断#2 STRR1,[R0];//清除#2的挂起状态 }
	
2.3 CMSIS标准设备驱动函数

	//设置一个中断挂起 __STATIC_INLINEvoid__NVIC_SetPendingIRQ(IRQn_TypeIRQn) { 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技术参考手册》。在下一章节中,我们将和大家一起学习中断优先级的实现方式

原文标题:技术分享 | Cortex-M0中断控制和系统控制(一)

文章出处:【微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

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

    关注

    112

    文章

    16332

    浏览量

    177812
  • 中断系统
    +关注

    关注

    1

    文章

    96

    浏览量

    61015
  • Cortex-M0
    +关注

    关注

    4

    文章

    124

    浏览量

    38675
  • MM32
    +关注

    关注

    1

    文章

    106

    浏览量

    756

原文标题:技术分享 | Cortex-M0中断控制和系统控制(一)

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FreeRTOS任务挂起恢复与使用中断遇到的坑

    任务挂起简单点理解就是现在不需要执行这个任务,让它先暂停,就是挂起。恢复就是从刚才挂起的状态下继续运行。
    的头像 发表于 09-26 09:01 6218次阅读
    FreeRTOS任务<b class='flag-5'>挂起</b>恢复与使用<b class='flag-5'>中断</b>遇到的坑

    不能在自己的中断挂起自己

    不能在自己的中断挂起自己,但是挂起别人,为啥呢?
    发表于 05-17 05:29

    灵动微课堂 (第175讲) | Cortex-M0中断控制和系统控制(一)

    在前几天有客户问了一个问题:如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断该如何处理?在研究了arm的官方手册后,了解中断有使
    发表于 07-29 17:14

    STM32F10X外部中断(EXTI)的学习

    寄存器ICER//中断清除寄存器ISPR//中断使挂起寄存器ICPR//
    发表于 01-14 09:21

    ARM接口编程之中断控制器GIC介绍

    挂起寄存器ICDICPR1_CPU0 [25] 当该位为1时,中断挂起了,写1到对应的位,清除对应中断7、配置CPU接口层:1)ICCIC
    发表于 04-25 10:20

    N32G4FR系列低功耗应用笔记资料下载

    N32G45x 将在事件发生时立即退出 SLEEP 模式。唤醒事件可以通过以下方式生成: 在外设控制寄存器中使一个中断,而不是在 NVIC 中使, 同时
    发表于 11-02 06:38

    CW32L083系列MCU中断系统介绍

    FAULT 中断中断寄存器的相关配置1.中断使挂起
    发表于 12-01 10:30

    清除SQL挂起工具

    在装SQL时都会经常出现SQL未挂起的问题。这时只要用工具就可以解决这个问题了。
    发表于 11-24 14:01 0次下载

    STM32单片机实现外部中断的步骤及方法

    和配置NVIC一样,这也是EXTI配置的一般步骤:清除相应中断线标志位(这个很重要,刚开始一直没找到这个问题),联结端口与中断线(也可以在GPIO初始化时配置),选择中断线,设置
    发表于 11-20 15:46 2.4w次阅读
    STM32单片机<b class='flag-5'>实现</b>外部<b class='flag-5'>中断</b>的步骤及方法

    STM32F10X的外部中断(EXTI)前篇

    寄存器 ICER //中断清除寄存器 ISPR //中断使
    发表于 01-14 15:22 3次下载
    STM32F10X的外部<b class='flag-5'>中断</b>(EXTI)前篇

    单片机中断程序新来的中断该如何处理?

    处理器中的NVIC能够处理多个可屏蔽中断通道和可编程优先级,中断输入请求可以是电平触发,也可以是最小的一个时钟周期的脉冲信号。每一个外部中断线都可以独立的使
    的头像 发表于 05-10 10:02 3869次阅读

    Cortex-M0中断控制和系统控制(一)

    处理器中的NVIC能够处理多个可屏蔽中断通道和可编程优先级,中断输入请求可以是电平触发,也可以是最小的一个时钟周期的脉冲信号。每一个外部中断线都可以独立的使
    的头像 发表于 03-16 13:38 1068次阅读

    单片机中断程序是如何处理器新来的中断

     如果一个中断发生了,却无法立即处理,这个中断请求将会被挂起挂起状态保存在一个寄存器中,如果处理器的当前优先级还没有降低到可以处理挂起的请
    发表于 05-13 12:24 414次阅读
    单片机<b class='flag-5'>中断</b>程序是如何处理器新来的<b class='flag-5'>中断</b>?

    LIC内核中断挂起位和中断使

    中断源 0 的字 0 的位 0 硬接线为零。 PLIC 内核中的挂起位可以通过设置相关的启用位然后执行第 9.8 节中描述的声明来清除 中断使
    的头像 发表于 10-07 17:57 795次阅读
    LIC内核<b class='flag-5'>中断</b><b class='flag-5'>挂起</b>位和<b class='flag-5'>中断</b><b class='flag-5'>使</b><b class='flag-5'>能</b>

    如何在特权模式下用arm汇编指令使和禁止irq中断

    如何在特权模式下用arm汇编指令使和禁止irq中断? 在 ARM 系统中,中断是非常常见的一种事件。在特权模式下,可以使用 ARM 汇编指令来使
    的头像 发表于 10-19 16:42 1338次阅读