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

您所在的位置:网站首页 按键闪烁效果怎么设置 【学习记录】STM32中断进阶任务:按键控制指示灯闪烁频率

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

2024-07-16 05:33| 来源: 网络整理| 查看: 265

采用德飞莱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的闪烁频率,并重复上述过程。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3