14.2.3 二值信号量应用:键控LED灯设计

更新于 2026年10月10日 版权声明
14.2.3 二值信号量应用:键控LED灯设计

1.任务要求

利用STM32F1和FreeRTOS结合二值信号量设计一个键控LED灯的应用实验,要求能根据按键状态控制LED灯的亮灭,并将按键状态和LED灯的状态通过串口发送到计算机。设计硬件电路,并完成程序设计。

2.硬件设计

硬件电路图如图14.12所示,按键与STM32F1系列MCU的PB0相连,LED灯与STM32F1系列MCU的PB10相连,串口采用UART2,对应PA2和PA3。

图示

图14.12 硬件电路图

3.软件设计

设计两个任务:一个任务Task1_Send用于检测KEY的状态,若有按下按键的操作,则通过二值信号量释放函数xSemaphoreGive()进行操作,相当于将队列中的值写满,并向串口发送操作情况;另一个任务Task2_Receive用于获取二值信号量,只有当队列中的值是满的时候才获取信号量,并发送状态,控制LED灯。这样实现两个任务的同步。

BinSem_Handle=xSemaphoreCreateBinary():二值信号量,有两种状态(空和满)。(https://www.daowen.com)

Task1_Send为发送任务,根据按键状态释放信号量,按键状态由PB0中断实现,相当于写满队列。

Task2_Receive为接收任务,只有成功获取信号量,才执行LED灯操作。

在STM32 CubeMX中创建工程文件,设置“SYS”的“Timbase Source”为TIM2;配置GPIO引脚PB0、PB10、PA2、PA3;配置Middleware,设置FreeRTOS,使能信号量,其他内核参数、存储器管理等采用默认设置即可。“main.c”文件参考程序如下。

图示

图示

4.仿真与调试

通过Keil-MDK或硬件开发板,可观察程序运行效果,仿真与调试效果如图14.13所示。当按下按键,引起中断,在回调函数中让KEY=0,Task1_Send释放信号量,Task2_Receive获取信号量,并将P10外接的LED状态取反,每按一次按键,做一次LED取反操作,从而达到任务间同步的目的。

图示

图14.13 仿真与调试效果

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)