【STM32】外部中断
当程序正常运行执行main函数,此时如果外部中断来了,执行外部中断函数,实现相应的功能,然后就可以回到main.
一般stm32芯片每个引脚都有自己的外部中断,但是为了限制,会有一个中断线,对应一个中断线执行一个外部中断函数
PA0,PB0,PC0为中断线0
PA1,PB1,PC1为中断线1
…
我们实现PA7,按键1按下触发中断,然后使LED1(PB10)翻转
配置stmcubemx和上一篇一样
1.配置GPIO
使用灯和按键,所以要配置GPIOA,GPIOB,以及GPIOA,GPIOB模式初始化。
MY_LED声明
设置GPIOB
2.设置中断优先级分组
其实中断优先级分组已经设置好,HAL_Init();
这个函数就是设置中断优先级组的.
默认有5个中断优先级分组,中断优先级分抢占优先级和响应优先级,不同的优先级分组,抢占,响应占比不一样.不一定NVIC_PRIORITYGROUP_4 的优先级就高,只能说明该分组抢占优先级的范围为0-15,看具体怎么设置,两个中断,如果抢占优先级相同的话,就比较响应优先级谁小,谁的优先级就高,如果一个的抢占优先级数值小的话,就直接不用比较响应优先级了,直接抢占优先级数值小的优先级就高.默认设置中断优先级组为4的话,说明四位都是抢占优先级位,没有响应优先级
3.设置优先级
HAL_NVIC_SetPriority();//设置优先级
因为我们使用的是PA7位实现中断,所以对应中断线7,
但是发现没有中断线7,这里人家是把中断线5-9放在一个里面,设置EXTI9_5IRQn
4.打开中断
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); //打开中断
5.实现中断函数
找对应中断线的中断函数
中断函数1去调用中断函数2
但是真正的中断函数可以理解为需要我们重写这个函数,可以看一下定义
我们自己实现,实现灯的翻转
6.全部实现在.h声明
stm32f4xx_it.h
这个不用声明
gpio.h
7.main.c调用
但是我们发现下载之后按下按键后没有实现灯的翻转,这里的原因如下:
此时在处理中断函数,他的抢占优先级是0,响应优先级是0,而延迟函数去抖动使用的是滴答定时器,他使用的中断优先级是多少呢?我们可以在STMCUBEMX里面看
滴答定时器的抢占优先级为15,也就是最低级,他会阻塞等待该中断函数处理完,才能解除阻塞,
所以我们需要注释掉延时去抖动函数即可