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

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

3天内不再提示

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

安芯教育科技 来源:安谋科技学堂 2023-03-16 13:38 次阅读

本文选自极术专栏《灵动MM32MCU》的文章,授权转自微信公众号灵动MM32MCU。本系列将介绍Cortex-M0中断控制知识

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

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

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

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

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

b2d89b92-c3bb-11ed-bfe3-dac502259ad0.png

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

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

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

NVIC具有以下特性:

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

  • 硬件嵌套中断支持

  • 向量化的异常入口

  • 中断屏蔽

一、中断使能和清除中断

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

b2fa2a32-c3bb-11ed-bfe3-dac502259ad0.png

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

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);
    }
}

二、中断挂起和清除挂起

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

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

b31139f2-c3bb-11ed-bfe3-dac502259ad0.png

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

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技术参考手册》。

在下一章节中,我们将和大家一起学习中断优先级的实现方式。

审核编辑 :李倩


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

    关注

    68

    文章

    18304

    浏览量

    222347
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16024

    浏览量

    343734
  • 系统控制
    +关注

    关注

    0

    文章

    33

    浏览量

    16156
收藏 人收藏

    评论

    相关推荐

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

    Controller)集成在Cortex-M0处理器里,它与处理器内核紧密相连,并且提供了中断控制功能以及对系统异常的支持。处理器的NV
    发表于 07-29 17:14

    灵动微课堂 (第176讲) | Cortex-M0中断控制系统控制(二)

    个外部中断都有个对应的优先级寄存器,Cortex-M0NVIC-IPR共有8个寄存器,而每个寄存器管理4个IRQ
    发表于 07-29 18:49

    灵动微课堂 (第178讲) | Cortex-M0中断控制系统控制(四)

    Cortex-M0系统控制块(SCB)是内核外设的主要模块之,提供系统控制以及系统执行信息,包括配置,
    发表于 08-06 14:49

    基于Cortex-M0中断系统的IP集成与中断服务函数设计

    为极术线上技术分享干货汇总(含PPT下载及视频回放及线下活动资料下载,持续更新,欢迎收藏~整理:极术社区集创赛Arm杯彭吉安-(集创赛)基于Cortex-M0中断系统的IP集成与中断
    发表于 12-14 07:15

    Cortex-M0中断控制系统控制(七)

    为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则,ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则。
    发表于 02-08 15:25 1次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>中断</b><b class='flag-5'>控制</b>和<b class='flag-5'>系统控制</b>(七)

    Cortex-M0中断控制系统控制(六)

    所有Arm指令都是可以有条件执行的,而Thumb指令仅有一条指令具备条件执行功能。Arm程序和Thumb程序可相互调用,相互之间的状态切换开销几乎为零。
    发表于 02-08 15:33 1次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>中断</b><b class='flag-5'>控制</b>和<b class='flag-5'>系统控制</b>(六)

    Cortex-M0中断控制系统控制(五)

    SysTick定时器即系统滴答定时器,也称“心跳定时器”,它是一个24 位的倒计数定时器,计到0 时,将从重装载寄存器中自动重装载定时初值。
    发表于 02-08 15:37 0次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>中断</b><b class='flag-5'>控制</b>和<b class='flag-5'>系统控制</b>(五)

    Cortex-M0中断控制系统控制(四)

    ARMv7-M和ARMv6-M都有的SCB寄存器名称相同,但是ARMv7-M寄存器数量和有效控制bit位比ARMv6-M丰富了不少。
    发表于 02-08 15:41 0次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>中断</b><b class='flag-5'>控制</b>和<b class='flag-5'>系统控制</b>(四)

    Cortex-M0中断控制系统控制(三)

    电平触发是外设的中断请求有持续的电平信号,若电平信号在处理器从ISR返回之前没有被取消,则中断返回后将再次触发已经服务过的中断
    发表于 02-08 15:44 0次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>中断</b><b class='flag-5'>控制</b>和<b class='flag-5'>系统控制</b>(三)

    Cortex-M0中断控制系统控制(二)

    每一个外部中断都有一个对应的优先级寄存器,Cortex-M0中NVIC-IPR共有8个寄存器,而每个寄存器管理4个IRQ中断,所以M0的IRQ中断源最多只支持32个,再加上16个内核
    发表于 02-08 15:48 2次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>中断</b><b class='flag-5'>控制</b>和<b class='flag-5'>系统控制</b>(二)

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

    处理器中的NVIC能够处理多个可屏蔽中断通道和可编程优先级,中断输入请求可以是电平触发,也可以是最小的一个时钟周期的脉冲信号。
    发表于 02-08 15:51 0次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>中断</b><b class='flag-5'>控制</b>和<b class='flag-5'>系统控制</b>(一)

    Cortex-M0中断控制系统控制

    Cortex-M0采用Armv6-M架构,优先级寄存器配置位有8位,但是有效位只有最高2位,这个地方很多人使用了Cortex-M3后一直也认为Cortex-M0也是最高3或4位有效位
    的头像 发表于 04-24 11:20 2643次阅读

    Cortex-M0中断控制系统控制知识点

    每一个外部中断都有一个对应的优先级寄存器,Cortex-M0中NVIC-IPR共有8个寄存器,而每个寄存器管理4个IRQ中断,所以M0的IRQ中断源最多只支持32个,再加上16个内核
    的头像 发表于 03-20 09:28 2351次阅读

    Cortex-M0中断控制系统控制之异常屏蔽寄存器PRIMASK

    电平触发是外设的中断请求有持续的电平信号,若电平信号在处理器从ISR返回之前没有被取消,则中断返回后将再次触发已经服务过的中断
    的头像 发表于 03-25 10:18 1842次阅读

    Cortex-M0系统控制块(SCB)介绍

    Cortex-M0系统控制块(SCB)是内核外设的主要模块之一,提供系统控制以及系统执行信息,包括配置,控制,上报
    的头像 发表于 03-25 15:14 3500次阅读