STM32 中断应用概览

本章参考资料《 STM32F4xx 中文参考手册》第十章-中断和事件、《ARM Cortex?-
M4F 技术参考手册》 -4.3 章节: NVIC 和 4.4 章节: SCB—4.4.5 的 AIRCR。
STM32 中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里
面去讲都不合适,这里单独抽出一章来做一个总结性的介绍,这样在其他章节涉及到中断
部分的知识我们就不用费很大的篇幅去讲解,只要示意性带过即可。
本章如无特别说明,异常就是中断,中断就是异常,请不要刻意钻牛角尖较劲。

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

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

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

NVIC 中断配置固件库
固件库文件 core_cm4.h 的最后,还提供了 NVIC 的一些函数,这些函数遵循 CMSI 规
则,只要是 Cortex-M4 的处理器都可以使用。

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

在配置每个中断的时候一般有 3 个编程要点:
1、 使能外设某个中断,这个具体由每个外设的相关中断使能位控制。比如串口有发送
完成中断,接收完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。
2、 初始化 NVIC_InitTypeDef 结构体,配置中断优先级分组,设置抢占优先级和子优
先级,使能中断请求

2) NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来
确定,具体参考表格 16 优先级分组真值表 。
3) NVIC_IRQChannelSubPriority:子优先级,具体的值要根据优先级分组来确定,具
体参考表格 16 优先级分组真值表 。
4) NVIC_IRQChannelCmd:中断使能( ENABLE)或者失能( DISABLE) 。操作的
是 NVIC_ISER 和 NVIC_ICER 这两个寄存器。
3、 编写中断服务函数
在启动文件 startup_stm32f429_439xx.s 中我们预先为每个中断都写了一个中断服务函
数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需
要我们重新编写,中断服务函数我们统一写在 stm32f4xx_it.c 这个库文件中。
关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就
在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,
并且在里面无限循环,实现不了中断。

best practice:

用中断优先级分组0或4最好,省去一大堆比较,谁小谁优先级高,相同看硬件中断表。

时间: 2024-10-29 00:12:12

STM32 中断应用概览的相关文章

STM32中断管理函数

CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 有76 个中断,包括16 个内核中断和60 个可屏蔽中断,具有16 级可编程的中断优先级. 而我们常用的就是这60 个可屏蔽中断,所以我们就只针对这60 个可屏蔽中断进行介绍. 在 MDK 内,与NVIC 相关的寄存器,MDK 为其定义了如下的结构体: typedef struct { vu32 I

[stm32] 中断

1 #include "stm32f10x.h" 2 #include "stm32f10x_tim.h" 3 #include "misc.h" 4 #include "stm32f10x_gpio.h" 5 6 unsigned int CCR2_Val=45000; 7 extern void time_ini(void); 8 unsigned int capture1=0; 9 TIM_TimeBaseInitTyp

STM32中断控制的流程

对于 STM32 讲(还是以Timer2例),外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢) .输入捕获.输出匹配.DMA 申请等.所有TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的.不同的.中断申请呢? 1.因为cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单

stm32中断 抢占优先级 和 响应优先级 有什么区别

与51不同,stm32的中断分类更灵活.51只是按先后顺序大小排列互相打断. stm32中多了响应优先级这一概念. stm32的中断分为 1.抢占(占先)优先级. 2.响应优先级. 1.抢占优先级.抢占优先级高的中断,可以打断抢占优先级低的中断. 2.响应优先级.抢占优先级相同的中断,响应优先级高的可以优先执行. 也许会有疑问:抢占优先级相同的中断,响应优先级高的不可以打断响应优先级低的中断.两个中断肯定是谁先来了就相应谁,两个中断不可能同时来.响应优先级又有何用呢. 其实,响应优先级主要给出了

6.SysTick系统时钟滴答实验(stm32中断入门)

系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难度并不高,但是理解起来还是比较复杂的,我会在本文中从实际应用出发去说明,当然最好去仔细研读宋岩翻译的<Cortex-M3权威指南>第八章,注意这不是一本教你如何编写STM32代码的工具书,而是阐述Cortex-M3内核原理的参考书,十分值得阅读. SysTick系统时钟的核心有两个,外设初始化和S

STM32中断定时,控制LED灯

1 #include "led.h" 2 3 void TIM3_Int_Init(u16 arr,u16 psc) 4 { 5 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 6 NVIC_InitTypeDef NVIC_InitStructure; 7 8 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //设置TIM3时钟使能 9 10 11 TIM_TimeBaseStru

STM32中断触发

使用PB1作为外部中断触发,按一次按键灯处于亮状态,在按一次灯灭. 1.先配置GPIO端口.复用管脚外设时钟使能GPIO_Config(); void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_APB2Per

STM32中断系统

1.中断介绍:    1.1 中断概念 CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂 时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序 或中断处理程                 序),以处理该事件,该事件处理完后又返回被中断的程序 继续执行,这一过程称为中断.引发中断的称为中断源.比如:看电视 时突然门铃响,那么门铃响就相当于中           断源.有些中断还能够被其他高 优先级的中断所中断,那么这种情况又叫做中断的嵌套.           

STM32中断

中断响应配置