STM32中断相关概念阐述


未完待续。。。

想完整的写完并写清楚不容易,修修改改ing。。。


注:本文以STM32F1系列为例,F1系列为Cortex M3内核。


目录

  • STM32中断相关概念阐述
    • 1、STM32 CM3 中断阐述
    • 2、优先级的定义
    • 3、中断优先级分组
    • 4、特殊寄存器(PRIMASK、FAULTMASK、BASEPRI)开关中断设置

1、STM32 CM3 中断阐述

ARM Cortex M3内核支持256个中断(16个内核中断+240个外部中断),与其相关的中断控制寄存器和中断优先级控制寄存器(NVIC、SYSTICK)也都属于Cortex M3内核的一部分。

16分内部中断如下图:

STM32使用了ARM Cortex M3内核并对其进行了裁减,使之在原本支持240个外部中断裁减变成了68个外部中断,外加内部的16个中断,一共16+68=84个中断。

现在知道了STM32一共84个中断,那么在实际使用的时候怎么对它进行管理的呢?

这就引入了中断优先级的概念。


2、优先级的定义

名词:NVIC(Nested vectored interrupt controller),嵌套向量中断控制器。

  • CM3内核使用NVIC来管理中断;
  • CM3中优先级的数值越小,优先级越高,支持256级中断(所以CM3配置中断优先级的寄存器是8bit的);
  • CM3 支持中断嵌套,使得高优先级异常会抢(preempt)低优先级异常。
  • CM3有3个系统异常:复位,NMI 以及硬 fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。除了这三个,其它异常的优先级则都是可编程的(但不能编程为负数)。

CM3最大支持到了256个等级的中断优先级但是实际上用不到这么多,所以大多数采用了M3内核的芯片会对其进行精简设计,ST就是裁掉了这个寄存器的低4bit,只用高4bit来表示优先级,以达到减少优先级数的目的,而4bit所能代表的最大数就是16,所以说STM32支持16级的可编程中断。

CM3的240个外部中断都有自己的中断优先级配置寄存器PRI_n,这个寄存器是8位的,每4个相邻的中断优先级寄存器拼成一个32位的寄存器。这是NVIC的重要组成部分。

而STM32只支持68个外部中断,在NVIC控制结构中虽然体现了240个,但是实际用不到这么多,如下图是STM32的NVIC控制结构(STM32裁掉了这个寄存器的低4bit,只用高4bit来表示优先级等级)。

所以你可以看到在STM32标准库函数NVIC_Init函数内配置外设的优先级的时候,这里对优先级进行了左移4位的操作:


3、中断优先级分组

NVIC中有一个寄存器是“应用程序中断及复位控制寄存器“(AIRCR),它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段: MSB 所在的位段(左边的)对应抢占优先级,而 LSB 所在的位段(右边的)
对应亚优先级,如下图:

SCB->AIRCR寄存器的[10:8]位是用来设置中断优先级分组的,通过这3位的配置,可以对IP(中断优先级)寄存器的[7:4]进行优先级的管理,例如:

  • 将AIRCR的10:8位写成101,那么IP寄存器的[7:4]这四个bit,[7:6]用来表示抢占优先级,[5:4]用来表示响应优先级。
  • 将AIRCR的10:8位写成011,那么IP寄存器的[7:4]这四个bit都用来表示抢占优先级,无响应优先级,4bit做能代表的范围是0~15,所以优先级的设置就是0-15级,这个分组模式通常用于RTOS,例如FreeRTOS。

4、特殊寄存器(PRIMASK、FAULTMASK、BASEPRI)开关中断设置

这三个寄存器用来开关中断用,只能在特权模式下进行访问,不过CMSIS提供了函数能够在C环境中进行调用。这三个寄存器描述如表(摘自CM3权威指南):

  • PRIMASK(优先级屏蔽寄存器)
    这个寄存器只有1bit,如果设置为1,除了NMI和Hard Fault中断被允许外,其他中断全部被屏蔽,默认为0;
    CMSIS提供的C环境中操作该寄存器:

    __set_PRIMASK(1);  /* 屏蔽中断 */
    __set_PRIMASK(0);  /* 取消屏蔽 */`
    
  • FAULTMASK(断层屏蔽寄存器)
    这个寄存器也是只有1bit,如果设置为1,除了NMI中断被允许,其他全部中断包括Hard Fault中断也被屏蔽,默认为0;
    CMSIS提供的C环境中操作该寄存器:

    __set_FAULTMASK(1);  /* 屏蔽中断 */`
    __set_FAULTMASK(0);  /* 取消屏蔽 */
    
  • BASEPRI(基本优先级屏蔽寄存器):这个寄存器能够提供更精细化的中断屏蔽,往这个寄存器里写一个值,可以屏蔽比该优先级值低的中断,在CM3中,这个寄存器只用到了[7:4]这四个位,这与IP寄存器是一致的;(下图摘自PM0056-STM32编程手册)
    CMSIS提供的C环境接口如下:

       __set_BASEPRI(0x50);   /* 屏蔽优先级小于5的中断 */__get_BASEPRI();       /* 获取当前屏蔽的优先级等级 */
    

    FreeRTOS就是使用了该寄存器来管理中断,屏蔽相应的中断进行临界区资源保护,而不是关全部中断。

补充①:除了使用以上寄存器开关中断,CMSIS还提供了另外的开关中断的接口:

__enable_irq();    /* 关全部中断,操作的是PRIMASK */
__disable_irq();   /* 开全部中断,操作的是PRIMASK*/
__enable_frq();    /* 关全部中断,操作的是FAULTMASK */
__disable_frq();   /* 开全部中断,操作的是FAULTMASK*/

补充②:ARM的汇编指令CPS,全称Change Processor State,改变处理器状态。

IE:Interrupt or abort enable. 中断使能

ID: Interrupt or abort disable. 关闭中断

利用该指令来快速开关中断:

cpsid i,关闭中断,实际操作的是PRIMASK

cpsie i,开启中断,实际操作的是PRIMASK

cpsid f,关闭中断,实际操作的是FAULTMASK

cpsie f,开启中断,实际操作的是FAULTMASK

STM32中断相关概念阐述相关推荐

  1. STM32中断与DMA通信编程

    文章目录 一.中断与DMA通信原理 1.中断 2.DMA通信原理 二.中断控制LED灯点亮熄灭 1.新建工程 2.配置外部中断 3.配置中断优先级 4.完成创建 5.编写中断函数 6.程序烧录 7.运 ...

  2. STM32中断应用总结

    STM32中断应用总结 STM32中断很强大,STM32中断可以嵌套,任何外设都可以产生中断,其中中断和异常是等价的. 中断执行流程: 主程序执行过程可以产生中断去执行中断的内容(保护现场),然后在返 ...

  3. STM32中断中调用OLED显示出现OLED花屏

    STM32中断中调用OLED显示出现OLED花屏 在TIM5中断处理函数中,我写了OLED显示,经过DEBUG发现程序执行到OLED显示语句的时候,OLED就会花屏. //中断服务处理函数 void ...

  4. STM32——中断、EXTI、按键中断实验

    STM32中断--总结及实操 一.中断是什么? 1.1 中断的含义 1.2 中断的作用(了解即可) 1.3 中断的流程 二.中断资源 2.1 NVIC中断控制器 2.2 NVIC寄存器 三.优先级的概 ...

  5. STM32中断回调函数定时器-STM32电控学习笔记06

    STM32中断&定时器-STM32电控学习笔记06 day6:2022/9/24 [中断概述] 在 STM32 中,对信号的处理可以分为轮询方式和中断方式,轮询方式就是不断去访问一个信号的端口 ...

  6. STM32中断笔记——关于NVIC的两个问题

    STM32 中断非常强大,每个外设都可以产生中断,中断也是STM32非常重要的一个内容. NVIC:嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能. ARM corte ...

  7. 【嵌入式基础】STM32中断及DMA通信原理编程

    本文主要学习stm32中断.DMA通信原理和编程方法.使用stm32tubemx和HAL库分别完成中断模式编程和串口通信中断实验. 目录 一.STM32中断,DMA通信原理编程 1.STM32中断 ( ...

  8. 第四篇,STM32中断控制编程

    1.中断概念 中断指的是在计算机工作期间,出现了需要立即停止正在运行的程序,转而去处理意外发生的情形.发生中断之后,CPU会去执行事先写好的处理中断的代码,处理完成后回到被打断的位置继续执行. 编写中 ...

  9. HAL库设置STM32中断

    本次博客知识来自于韦东山老师的7天物联网课程. 一.中断的含义 通常,把CPU内部产生的紧急事件叫做异常,比如非法指令(除零).地址访问越界等:把来自CPU外部的片上外设产生的紧急事件叫做中断,比如G ...

最新文章

  1. c c++常用算法手册(第3版_嵌入式软件开发必看书籍推荐(C/C++/linux/软件)
  2. Linux下配置SSL (转)
  3. jQuery源码分析-each函数
  4. OO实现ALV TABLE 三:ALV的功能设计
  5. 网际协议:动态主机配置协议(DHCP)和NAT
  6. VTK:网格之ElevationFilter
  7. linux函数的阻塞与非阻塞IO及错误处理
  8. php快速开发框架津县,BetePHP:一个轻量级快速开发框架
  9. devops对大会的看法_哪条建议对您在DevOps的职业生涯影响最大?
  10. Spring Cloud整合Nacos实现动态配置
  11. Pantera Capital合伙人:ETH已成为机构资产类别
  12. git21天打卡Day2-注册账号
  13. nginx websocket wss 连接失败 failed_浅谈WebSocket协议、WS协议和WSS协议原理及关系
  14. Python数据结构与算法(2.1)——线性表的基本概念
  15. 使用migration创建表时,出错的解决方法
  16. 虚拟机VMware tools安装
  17. mysql改根用户_MySQL数据库中复位根用户密码的方法 | 很文博客
  18. 【IIS】修改注册表键值提升IIS的性能
  19. 盘点!AGV的12种导引导航方式
  20. RPL(4):RFC6550翻译(4)---RPL的通信流支持RPL实例

热门文章

  1. alembic 使用
  2. 分享灵动微预驱MCU单片机MM32SPIN580C
  3. Qt5.14.2移植到SOM-RK3399开发板上的问题解决办法
  4. 今日头条和今日头条极速版究竟有什么区别?
  5. Rails中多重子表多条件查询
  6. android pie风格,vivo NEX尝鲜Android“派”,系统风格更清新,AI应用更给力
  7. Matlab画常见信号函数一
  8. 79、ClimateNeRF: Physically-based Neural Rendering for Extreme Climate Synthesis
  9. Mysql异常'SET OPTION SQL_SELECT_LIMIT=DEFAULT'
  10. SOCKET通信中TCP数据包大小的确定