HAL 库中用中断方式实现按键控制LED

目录

一、关于中断

有关中断的简介在我上一篇博客:利用串口中断方式实现完成STM32的USART串口通讯程序
已经有所提及了,在这里我再补充几个。

外部中断

什么是外部中断?举个例子:比如你今天有个快递,快递一般放在前台或是门卫。你有两种方法,1、不停问前台,你的快递到了没有;2、等快递到了,让前台告诉你。前者就是轮询,后者就是外部中断。外部中断是由引脚检测到的中断。中断可以由上升沿、下降沿或双边沿触发。换句话说,中断不是由CPU去“询问”,而是由中断控制器“通知”的。
为了给CPU减小负担,我们通常使用外部中断。
外部中断控制器:

  • 管理23个外部中断线(EXTI Line)
  • 0~15号外部中断线用于由GPIO引脚触发的外部中断
  • 16~22号外部中断线用于RTC闹钟事件、以太网唤醒事件和USB唤醒事件等
  • 当对应GPIO引脚与外部中断线连接后,GPIO引脚才具备外部中断的功能,可以设置外部中断的触发方式
    HAL 库中用中断方式实现按键控制LED

GPIO引脚的外部中断

**GPIO引脚的外部中断触发方式:**上升沿触发、下降沿触发、双边沿触发。
引脚分组:
属于外部中断的线共有16条,引脚数量多于16,所以引脚要共用外部中断线。
HAL 库中用中断方式实现按键控制LED

二、实验内容与实验过程

1、实验内容

用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
整体来说,我们可以把整个电路等效为一个按键电路,如图所示:
HAL 库中用中断方式实现按键控制LED
上拉式按键:
按键按下,引脚PB7读到低电平
按键释放,引脚PB7读到高电平
触发方式:
按键按下瞬间,形成下降沿
按键释放瞬间,形成上升沿

在本次实验中我们的中断管脚PB7,LED管脚为PA4。

2、实验过程

2.1 创建工程

我们是在STM32CubeMX中创建的工程,其中一些基础的配置在我之前的博客有仔细提及过,这里就不过多赘述了。我们直接到管教配置那里。
GPIO配置:
(1)引脚配置
选择 LED 灯引脚 PA4,设置引脚为输出模式 GPIO_Output;
选择作为外部中断的引脚 PB7,设置为与中断线 GPIO_EXTI7连接。HAL 库中用中断方式实现按键控制LED
(2)外设配置
HAL 库中用中断方式实现按键控制LED
在 GPIO mode 中我们可以选择触发模式,这里我们选择的是上升沿触发。
User Label 我们输入可以将这个触发设置为我们想要的名字,这里我起名为b7 interrupt ,当然大家也可以取其他名字,但是一定要记得我们现在起的名字,后面需要用到(这一步也不是必须的)

HAL 库中用中断方式实现按键控制LED
使能引脚对应的外部中断线 EXTI line[9:5]。

查看中断优先级:
HAL 库中用中断方式实现按键控制LED
中断优先级用于需要多个中断的工程先后顺序,我们这里只有一个中断,所以说不用关中断优先级。

(3)时钟树设置:
HAL 库中用中断方式实现按键控制LED
(4)生成工程
HAL 库中用中断方式实现按键控制LED
点击 GENERATE CODE ,生成工程。

2.2 代码编写

在keil中打开工程,找到Drivers目录下的stm32f1xx_hal_gpio.c文件,将其中的第546行到568行进行修改,代码如下:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

/**
  * @brief  EXTI line detection callbacks.
  * @param  GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

HAL 库中用中断方式实现按键控制LED
这些代码都是HAL库中的中断函数,其中 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 这个函数是遇到中断后跳转执行的函数,不知大家注意到前面的 __weak 没有,这表示这个函数是虚函数,需要我们来重新编写。
现在我们转到 main.c 文件中,找个位置将下面这段代码贴上去,我选择的是用户代码段4。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if( GPIO_Pin == b7_interrupt_Pin)
	{
		HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
	}
}

HAL 库中用中断方式实现按键控制LED

2.3 烧录程序

将修改好的代码编译,生成hex文件,然后烧录进板子中:
HAL 库中用中断方式实现按键控制LED

注:烧录时boot0为1,boot1为0,烧录完成后断电再将两个都置为0,然后再上电,即可观察到对应现象。

2.4 运行结果

在这里我们用的是杜邦线代替的开关,杜邦线接3.3v灯亮,杜邦线接GND灯灭。效果如下:HAL 库中用中断方式实现按键控制LED
HAL 库中用中断方式实现按键控制LED
HAL 库中用中断方式实现按键控制LED

三、总结

本次实验用了中断模式来控制LED灯的亮灭,重点在于在STM32CubeMX 里面的一些管脚和中断的设置,代码还是很简单的。

四、参考资料

HAL库教程4:外部中断
第七章 中断系统

上一篇:LED透明屏播放显示如何避免光污染?


下一篇:Loto实践干货(8)loto示波器在LED台灯调光问题维修中的应用案例