薪火培训电控第三讲——中断

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();
}
对于代码的意思不必理会,只需知道这些是自己按需求写的

下面开始连接硬件:

开始配置工程

  1. 打开CUBE
  2. File->New Project

  1. 找到芯片

  2. 使能RCC

  3. 使能Debug

  4. 配置时钟树

  5. 配置引脚

  6. 使能外部中断

  7. 配置项目信息

  8. 然后点击右上角GENERATE CODE生成代码

完成后点击OPEN PROJECT

keil添加代码

Hal_GPIO_TogglePin()这个函数可以反转引脚电平,以控制小灯亮灭

多加的那几行代码用来做一个简单的消抖(如果不知道消抖的话,建议百度“按键消抖”)

然后编译,下载
如果没出问题的话,每按一次按键,灯都会改变一次亮灭状态

上面用的是xxxit.c中的Handler函数,下面试一试Callback函数

注释掉刚才加的代码,在main.c中添加如下代码

编译,下载,运行,效果应该跟刚才一样

下面试一下TIM中断

(要绷不住了,下面的粗制烂造一下)

搞完后,小灯应该每秒闪烁5次

注意:

  • 中断里不要使用延时函数(Hal_Delay())
  • TIM中断要手动开启(Hal_TIM_Base_Start_IT())
posted @ 2021-10-28 13:18  北京理工大学机器人队  阅读(95)  评论(0编辑  收藏  举报