【STM32 LL库编程】外部中断与中断管理

发布者:CreativeMind最新更新时间:2025-01-02 来源: jianshu关键字:STM32  外部中断  中断管理 手机看文章 扫描二维码
随时随地手机看文章

0x01 > 什么是中断

         所谓中断就是指CPU正处于工作状态时,外部发生了某一事件(按键按下),请求CPU进行处理,于是 CPU暂时中断当前的工作,转而处理所发生的的事件,处理完毕在回到原来被中断的地方继续工作,这样的过程被称为中断

中断示意图


中断包括以下几部分


  • 中断源

  • 中断申请

  • 开放中断

  • 保护现场

  • 中断服务

  • 恢复现场

  • 中断返回

我们知道 传统的51单片机一共有 5 个中断源,它们分别为:

  1. 外部中断0

  2. 定时器0

  3. 外部中断1

  4. 定时器1

现在正在学习的 STM32 有多少中断呢?

0x02 > STM32  中断基础知识

  • Cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。

  • STM32 只有84个中断,包括16个内核中断和68个可屏蔽中断

  • STM32 上只有60个可屏蔽中断,f107上才有68个中断

  • 先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。

  • 次占优先级,也就是响应优先级,只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套。 如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。

   0x001 >> 嵌套向量中断控制器 (NVIC)

    STM32 的中断既然有这么多,那么要怎么管理呢?
ST也给了我们一些解决方案就是 使用 嵌套中断向量控制器 NVIC,NVIC属于内核级的寄存器,所以当我们需要查询 NVIC 相关定义 应该到 core_cm3.h 中(这里讲解的芯片是 STM32F103ZE 是基于 Coretex-M3)

/* 访问嵌套向量中断控制器 (NVIC)的结构类型 */

typedef struct

{

  __IOM uint32_t ISER[8U];               /* 中断使能寄存器 */

        uint32_t RESERVED0[24U];

  __IOM uint32_t ICER[8U];               /* 中断清除寄存器 */

        uint32_t RSERVED1[24U];

  __IOM uint32_t ISPR[8U];               /* 中断悬起寄存器 */

        uint32_t RESERVED2[24U];

  __IOM uint32_t ICPR[8U];               /* 中断清空悬起寄存器 */

        uint32_t RESERVED3[24U];

  __IOM uint32_t IABR[8U];               /* 中断有效位寄存器 */

        uint32_t RESERVED4[56U];

  __IOM uint8_t  IP[240U];               /* 中断优先级寄存器(8Bit wide) */

        uint32_t RESERVED5[644U];

  __OM  uint32_t STIR;                   /* 软件触发中断寄存器 */

}  NVIC_Type;


   0x002 >> 中断优先级定义 ☆

中断优先级设定寄存器


coretex-M3 内核的中断定义寄存器的宽度是8位的,在上图中,我们能看到ST在设计中断的时候只使用了高4位 [7:4]

The processor  implements only bits[7:4] of each field, bits[3:0] read as zero and ignore writes.
处理器只实现每个字段的位[7:4],位[3:0]读为零,忽略写。

ST在上述分组中,ST还将中断分成了主优先级(抢占优先级)和子优先级(响应优先级)。对应的寄存器


优先级分组寄存器


优先级组

上图就是,优先级分组寄存器和对应的优先级分组,下面来简单的总结一下优先级分组怎么用。


优先级分组

/* LL 库中断优先级分组,选项和实现 */


#define NVIC_PRIORITYGROUP_0         ((uint32_t)0x00000007) /*!< 0 bit  for pre-emption priority,

                                                                 4 bits for subpriority */

#define NVIC_PRIORITYGROUP_1         ((uint32_t)0x00000006) /*!< 1 bit  for pre-emption priority,

                                                                 3 bits for subpriority */

#define NVIC_PRIORITYGROUP_2         ((uint32_t)0x00000005) /*!< 2 bits for pre-emption priority,

                                                                 2 bits for subpriority */

#define NVIC_PRIORITYGROUP_3         ((uint32_t)0x00000004) /*!< 3 bits for pre-emption priority,

                                                                 1 bit  for subpriority */

#define NVIC_PRIORITYGROUP_4         ((uint32_t)0x00000003) /*!< 4 bits for pre-emption priority,

                                                                 0 bit  for subpriority */


/**

  brief   Set Priority Grouping

  details Sets the priority grouping field using the required unlock sequence.

           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.

           Only values from 0..7 are used.

           In case of a conflict between priority grouping and available

           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.

  param [in]      PriorityGroup  Priority grouping field.

 */

__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)

{

  uint32_t reg_value;

  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */


  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */

  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */

  reg_value  =  (reg_value                                   |

                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |

                (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) );               /* Insert write key and priority group */

  SCB->AIRCR =  reg_value;


假设我们有两个外设 外设A 和外设B 我们将 两个外设的主优先级都配置为 0,将外设 A 的子优先级配置为 1,外设 B 的子优先级配置为 2,。当它们的中断请求同时到来时,内核将如何执行?

内核将比较两个外设的主优先级,如果外设的主优先级相等,就会对子优先级进行比较,子优先级越高,子优先级的数字就越小。

令人头痛的问题,如果外设的主优先级、子优先级都相同,怎么判断?

如果外设的主优先级和子优先级都相等,那么将会对硬件中断编号进行比较

硬件编号在哪?

硬件编号 位于 《STM32 中文参考手册_V10》第九章 中断和事件 第9.1.2小节 中断和异常向量表

0x03 > 总结

以上就是 关于 STM32F103ZE 的外部中断与中断管理的理论部分。这篇文章可能会让你感到晦涩难懂,或者有漏洞,那是在所难免的问题。


关键字:STM32  外部中断  中断管理 引用地址:【STM32 LL库编程】外部中断与中断管理

上一篇:STM32代码的启动过程
下一篇:如何在 VScode 创建 stm32 项目?

推荐阅读最新更新时间:2026-03-23 11:53

STM32 LL编程外部中断中断管理
0x01 什么是中断 所谓中断就是指CPU正处于工作状态时,外部发生了某一事件(按键按下),请求CPU进行处理,于是 CPU暂时中断当前的工作,转而处理所发生的的事件,处理完毕在回到原来被中断的地方继续工作,这样的过程被称为中断 中断示意图 中断包括以下几部分 中断源 中断申请 开放中断 保护现场 中断服务 恢复现场 中断返回 我们知道 传统的51单片机一共有 5 个中断源,它们分别为: 外部中断0 定时器0 外部中断1 定时器1 现在正在学习的 STM32 有多少中断呢? 0x02 STM32 中断基础知识 Cortex-m3支持256个中断,其中包含了16个内核中断,240个
[单片机]
STM32】NVIC中断优先级管理中断向量表)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第9章 中断和事件 Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断(异常)和68个可屏蔽中断,具有16级可编程的中断优先级。而STM32F103系列上面,16个内核中断(异常)不变,而可屏蔽中断只有60个(在107系列才有68个)。 注意一下:CM3的外部中断和STM32的外部中断不是一个概念。CM3:除了内核异常之外的都是外部中断;STM32:外部中断EXTI只有6个
[单片机]
【<font color='red'>STM32</font>】NVIC<font color='red'>中断</font>优先级<font color='red'>管理</font>(<font color='red'>中断</font>向量表)
学习stm32时踩平的一个坑:#223-D: function "EXTI_Init" declared implicitly
最近买了板子,跟着正点原子的电子资料学习stm32。学到外部中断时出现这样一个问题: 如图代码提示有问题,编译后出现警告: main.c(25): warning: #223-D: function EXTI_Init declared implicitly 编译可以通过,代码下载运行也没有问题。可作为一个完美主义者,有警告就要消灭。不然感觉很不爽。对不? 这种情况下,通常是由于文件包含出了问题。可是我的代码跟他的几乎一样。文件包含的关系也相关简单,不太可能出问题。 第一步:我下载正点原子的代码编译,没有问题。 第二步:我把他的代码复制到我的文件中,编译问题依旧。 第三步:代码一样,那就是我的文件命名的问题了。改了文件的
[单片机]
学习<font color='red'>stm32</font>时踩平的一个坑:#223-D: function EXTI_Init" declared implicitly" />
STM32一文通(6) 外部中断
一. 外部中断/事件控制器 (EXTI) 什么是中断?中断就是打断程序执行顺序的外部输入 什么是事件?事件是外部输入会触发的事件.比如唤醒 EXTI是专门控制外部中断/事件的控制器 简单来讲 EXTI有20根外部输入线, 这20根外部中断线可以选择特定的一个输入源给EXTI输入中断信号(见下图) EXTI能设定是中断还是事件 EXTI能控制是上升沿还是下降沿触发 并能使能/失能 关于20根输入线: 二. 初始化 EXTI控制器 //EXTI_Init() 使用EXTI要先用RCC初始化 APB2上的AFIO //开启EXTI时钟 RCC_APB2PeriphClockCmd(RCC_APB2P
[单片机]
stm32 HAL开发-EXTI外部中断编程
1 编写流程 如下图所示,作用于外部IO口的信号,实际上经过三个部分进入NVIC控制器:GPIO、EXTI控制器、NVIC控制器。 我们在程序配置中也需要对这三个部分依次设置。 2 外部中断实验 实验设计 Nuelco-F091RC开发板的PA10引脚配置上拉电阻并配置下降沿中断,PA10外接一按键用于接地触发中断。 开发板PB3引脚配置为推挽输出并外接LED灯泡,外部中断服务函数将PB3引脚电平翻转从而控制LED亮灭。 实验程序 宏定义LED和按键的引脚和端口 声明并定义两个部分的初始化函数 一定要记得开时钟,这是Stm32与AVR非常不一样的地方, KEY_EXTI_Init()函数中最后要配置NVIC
[单片机]
STM32的IO外部中断EXTI的使用
一、前言 在之前针对 STM32 的G PI O相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读 信号 引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取 检测 操作,除了轮询的方式访问输入引脚,还可以通过另外一种叫做外部中断的方式来对引脚的输入信号进行检测,本篇首先介绍下EX TI 的结构,接着介绍外部中断的相关概念,对STM32的IO外部中断EXTI有个初步的了解,在此基础上重点围绕IO外部中断EXTI的使用展开分析。 图1 外部中断设计 二、EXTI结构 EXTI(Ex te rnal interrupt/event controller)—外部中断/事件 控制器 ,管理了控制器的
[单片机]
<font color='red'>STM32</font>的IO<font color='red'>外部中断</font><font color='red'>EXTI</font>的使用
STM32单片机学习总结之中断EXTI (External interrupt)
学习内容: EXTI (External interrupt) 就是指外部中断,通过GPIO 检测输入脉冲,引起中断事件,打断原来的代码执行流程,进入到中断服务函数中进行处理,处理完后,再返回到中断之前的代码中执行。 1、能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,编号为0~15 的称为内核异常,而16 以上的则称为外部中断(外,相对内核而言),这个表就称为中断向量表。把编号从-3 至6 的中断向量定义为系统异常,编号为负 的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断 (NMI)、硬错误(Hardfault)。从编号7 开始的为外部中断,
[单片机]
<font color='red'>STM32</font>单片机学习总结之<font color='red'>中断</font><font color='red'>EXTI</font> (External interrupt)
STM32EXTIEXTI和NVIC的关系
关于EXTI 1.什么是EXTI? EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 先看EXTI框图: 1.1产生中断线路流程 ①输入线,EXTI 控制器有 20 个中断/事件输入线,可以通过寄存器设置为任意一个 GPIO,也可以是一些外设的事件,输入线一般是存在电平变化的信号。 ②边沿检测电路,EXTI 可以对触发方式进行选择,通过上升沿触发选择寄
[单片机]
<font color='red'>STM32</font>中<font color='red'>EXTI</font>,<font color='red'>EXTI</font>和NVIC的关系
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved