第16章 STM32中断应用概览

发布者:快乐舞蹈最新更新时间:2024-10-08 来源: cnblogs关键字:STM32  中断应用 手机看文章 扫描二维码
随时随地手机看文章

本章参考资料《STM32F76xxx参考手册》第十一章-中断和事件、《Cortex?-M7内核编程手册》-4.2章节:NVIC和4.4章节:SCB—4.3.5的AIRCR。

STM32中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里面去讲都不合适,这里单独抽出一章来做一个总结性的介绍,这样在其他章节涉及到中断部分的知识我们就不用费很大的篇幅去讲解,只要示意性带过即可。

本章如无特别说明,异常就是中断,中断就是异常,请不要刻意钻牛角尖较劲。


16.1  异常类型

F767在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。其中系统异常有10个,外部中断有110个。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件stm32f767xx.h这个头文件查询到,在IRQn_Type这个结构体里面包含了F7系列全部的异常声明。

表格 12  F767系统异常清单

编号

优先级

优先级类型

名称

说明

地址


-

-

-

保留(实际存的是MSP地址)

0X0000 0000


-3

固定

Reset

 复位

0X0000 0004


-2

固定

NMI

不可屏蔽中断。 RCC 时钟安全系统
(CSS) 连接到 NMI 向量

0X0000 0008


-1

固定

HardFault

所有类型的错误

0X0000 000C


0

可编程

MemManage

存储器管理

0X0000 0010


1

可编程

BusFault

预取指失败,存储器访问失败

0X0000 0014


2

可编程

UsageFault

未定义的指令或非法状态

0X0000 0018


-

-

-

保留

0X0000 001C-

0X0000 002B


3

可编程

SVCall

通过 SWI 指令调用的系统服务

0X0000 002C


4

可编程

Debug Monitor

调试监控器

0X0000 0030


-

-

-

保留

0X0000 0034


5

可编程

PendSV

可挂起的系统服务

0X0000 0038


6

可编程

SysTick

系统嘀嗒定时器

0X0000 003C

表格 13 F767外部中断清单

编号

优先级

优先级类型

名称

说明

地址

0

7

可编程

-

窗口看门狗中断

0X0000 0040

1

8

可编程

PVD

连接EXTI 线的可编程电压检测中断

0X0000 0044

2

9

可编程

TAMP_STAMP

连接EXTI 线的入侵和时间戳中断

0X0000 0048

中间部分省略,详情请参考STM32F76xxx参考手册》第十章-中断和事件-向量表部分

103

110

可编程

SDMMC2

SDMMC2全局中断

0X0000 0190

104

111

可编程

CAN3_TX

CAN3 TX中断

0X0000 0194

105

112

可编程

CAN3_RX0

CAN3  RX0中断

0X0000 0198

106

113

可编程

CAN3_RX1

CAN3  RX1中断

0X0000 019C

107

114

可编程

CAN3_SCE

CAN3  SCE中断

0X0000 01A0

103

110

可编程

SDMMC2

SDMMC2全局中断

0X0000 0190

104

111

可编程

CAN3_TX

CAN3 TX中断

0X0000 0194

16.2  NVIC简介

在讲如何配置中断优先级之前,我们需要先了解下NVIC。NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M7内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是Cortex-M7的NVIC的一个子集。

16.2.1  NVIC寄存器简介

在固件库中,NVIC的结构体定义可谓是颇有远虑,给每个寄存器都预览了很多位,恐怕为的是日后扩展功能。不过STM32F767可用不了这么多,只是用了部分而已,具体使用了多少可参考《Cortex?-M7内核编程手册》-4.2:NVIC寄存器映射。

代码 12 NVIC结构体定义,来自固件库头文件:core_cm7.h


点击(此处)折叠或打开

  1. 1 typedef struct {

  2.  2 __IO uint32_t ISER[8U]; // 中断使能寄存器

  3.  3 uint32_t RESERVED0[24U];

  4.  4 __IO uint32_t ICER[8U]; // 中断清除寄存器

  5.  5 uint32_t RSERVED1[24U];

  6.  6 __IO uint32_t ISPR[8U]; // 中断使能悬起寄存器

  7.  7 uint32_t RESERVED2[24U];

  8.  8 __IO uint32_t ICPR[8U]; // 中断清除悬起寄存器

  9.  9 uint32_t RESERVED3[24U];

  10. 10 __IO uint32_t IABR[8U]; // 中断有效位寄存器

  11. 11 uint32_t RESERVED4[56U];

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

  13. 13 uint32_t RESERVED5[644U];

  14. 14 __O uint32_t STIR; // 软件触发中断寄存器

  15. 15 } NVIC_Type


在配置中断的时候我们一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来设置中断优先级。


16.2.2  NVIC 中断配置固件库

固件库文件core_cm7.h的最后,还提供了NVIC的一些函数,这些函数遵循CMSIS规则,只要是Cortex-M7 的处理器都可以使用,具体如下:

表格 14 符合CMSIS标准的NVIC库函数

NVIC库函数

描述

void NVIC_EnableIRQ(IRQn_Type IRQn)

使能中断

void NVIC_DisableIRQ(IRQn_Type IRQn)

失能中断

void NVIC_SetPendingIRQ(IRQn_Type IRQn)

设置中断悬起位

void NVIC_ClearPendingIRQ(IRQn_Type IRQn)

清除中断悬起位

uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)

获取悬起中断编号

void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)

设置中断优先级

uint32_t NVIC_GetPriority(IRQn_Type IRQn)

获取中断优先级

void NVIC_SystemReset(void)

系统复位

这些库函数我们在编程的时候用的都比较少,甚至基本都不用。在配置中断的时候我们还有更简洁的方法,请看中断编程小节。

16.3  优先级的定义

16.3.1  优先级定义

在NVIC 有一个专门的寄存器:中断优先级寄存器NVIC_IPRx(在F767中,x=0...109)用来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数CM7芯片都会精简设计,以致实际上支持的优先级数减少,在F767中,只使用了高4bit,如下所示:

表格 15 F767 使用4bit表达优先级

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

用于表达优先级

未使用,读回为0

用于表达优先级的这4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。

16.3.2  优先级分组

优先级的分组由内核外设SCB的应用程序中断及复位控制寄存器AIRCR的PRIGROUP[10:8]位决定,F767分为了5组,具体如下:主优先级=抢占优先级

PRIGROUP[2:0]

中断优先级值PRI_N[7:4]

级数

二进制点

主优先级位

子优先级位

主优先级

子优先级

0b 011

0b xxxx

[7:4]

None

16

None

0b 100

0b xxx.y

[7:5]

[4]

8

2

0b 101

0b xx.yy

[7:6]

[5:4]

4

4

0b 110

0b x.yyy

[7]

[6:4]

2

9

0b 111

0b .yyyy

None

[7:4]

None

16

设置优先级分组可调用库函数HAL_NVIC_SetPriorityGrouping 实现,有关NVIC中断相关的库函数都在库文件stm32f7xx_hal_cortex.c和stm32f7xx_hal_cortex.h中。

代码 13 中断优先级分组库函数


点击(此处)折叠或打开

  1. 1 /**

  2.  2 * 配置中断优先级分组:抢占优先级和子优先级

  3.  3 * 形参如下:

  4.  4 * @arg NVIC_PriorityGroup_0: 0bit for抢占优先级

  5.  5 * 4 bits for 子优先级

  6.  6 * @arg NVIC_PriorityGroup_1: 1 bit for抢占优先级

  7.  7 * 3 bits for 子优先级

  8.  8 * @arg NVIC_PriorityGroup_2: 2 bit for抢占优先级

  9.  9 * 2 bits for 子优先级

  10. 10 * @arg NVIC_PriorityGroup_3: 3 bit for抢占优先级

  11. 11 * 1 bits for 子优先级

  12. 12 * @arg NVIC_PriorityGroup_4: 4 bit for抢占优先级

  13. 13 * 0 bits for 子优先级

  14. 14 * @注意 如果优先级分组为0,则抢占优先级就不存在,优先级就全部由子优先级控制

  15. 15 */

  16. 16 void NVIC_PriorityGroupConfig(uint32_t PriorityGroup)

  17. 17 {

  18. 18 // 检查参数

  19. 18 assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));

  20. 18 // 设置优先级分组

  21. 19 NVIC_SetPriorityGrouping(PriorityGroup);

  22. 20 }


表格 16 优先级分组真值表 


优先级分组

主优先级

子优先级

描述

NVIC_PriorityGroup_0

0

0-15

主-0bit,子-4bit

NVIC_PriorityGroup_1

0-1

0-7

主-1bit,子-3bit

NVIC_PriorityGroup_2

0-3

0-3

主-2bit,子-2bit

NVIC_PriorityGroup_3

0-7

0-1

主-3bit,子-1bit

NVIC_PriorityGroup_4

0-15

0

主-4bit,子-0bit

16.4  中断编程

在配置每个中断的时候一般有3个编程要点:

1、使用HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)函数配置中断优先级分组。一般默认是NVIC_PRIORITYGROUP_4分组4。

2、使用HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)函数配置具体外设中断通道的抢占优先级和子优先级。

3、使用HAL_NVIC_EnableIRQ函数使能中断请求。

代码 14 IRQn_Type中断源结构体


点击(此处)折叠或打开

  1. 1 typedef enum IRQn {

  2.  2 //Cortex-M7 处理器异常编号

  3.  3 NonMaskableInt_IRQn = -14,

  4.  4 MemoryManagement_IRQn = -12,

  5.  5 BusFault_IRQn = -11,

  6.  6 UsageFault_IRQn = -10,

  7.  7 SVCall_IRQn = -5,

  8.  8 DebugMonitor_IRQn = -4,

  9.  9 PendSV_IRQn = -2,

  10. 10 SysTick_IRQn = -1,

  11. 11 //STM32 外部中断编号

  12. 12 WWDG_IRQn = 0,

  13. 13 PVD_IRQn = 1,

  14. 14 TAMP_STAMP_IRQn = 2,

  15. 15

  16. 16 // 限于篇幅,中间部分代码省略,具体的可查看库文件stm32f767xx.h

  17. 17

  18. 18 SDMMC2_IRQn = 103,

  19. 19 CAN3_TX_IRQn = 104,

  20. 20 CAN3_RX0_IRQn = 105,

  21. 21 CAN3_RX1_IRQn = 106,

  22. 22 CAN3_SCE_IRQn = 107,

  23. 23 JPEG_IRQn = 108,

  24. 24 MDIOS_IRQn = 109

  25. 25 } IRQn_Type


     1)PreemptPriority:抢占优先级,具体的值要根据优先级分组来确定,具体参考表格 16 优先级分组真值表 。


2)SubPriority:子优先级,具体的值要根据优先级分组来确定,具体参考表格 16 优先级分组真值表 。

4、编写中断服务函数

在启动文件startup_STM32F767xx.s中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,中断服务函数我们统一写在stm32f7xx_it.c这个库文件中。

关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限循环,实现不了中断。


关键字:STM32  中断应用 引用地址:第16章 STM32中断应用概览

上一篇:stm32 PWM产生
下一篇:第4章 初识STM32

推荐阅读最新更新时间:2026-03-24 07:21

STM32中断标志位与中断挂起位详解:TIM_ClearFlag与TIM_ClearITPendingBit函数应用指南
1. 中断标志位(Interrupt Flag) 作用: 中断标志位位于外设寄存器中(如定时器的TIMx_SR、GPIO的EXTI_PR等),用于指示某个特定事件是否发生(例如定时器溢出、GPIO引脚电平变化)。该标志位由硬件自动置位,但通常需要软件手动清除。 对上一段文字解释:TIMx_SR:定时器(Timer)的 状态寄存器(Status Register)、EXTI_PR:(External Interrupt Pending Register)是外部中断/事件控制器(EXTI)的挂起寄存器(Pending Register),用于标识外部中断请求是否已触发但未被处理】 关键点: 事件触发:当外设检测到事件(如定时器
[单片机]
STM32 USART串口的应用 STM32中断系统专题讲解
STM32 ,从字面上来理解, ST 是 意法半导体 , M 是 M ic roelectronics 的缩写, 32 表示 32 位,合起来理解, STM32 就是指 ST 公司 开发的 32 位 微控制器 。在如今的 32 位 控制器 当中, STM32 可以说是最璀璨的新星,它受宠若娇,大受 工程师 和市场的青睐,无芯能出其右。 51 是嵌入式学习中一款入门级的精典 MCU ,因其结构简单,易于教学。 51诞生于 70 年代,属于传统的 8 位 单片机 ,如今,久经岁月的洗礼,既有其辉煌又有其不足。现在的市场 产品 竞争越来越激烈,对成本极其敏感,相应地对 MCU 的性能要求也更苛刻:更多功能,更低功耗,易用界面和多任务。面
[单片机]
<font color='red'>STM32</font> USART串口的<font color='red'>应用</font> <font color='red'>STM32</font><font color='red'>中断</font><font color='red'>系统</font>专题讲解
再造STM32---第十四部分:STM32 中断应用概览
本章参考资料《STM32F4xx 中文参考手册》第十章-中断和事件、《ARM Cortex™-M4F 技术参考手册》 -4.3 章节: NVIC 和 4.4 章节: SCB—4.4.5 的 AIRCR。STM32 中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里面去讲都不合适,这里单独抽出一章来做一个总结性的介绍,这样在其他章节涉及到中断部分的知识我们就不用费很大的篇幅去讲解,只要示意性带过即可。 本章如无特别说明,异常就是中断,中断就是异常,请不要刻意钻牛角尖较劲。 14.1 异常类型: F429 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。其中系统异常有
[单片机]
再造STM32---第十四部分:<font color='red'>STM32</font> <font color='red'>中断</font><font color='red'>应用</font>概览
第16章 STM32中断应用概览—零死角玩转STM32-F429系列
本章参考资料《STM32F4xx 中文参考手册》第十章-中断和事件、《 ARM Cortex™-M4F 技术参考手册》-4.3 章节:NVIC和4.4章节:SCB—4.4.5的AIRCR。 STM32中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里面去讲都不合适,这里单独抽出一章来做一个总结性的介绍,这样在其他章节涉及到中断部分的知识我们就不用费很大的篇幅去讲解,只要示意性带过即可。 本章如无特别说明,异常就是中断,中断就是异常,请不要刻意钻牛角尖较劲。 16.1 异常类型 F429在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中系统异常有10个,外部中断有91个。除了个别
[单片机]
第16章 <font color='red'>STM32</font><font color='red'>中断</font><font color='red'>应用</font>概览—零死角玩转STM32-F429系列
stm32之备份寄存器(BKP)应用(侵入检测中断
前言:很多的嵌入式设备使用过程中,当系统掉电时,往往需要把一些用户设置的参数保存起来,或者是将掉电前的一些状态信息保存,或者是统计系统重启次数。保存这些动态信息其实有很多种方法,第一种:在系统掉电前保存到片内flash,但是对flash的读写是按页操作,对于保存一些少量的数据来说并不合算。第二种:在系统掉电前保存在片外的EEPROM,可以根据需要选用合适的EEPROM存储的大小,但这样需要增加额外电路,增加成本。第三种:利用片内的备份寄存器里的后备数据寄存器存储。对于一些中、小型容量产品来说,有10个16位的数据后备寄存器。与前两种不同,它需要将引脚接上电池,否则数据会丢失。下面对备份寄存器深入了解。 1.备份寄存器的特性
[单片机]
<font color='red'>stm32</font>之备份寄存器(BKP)<font color='red'>应用</font>(侵入检测<font color='red'>中断</font>)
STM32 外部(IO)中断EXTI的应用
a) 目的:跟串口输入类似,不使用中断进行的IO输入效率也很低,而且可以通过EXTI插入按钮事件,本节联系EXTI中断。 b) 初始化函数定义: void EXTI_Configuration(void); //定义IO中断初始化函数 c) 初始化函数调用: EXTI_Configuration();//IO中断初始化函数调用简单应用: d) 初始化函数: void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义 EXTI_Cle
[单片机]
51单片机基础学习(十):定时器&中断应用
一、前期准备 1. 定时器工作模式的设置 由于定时器工作模式寄存器TMOD是不允许位寻址的,所以对在两个定时器模式的设置上存在的一些技巧进行介绍。 ① 直接对寄存器TMOD进行十六进制形式的赋值。 ② 对寄存器进行“按位与 按位或”形式的赋值。 例如:定时器1保持原来的工作方式,使定时器0工作在模式1下。(假设此时定时器1工作在模式0下) //方式1 TMOD = 0x01; //0000 0001 同时对两个定时器的工作模式进行设置 AI运行代码 //方式2 TMOD = TMOD & 0xF0; //1111 0000 将TMOD的低4位清零,高4位保持不变。 TMOD = TM
[单片机]
#C51按键处理(外部中断应用
前言 了解外部中断触发方式及响应处理 样例:外部中断INT0 && INT1处理按键事件 提示:以下是本篇文章正文内容,下面案例可供参考 一、场景 样例功能:INT0按下计数+1,INT1按下计数-1,显示范围0~9999 二、编程实现 1.主函数: 开机界面显示默认初值1234,3s后进入按键检测,默认0000 变量PowerOnTimeCnt 在T0定时中断服务函数中执行++ void main() { INIT(); EA = 1; while(PowerOnTimeCnt 3000) //开机画面1234后开始显示0000,按键处理 { P1 = 0Xfe; //t
[单片机]
#C51按键处理(外部<font color='red'>中断</font>的<font color='red'>应用</font>)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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