【学习笔记】STM32中断进阶任务:按键控制指示灯闪烁频率详解

采用德飞莱STM32板,主控芯片STM32F103ZET6。

任务内容:利用按键B1控制指示灯LD2的闪烁频率,闪烁频率设置为3档:初始状态时,LD2按照2Hz的频率闪烁;第一次按键后,LD2按照10 Hz的频率闪烁;第二次按键后,LD2按照20Hz的频率闪烁。再次按键后让LD2恢复以2Hz的频率闪烁,并重复上述过程。按键的检测采用中断方式。

硬件原理:按键B1由引脚PC13控制:按键按下时为下降沿触发方式,释放时为上升沿触发方式。指示灯LD2由引脚PA5控制;PA5输出高电平,开启指示灯;PA5输出低电平,关闭指示灯。

任务实现

1. 设计思路

采用前后台编程模式:定义一个全局变量BlinkSpeed,初始化为0。在外部中断服务程序(前台程序)中修改BlinkSpeed的值;在主程序(后台程序)的while(1)循环中不断检测BlinkSpeed的值,根据取值的不同修改指示灯的闪烁频率。

2. 引脚分配和外设配置

本任务所使用的引脚和外设与基础任务中所使用的相同,因此省去引脚分配和外设配置的过程。

1.

双击进入

2.

3.

4.配置LED灯引脚(PB5)

5. 配置KEY键引脚(PE2)

配置上拉、上升沿和下降沿

使能中断

6.配置时钟树

7.改名、保存、打开

3. 程序编写

生成MDK工程后,进行应用程序的编写。具体代码如程序代码段1和2所示。

代码段1:

/* USER CODE BEGIN PV */
volatile uint8_t BlinkSpeed = 0;// 指示灯闪烁频率:0->2Hz 1->10Hz  2->20Hz
/* USER CODE END PV */
/* ………………………… */ // 省去中间部分代码 
/* Infinite loop */
/* USER CODE BEGIN WHILE */ 
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if( BlinkSpeed == 0) // 2Hz 闪烁频率
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
			HAL_Delay(500);
		}
		else if( BlinkSpeed == 1 ) // 10Hz 闪烁频率
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
			HAL_Delay(100);
		}
		else							 // 20Hz 闪烁频率
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
			HAL_Delay(50);
		}
		
  }
  /* USER CODE END 3 */

程序解释:

① 第2行定义了一个变量 BlinkSpeed,用来存放指示灯的闪烁频率:BlinkSpeed为0表示2 Hz的闪烁频率;BlinkSpeed为1表示10Hz的闪烁频率;BlinkSpeed为2表示20 Hz的闪烁频率。由于变量BlinkSpeed在中断服务程序中修改,在主程序中判断。为了避免变量被编译器优化,在变量定义时,添加了关键字 volatile 来修饰。

② 第11~25行是while(1)循环中报执行的代码。采用if-else if-else的多分支语句,通过判断BlinkSpeed的取值来改变指示灯的闪烁频率:当BlinkSpeed为0时,设置闪烁频率为 2 Hz,即延时时间为500ms;当BlinkSpeed为1时,设置闪烁频率为10Hz,即延时时间为100ms;当BlinkSpeed为2时,设置闪烁频率为20Hz,即延时时间为50ms。

代码段2:

/* USER CODE BEGIN 4 */
/*
 * @brief ExTI line detection callbacks.
 * @param GPIO_Pin: Specifes the pins connected EXTI line
 * @retval None
*/

void HAL_GPIO_EXTI_Callback(uint16_t GPI0_Pin)
{
	
	if(GPIO_PIN_2 == GPI0_Pin) // 判断发生外部中断的 GPIO 引脚
	{
		BlinkSpeed++; // 修改 BlinkSpeed 变量的值 
		if( BlinkSpeed == 3) // 判断是否完成一次循环
		{
			BlinkSpeed = 0;
		}
	}
}
/* USER CODE END 4 */

程序解释:

在外部中断回调函数中对变量Blink ASpeed加1,并判断BlinkSpeed的值是否等于3。如果等于3,则对BlinkSpeed清零,重新开始下一轮的循环。

运行结果:

将程序编译链接,生成可执行代码,通过ST-Link仿真器下载到开发板上可以观察到:上电后,指示灯LED2按照2Hz频率闪烁。按下按键B2后,指示灯LED2闪烁频率加快,照10Hz频率闪烁。再下按键B1后,示灯LED2闪烁频率更快,按照20 Hz频率闪烁。第三次按下按键后,指示灯恢复到2 Hz的闪烁频率,并重复上述过程。

物联沃分享整理
物联沃-IOTWORD物联网 » 【学习笔记】STM32中断进阶任务:按键控制指示灯闪烁频率详解

发表评论