当程序正常运行执行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,也就是最低级,他会阻塞等待该中断函数处理完,才能解除阻塞,
所以我们需要注释掉延时去抖动函数即可
在这里插入图片描述

8.演示

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部