一文看懂STM32中断——记忆深刻

目录

一.基本概念

1.中断概述:

2.中断优先级:

3.优先级确定和嵌套规则:

二.中断控制


一.基本概念

1.中断概述:

        ARM cortex_m3 内核支持 256 个中断(16 个内核+240 外部)和可编程 256 级中断优先级的设置,而STM32 采用了 cortex_m3 内核,所以这部分仍旧保留使用,但 STM32并没有cortex_m3 内核全部的东西。STM32 目前支持的中断共为 84 个(16 个内核+68 个外部),和 16 级可编程的中断优先级的设置 (仅使用中断优先级设置 8bit 中的高 4 位)
     对于中断的概念,为了更方便大家的理解我们使用“中断通道”的概念,每个中断通道对应一个外围设备,该外围设备要想实现中断事件,必须通过该通道和内核建立联系。所以对该外围设备的通道开关,设定优先级等操作,就是实现对外围设备中断开关和优先级设置(个人理解有误望指正)。

2.中断优先级:

      stm32每个中断通道都具备自己的中断优先级控制字节 PRI_n(8 位,但在 STM32 中只使用 4 位,高 4 位有 效),每 4 个通道的 8 位中断优先级控制字(PRI_n)构成一个 32 位的优先级寄存(Priority Register)。68 个通道的优先级控制字至少构成 17 个 32 位的优先级寄存器,它们是 NVIC 寄存器中的一个重要部分。 对于这 4bit 的中断优先级控制位还必须分成 2 组看:从高位开始,前面是定义抢先式优 先级的位,后面用于定义子优先级。4bit 的分组组合可以有以下几种形式:

编 号     分配情况
7             0:4                无抢先式优先级,   16 个子优先级
6             1:3                2 个抢先式优先级,8 个子优先级
5             2:2                4 个抢先式优先级,4 个子优先级
4             3:1                8 个抢先式优先级,2 个子优先级
3/2/1/0    4:0               16 个抢先式优先级,无子优先级
    在一个系统中,通常只使用上面 5 种分配情况的一种,具体采用哪一种,需要在初始化时写入到一个 32 位寄存器 AIRC(Application Interrupt and Reset Control Register)的第[10:8]这 3 个位中。这 3 个 bit 位有专门的称呼:PRIGROUP。这些工作需要在 AIRC 中的 PRIGROUP设置完成后,确定了整个系统所具有的优先级个数后,再分别对每个中断通道(设备)进行设置。

3.优先级确定和嵌套规则:

(1)只能高抢先优先级的中断可以打断低抢先优先级的中断服务,构成中断嵌套;
(2) 当 2(n)个相同抢先优先级的中断出现,它们之间不能构成中断嵌套,但 STM32 首
     先响应子优先级高的中断;
(3) 当 2(n)个相同抢先优先级和相同子优先级的中断出现,STM32 首先响应中断通道
     所对应的中断向量地址低的那个中断.
具体一点:
      0 号抢先优先级的中断,可以打断任何中断抢先优先级为非 0 号的中断;1 号抢先优先
级的中断,可以打断任何中断抢先优先级为 2、3、4 号的中断;……;构成中断嵌套。
如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出
现(或挂在那里等待),就看它们 2 个谁的子优先级高了,如果子优先级也相同,就看它们
的中断向量位置了。

二.中断控制

1.对于 STM32 讲,外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2
本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢)、输入捕获、输出匹配、DMA 申请等。所有 TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提
出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的、不同的、中断申请呢?
2.cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单独的和总
的控制该中断通道。它们包括有:
(1)  中断优先级控制字:PRI_n(上面提到的)
(2) 中断允许设置位:在 ISER 寄存器中
(3) 中断允许清除位:在 ICER 寄存器中
(4) 中断悬挂 Pending(排队等待)位置位:在 ISPR 寄存器中(类似于置中断通道标志位)
(5) 中断悬挂 Pending(排队等待)位清除:在 ICPR 寄存器中(用于清除中断通道标志位)
(6) 正在被服务(活动)的中断(Active)标志位:在 IABR 寄存器中,(只读,可以知道当
前内核正在处理哪个中断通道)
3.作为外围设备 TIME2 本身也包括更具体的,管理自己不同中断的中断控制器(位),它们
主要是自身各个不同类型中断的允许控制位,和各自相应的中断标志位(这个在 STM32 的手
册中有详细的说明了)。
4.中断控制过程:
第一.初始化过程:
(1)首先要设置寄存器 AIRC 中 PRIGROUP 的值,规定系统中的抢先优先级和子优先级数 
   (在 4 个 bits 中占用的位数);
(2) 设置 TIME2 本身的寄存器,允许相应的中断,如允许 UIE(TIME2_DIER 的第[0]位)
(3) 设置 TIME2 中断通道的抢先优先级和子优先级(IP[28] ,在 NVIC 寄存器组中)
(4) 设置允许 TIME2 中断通道。 在 NVIC 寄存器组的 ISER 寄存器中的一位。
第二.中断响应过程:
(1)当 TIME2 的 UIE 条件成立(更新,上溢或下溢),硬件将 TIME2 本身寄存器中 UIE 中断
    标志置位,然后通过TIME2中断通道向内核申请中断服务。
(2)此时内核硬件将 TIME2 中断通道的 Pending 标志置位(相当与中断通道标志置位),表
    示 TIME2 有中断申请。
(3)如果当前有中断在处理,TIME2 的中断级别不够高,那么就保持 Pending 标志,当然用
    户可以在软件中通过写 ICPR 寄存器中相应的位把本次中断清除掉。
(4)当内核有空,开始响应 TIME2 的中断,进入 TIME2 的中断服务。此时硬件将 IABR 寄存器中相
    应的标志位置位,表示 TIME2 中断正在被处理。同时硬件清除 TIME2 的 Pending 标志位。
第三. 执行 TIME2 的中断服务程序
       所有 TIME2 的中断事件,都是在一个 TIME2 中断服务程序中完成的,所以进入中断程序
后,中断程序需要首先判断是哪个 TIME2 的具体事件的中断,然后转移到相应的服务代码段
去。 注意不要忘了把该具体中断事件的中断标志位清除掉,硬件是不会自动清除 TIME2 寄存
器中具体的中断标志位的。
      如果 TIME2 本身的中断事件多于 2 个,那么它们服务的先后次序就由用户编写的中断服
务决定了。换句话说,对于 TIME2 本身的多个中断的优先级,系统是不能设置的。所以用户
在编写服务程序时,应该根据实际的情况和要求,通过软件的方式,将重要的中断优先处理
掉。 当然你也可以每次中断服务只处理其中的一个,然后再次进入中断,处理下一个。
第四. 中断返回
内核执行完中断服务后,便进入中断返回过程,在这个过程中需要:
(1)硬件将 IABR 寄存器中相应的标志位清另,表示该中断处理完成
(2)如果 TIME2 本身还有中断标志位置位,表示 TIME2 还有中断在申请,则重新将 TIME2
     的 Pending 标志置为 1,等待再次进入 TIME2 的中断服务。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TaoHeng728

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值