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