实现目标
1、掌握STM32的中断知识
2、学会STM32CubeMX软件关于中断的配置
3、具体目标:1、外部中断检测按键,每按一次计一次数,满5次LED1状态取反。
一、中断概述
1.1、中断定义
CPU执行程序时,由于发生了某种随机的事件(包括外部或内部),让CPU暂时停下正在运行的程序,转而去执行一段处理事件的程序(中断服务子程序或中断处理程序),当这段程序执行完时(事件处理完时),程序又返回被停下的程序继续执行,这一过程称为中断。引发中断的称为中断源。中断可分为外部中断和内部中断。
中断程序执行中又出现了中断,那么这种情况又叫做中断嵌套。
1.2、中断的作用和意义
中断的最终目的是高效处理紧急程序,并且不会占用CPU资源。还有就是能实现程序的并行化,实现嵌入式系统进程之间的切换等。
- 实时控制:在确定的时间内对相应事件做出相应;例如:温度控制;
- 故障处理:检测到故障,需要第一时间进行处理;
- 数据传输:不确定数据何时会来,利用中断进行控制;
1.3、STM32的中断
STM32F10x芯片有84个中断通道,包括16个内核中断和68 个可屏蔽中断,这些中断通道已按照不同优先级顺序固定分配给相应的外部设备。
具体可参考:STM32F103的中文参考手册(9.1.2中断和异常向量)
二、 NVIC(中断向量控制器)
2.1 NVIC基本概念
NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,通俗的讲它就是一个开关与选择器。它属于M3内核的一个外设,控制着芯片的中断相关功能。M3 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。
2.2、中断处理机制
工作过程:
对于外部产生的中断不管是串口、定时器、IIC还是EXTI ,GPIO都由做NVIC来管理,NVIC的主要功能可以概括为:1. 中断管理;2.支持异常及中断向量化处理;3.支持嵌套中断。
2.3、STM32中断优先级
当多个中断同时到来时,CPU该执行那个中断呢?这个时候就需要用到中断优先级,给中断的执行顺序排个序,优先级高的可以比优先级低的先执行,甚至优先级高的可以打断正在执行的优先级低的中断程序。
STM32F103芯片支持60个可屏蔽中断通道,每个中断通道都具备自己的中断优先级控制字节(8位,但是STM32F103中只使用4位,高4位有效),用于表达优先级的高4位又可以组成抢占式优先级和响应优先级,通常也把响应优先级称为“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
NVIC_PriorityGroup | 抢占优先级 取值范围 | 响应优先级 取值范围 | 描述 |
NVIC_PriorityGroup_0 | 0 | 0~15 | 抢占优先级占0位, 响应优先级占4位 |
NVIC_PriorityGroup_1 | 0,1 | 0~7 | 抢占优先级占1位, 响应优先级占3位 |
NVIC_PriorityGroup_2 | 0,1,2,3 | 0,1,2,3 | 抢占优先级占2位, 响应优先级占2位 |
NVIC_PriorityGroup_3 | 0,1,2,3,4,5,6,7 | 0,1 | 抢占优先级占3位, 响应优先级占1位 |
NVIC_PriorityGroup_4 | 0~15 | 0 | 抢占优先级占4位, 响应优先级占0位 |
优先级判断原则:
中断优先级的数值越小,优先级级别越高。先判断抢占优先级的大小,如果抢占优先级相同(两者不能相互打断),则比较响应优先级的大小,若抢占优先级和响应优先级均相同,则根据中断向量表中的顺序来决定。
假定现在有三个中断源:中断1、中断2、中断3。设置中断优先级分组为 2,然后设置中断1的抢占优先级为 2,响应优先级为 1。中断2的抢占优先级为 3,响应优先级为0。 中断3的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为: 中断 3>中断 1>中断 2。 上面例子中的中断 1 和中断 3 都可以打断中断 2 的中断。而中断 3 和中断 1却不可以相互打断!
三、EXTI(外部中断)
3.1EXTI的简介
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿检测。 EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
3.2EXTI功能框图
斜杠20,表示在控制器内部类似的信号线路有20个, EXTI总共有20个中断/事件线。
红色代表产生中断,绿色代表产生事件
产生中断线路目的是把输入信号输入到NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用, 并且是电路级别的信号传输,属于硬件级的。
3.3EXIT线与IO映射关系
EXTI有20个中断/事件线,每个GPIO都可以被设置为输入线,占用EXTI0至EXTI15, 还有另外七根用于特定的外设事件,见表 EXTI中断_事件线 。
EXTI0至EXTI15用于GPIO,通过编程控制可以实现任意一个GPIO作为EXTI的输入源。由表 EXTI中断_事件线 可知, EXTI0可以通过AFIO的外部中断配置寄存器1(AFIO_EXTICR1)的EXTI0[3:0]位选择配置为PA0、 PB0、PC0、PD0、PE0、PF0、PG0、PH0或者PI0 。
-
16个外部中断源
EXTI0 - EXTI15
,对应7个中断向量
,即7个中断服务函数
- EXTI0、EXTI1、EXTI2、EXTI3、EXTI4:专用
- EXTI5 ~ EXTI9:共用
- EXTI10 ~ EXTI15:共用
-
触发条件
- 上升沿触发
- 下降沿触发
- 双边沿触发
四、原理图设计
按键默认接得有上拉电阻,未按下时单片机检测管脚为高电平,当按键按下,电平由高电平变为低电平。也就是一个下降沿信号。
五、STM32CubeMX 配置
配置1:LED1/PB9设置为推挽输出; K1设置为外部中断模式,NVIC组别默认,抢占优先级,响应优先级默认为0,使能外部中断。
配置2:外部中断设置为下降沿触发。
六、程序设计
1、定义一个全局变量,用于统计按键按下次数
/* USER CODE BEGIN PV */int cnt = 0;//计数变量/* USER CODE END PV */
2、中断回调函数对按键进行处理,次数到达5次,LED1状态取反。
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == GPIO_PIN_11) //按键K1按下{cnt++;if(cnt == 5)//按键次数到5次{cnt = 0;HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); //LED1电平翻转} } }/* USER CODE END 4 */
七、实验效果
八、仿真实现
按键按下5次后,LED1的状态取反,亮灭交替。