薪火培训电控第三讲——中断
STM32 cube外部中断的使用
啥是中断?
作为一个工程师,遇到问题的第一反应就是上网搜
百度:
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
举个栗子:
类比一下
在实际的代码中,HAL库的中断处理机制较为复杂:
startup_stm32f103xb.s通过汇编注册了中断处理函数EXTI1_IRQHandler()
在stm32f1xx_it.c中,EXTI_IRQHandler()引用了HAL库的处理函数HAL_GPIO_EXTI_IRQHandler(),其功能主要为判断具体的中断原因,并调用对应的中断回调函数:HAL_GPIO_EXTI_Callback()
用户可以自己重声明中断回调函数(HAL_GPIO_EXTI_Callback()),在其中写入自己的用户逻辑
不出意外的话,你这时候可能会有点懵
上图!
中断处理函数写在EXTI_IRQHandler()里或HAL_GPIO_EXTI_Callback()皆可
不过HAL_GPIO_EXTI_Callback()需要重新声明,比如
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(HAL_GetTick()-t>30)
{
if(GPIO_Pin == GPIO_PIN_1)
{
duty_cycle=duty_cycle+100;
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,duty_cycle);
}
if(GPIO_Pin == GPIO_PIN_2)
{
duty_cycle=duty_cycle-100;
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,duty_cycle);
}
}
t=HAL_GetTick();
}
对于代码的意思不必理会,只需知道这些是自己按需求写的
下面开始连接硬件:
开始配置工程
- 打开CUBE
- File->New Project
-
找到芯片
-
使能RCC
-
使能Debug
-
配置时钟树
-
配置引脚
-
使能外部中断
-
配置项目信息
-
然后点击右上角GENERATE CODE生成代码
完成后点击OPEN PROJECT
keil添加代码
Hal_GPIO_TogglePin()这个函数可以反转引脚电平,以控制小灯亮灭
多加的那几行代码用来做一个简单的消抖(如果不知道消抖的话,建议百度“按键消抖”)
然后编译,下载
如果没出问题的话,每按一次按键,灯都会改变一次亮灭状态
上面用的是xxxit.c中的Handler函数,下面试一试Callback函数
注释掉刚才加的代码,在main.c中添加如下代码
编译,下载,运行,效果应该跟刚才一样
下面试一下TIM中断
(要绷不住了,下面的粗制烂造一下)
搞完后,小灯应该每秒闪烁5次
注意:
- 中断里不要使用延时函数(Hal_Delay())
- TIM中断要手动开启(Hal_TIM_Base_Start_IT())