其他分享
首页 > 其他分享> > STM32学习之外部中断EXTI

STM32学习之外部中断EXTI

作者:互联网

本文参考了此篇文章,建议大家先去看这篇文章,里面讲的很详细。(40条消息) STM32CubeMX实战教程(三)——外部中断(中断及HAL_Delay函数避坑)_会开发的喵的博客-CSDN博客_hal外部中断使能https://blog.csdn.net/weixin_43892323/article/details/104383560

一、什么是外部中断

简单来说,就是单片机在执行主程序的时,由于某个事件的发生,暂停主程序的执行调用相应的中断处理程序,执行完中断程序后再继续执行主程序。

关于中断系统的组成结构,每种型号的单片机都不太一样,自行了解。

关于中断的优先级

中断嵌套的两条规则:①低优先级的中断服务函数可被高优先级的服务函数打断,反之不可以。

②任何一种中断,一旦得到响应,即不可以被同级中断打断。

对于我们的编程,中断的优先级使用是很重要的,用户可以配置中断优先级,这就很好的处理复杂的程序。一般来说,中断优先级的编号越小,其优先级越高。

二、外部中断怎么用

1.设置NVIC

1)对中断优先级进行分组

2)选择中断通道,不同的引脚对应不同的中断个数,在这里,每一组相同的编号的GPIO都被映射到同一个外部中断/事件控制器中。

3)设置优先级

4)使能中断

2.中断端口配置

1)配置GPIO

2)配置外部中断方式

以上操作均可以通过STM32CUbeMX实现,实现过程如下

代码思路:GPIO触发外部中断,中断执行中断函数,中断函数执行步骤为先进入GPIO所对应的中断,调用回调函数,完成中断程序 

什么是回调函数,回调函数在中断有什么作用,大家可以参考这篇文章C 语言回调函数详解 | 菜鸟教程 (runoob.com)https://www.runoob.com/w3cnote/c-callback-function.html

配置完成后,打开工程,在stm32f1xx.it.c中重写callback回调函数,代码如下

/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	//使用KEY1控制蜂鸣器
	if(GPIO_Pin==KEY1_Pin)
	{
		//HAL_Delay(100);
		if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0)
		{
			HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,1);
			HAL_Delay(200);
			HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,0);
		}
	}
	//使用KEY2让LED翻转
	if(GPIO_Pin == KEY2_Pin)
	{
		if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == 1)
		{
			HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
			HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
		}		
	}
}
/* USER CODE END 1 *//

至此完毕

注意,这段代码在中断里使用了延时函数,一般来说,单片机中的中断加入延时函数是一大禁忌,对于这种情况,我们可以使用定时器中断来完成

稍后更新定时器中断实现按键按下蜂鸣器响500ms的程序

标签:优先级,HAL,函数,Pin,中断,STM32,GPIO,EXTI
来源: https://blog.csdn.net/weixin_53370601/article/details/123607526