目录
硬件知识
一、中断
二、按键中断的配置
函数库知识
外部中断回调函数
代码编写
一、用外部中断开关灯
二、两键控两灯
硬件知识
一、中断
①基本概念
中断就是芯片运行程序时,停一下,去干别的
有些功能很重要,但是放在主程序里面占位置
故可以放在中断函数中,需要的时候,停一下,来做这个比较重要的事情
②优先级
当中断不止一个的时候,设置优先级来排运行先后
- 抢占优先级
- 优先级高可打断优先级低的
- 1级优先>2级优先
- 主程序优先级为最低
- 相同不打断
- 优先级高可打断优先级低的
- 子优先级
- 两个中断(抢占优先级相同)都在等待执行,优先处理子优先级高的
- 芯片用四位二进制存储优先级
- 用2位表示抢占优先级,则中断优先级为0~3
- 00~11 →0~2^2 - 1
- 用3位表示抢占优先级,则中断优先级为0~7
- 000~111 →0~2^3 - 1
- 用4位表示抢占优先级,则中断优先级为0~15
- 000~111 →0~2^4 - 1
- 有部分中断优先级大于15,应该是系统自己存到别的地方了
- 用2位表示抢占优先级,则中断优先级为0~3
二、按键中断的配置
外部中断一般指由GPIO引脚电平变化产生的中断
按键中断是我自己喜欢这么叫
①参数配置如下
B0调至外部中断模式
有六种触发方式,我们先关注前三种
- Rising触发:就是电平升高时触发中断
- falling触发:就是电平降低时触发中断
- 第三个都触发
注:前面两个词都是我念的顺口编出来的
回忆笔记二中按键设置
我们共地解法,B0调为上拉,按下后B0变为低电平
因此我们选择Falling触发,当B0电平降低(按键按下后)触发中断
②优先级设置
函数库知识
外部中断回调函数
函数来源于"stm32f1xx_hal_gpio.c"
①概念
重中之重了,值得单用一个大写数字
这个函数表示你外部中断是为了干啥
由左边的函数界面快速找到这个函数原型
- __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
- __weak :弱定义,意思就是你可以写个新函数把他替掉
- 看名字也知道这是外部中断专属了
- EX:external
②如何编写
继续扒官方例程
官方给的例程如下
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
/* Toggle LED3 */
BSP_LED_Toggle(LED3);
}
}
这个程序流程图也很简单,目的一看便知
是不是0号引脚,是就翻转
此外中断回调函数不需要声明(因为弱定义的时候已经声明过了,问题不大)
再然后我们写个模板让keil5记住吧
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
/* 中断后做点什么 */
}
}
最后注意关闭文件时不要保存,别把人家例程搞乱了
还有这个过程就是让A5闪烁,如果你担心灯或者板子坏了什么的,就直接下这个工程检测
代码编写
一、用外部中断开关灯
①初始化配置
配好一个按键&一个灯
②文件配置
③代码编写
在主函数中找到他给你留的位置,模板套进去
再写个翻转函数进去
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
/* 中断后做点什么 */
Red_Toggle();
}
}
二、两键控两灯
①先初始化
A1,A5小灯
(手快点错了,问题不大)
B0,B1按键
开启中断
②编写程序
回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
/* 中断后做点什么 */
Green_Toggle() ;
}
else if (GPIO_Pin == GPIO_PIN_1)
{
/* 中断后做点什么 */
Green_Toggle();
}
}