(HAL库学习5) STM32CubeMX HAL库 外部中断使用

今天内容为使用STM32CubeMX配置STM32单片机的外部中断

首先:STM32含有一共20条中断/事件线,前面0-15条是供给IO用的,后面四条是有特殊用处的:16:PVD输出 17RTC:闹钟事件 18:USB唤醒事件 19:以太网唤醒事件,而对应IO的16条线就对应的IO的相应编号,比如PA0,PB0,PC0…这些都是零号中断线上的。

第二:中断发生的原理顺序,这点很重要,比如设置PA0(中断线0)上升沿触发之后,PA0出现上升沿,就会触发中断,设置中断标志位,由NVIC中断管理器判别EXTI0的中断优先级看是不是可以执行EXIT0中断。

第三:这种中断是硬件性质的中断,所以反应速度快且CPU进入中断服务函数能快速产生结果,CPU消耗少,而且执行中断时CPU要记录原本执行的程序位置,把程序中的中断点压入堆栈,相同的啊,再多一句,FreeRTOS和UCOS这些嵌入式系统一样的,千万不要以为这些东西不需要占用CPU还会提高运行的速度,他们存在的目的是为了让程序运行更有序,是提高CPU利用率,而绝不是提高运行速度,这些单片机都是单核的,所以只能单线程,系统在这些线程之间转换,同样需要消耗少量CPU资源(主要就是之前说的记录当前程序中断点位置),再加上系统本身运行也是要消耗少量CPU的。

第一步:在STM32CubeMX上开启中断:

(HAL库学习5) STM32CubeMX HAL库 外部中断使用_第1张图片
按照上面的步骤就可以了,很简单,先把自己中意的引脚定义为中断模式,然后在gpio栏找到他给他设置触发方式,是否上下拉,最好再给他一个相应的标签(方便自己记住,不要出现中文,工程会宏定义这个引脚为你的标签名)

第二步:在中断管理器中使能并配置中断

(HAL库学习5) STM32CubeMX HAL库 外部中断使用_第2张图片
这样就算配置好工程了,至于用到的创建工程和串口等等知识在我前面的博文里面去看看,点击生成工程。

第三步:在工程中使用中断

(HAL库学习5) STM32CubeMX HAL库 外部中断使用_第3张图片

下面就是这个函数
(HAL库学习5) STM32CubeMX HAL库 外部中断使用_第4张图片
这两个就是中断的核心了,那么等他们最后都要触发中断回调函数,我们就在main.c中添加中断回调函数:
(HAL库学习5) STM32CubeMX HAL库 外部中断使用_第5张图片
把下面这段代码添加在main.c后面,里面就是先判断是哪一条中断线,然后消抖,消抖完后读取相应的引脚高低电平看是不是出现中断后应有的状态(因为我是拿按键做的实验,必须消抖不然按一下,电平在按下和弹起的瞬间电平抖动过大会多次触发中断),消抖时间看自己需求,有些情况也可以不消抖

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_1)
  {
		HAL_Delay(50);  //消抖
		if(HAL_GPIO_ReadPin(interrupt_GPIO_Port,interrupt_Pin) == 1)
				printf("中断线1发生触发中断,在这里执行你的逻辑\r\n");
  } 
	if(GPIO_Pin == GPIO_PIN_2)
  {
    HAL_Delay(50);  //消抖
		if(HAL_GPIO_ReadPin(interrupt2_GPIO_Port,interrupt2_Pin) == 1)
				printf("中断线2发生触发中断,在这里执行你的逻辑\r\n");
  }
}
/* USER CODE END 4 */

关于中断事件和中断

前面STM32CubeMX给引脚设置触发方式的时候有六个选项对吧,前三个代表(上升沿…)触发中断,而后三个是相应触发方式的中断事件,因为我很少使用这个选项所以不敢随便说,但是必要的我要告诉大家,中断时软硬件合作的产物,硬件产生中断,中断服务函数(软件)负责判别,而中断事件呢??他是靠脉冲发生器产生一个脉冲,然后由硬件自动完成这个事件产生的结果,如果需要dma,adc,dac等等别的硬件功能的话你要自己实现设置好,事件基本是纯硬件产生的结果,因此更快,我用的很少但我猜测基本都用于对反映时间要求非常高且较为频繁的地方吧,如果我以后的项目中用到了事件产生的话会单独拿一篇博文再讲讲中断事件

最后

我是一个新人博主,目前也是一个大学生,但是真心喜欢嵌入式和物联网,已经自学3年了,我会带着热爱一直把博文写下去,也是自己记笔记的一种方式,大家可以关注我,给我留言,一起学习

你可能感兴趣的:(STM32_HAL库相关操作)