STM32F103 + FreeRTOS 桌面温湿度闹钟项目全流程分享
一、项目概述
本项目是基于 STM32F103C8T6 主控芯片,搭载 FreeRTOS 实时操作系统开发的一款桌面温湿度闹钟。项目集成了 DHT11 温湿度采集、DS1302 RTC 实时时钟、TC5020EJ LED 灯板显示、NV020D 音频提示以及按键、触摸和声控交互功能。
项目摒弃了传统的裸机轮询开发模式,采用 RTOS 多任务机制,有效解决了单总线传感器时序冲突和音频播放卡顿的问题。目前代码已开源,工程结构清晰,适合嵌入式初学者和求职者参考。
项目开源地址:
- GitHub: https://github.com/Xuxiupa/stm32-humiture-app
- Gitee: https://gitee.com/yin-yongchu103/stm32-humiture-app
二、硬件选型与原理
- MCU:STM32F103C8T6(Cortex-M3 内核,主频 72MHz)
- 温湿度传感器:DHT11(单总线通信,对时序敏感)
- 实时时钟:DS1302(三线制通信,带备用电池)
- 显示驱动:TC5020EJ LED 灯板(扫描显示)
- 音频芯片:NV020D(高优先级时序控制)
- 调试下载:ST-Link / CMSIS-DAP
三、软件设计与 FreeRTOS 任务划分
软件基于 STM32CubeMX 生成 HAL 库工程,移植 FreeRTOS 实现多任务管理。核心设计在于任务优先级的合理分配:
|
任务名称 |
主要职责 |
优先级策略 |
|---|---|---|
|
采集任务 |
读取 DHT11 温湿度数据 |
中(关键段加临界区保护) |
|
显示任务 |
刷新 LED 灯板 |
低(非实时刷新) |
|
按键任务 |
检测物理/触摸/声控输入 |
中 |
|
闹钟任务 |
比较当前时间与闹钟时间 |
中高 |
|
音频任务 |
控制 NV020D 播放提示音 |
高(必须保证时序准确) |
设计亮点:将音频播放剥离为高优先级任务,避免被显示刷新或数据采集任务阻塞,解决了音频时序错乱问题。
四、关键问题与解决方案(CSDN 读者最爱看)
在开发过程中,遇到了几个典型的嵌入式坑点,记录如下:
1. PendSV 中断映射错误
- 现象:系统启动后运行异常,任务无法切换。
- 原因:Cortex-M 内核的任务切换依赖 PendSV 异常,错误地将
PendSV_Handler映射到了错误的函数名。 - 解决:修正宏定义
#define xPortPendSVHandler PendSV_Handler,确保向量表正确跳转到 FreeRTOS 的切换函数。
2. DHT11 数据读取不稳定
- 现象:温湿度数值偶尔跳变或读取失败。
- 原因:单总线协议对微秒级时序要求极高,采集过程中被 FreeRTOS 的任务调度打断。
- 解决:在 DHT11 的起始信号和读取数据位的关键代码段前后,使用
taskENTER_CRITICAL()和taskEXIT_CRITICAL()进入临界区,暂时关闭任务切换。
3. 音频播放时序错乱
- 现象:NV020D 芯片播放声音断断续续。
- 解决:将音频播放逻辑放入独立的高优先级任务中,确保 CPU 优先处理音频时序。
五、工程结构与编译烧录
本工程采用标准 CubeMX 生成的结构,配合 .gitignore 过滤编译垃圾,保持仓库整洁。
- Core/:存放应用层代码(main.c、FreeRTOS 任务、各外设驱动)
- Drivers/:存放 STM32 的 HAL 库和 CMSIS 核心文件
- MDK-ARM/:存放 Keil 工程配置文件
- Humiture.ioc:STM32CubeMX 的工程配置文件
编译与烧录:
- 使用 Keil MDK-ARM 打开
MDK-ARM/Humiture.uvprojx。 - 选择 ST-Link 下载器进行烧录。
- 代码规范遵循 Conventional Commits(如
feat:,fix:,docs:),便于版本管理。
六、演示效果与源码开源
目前项目已打上 v1.0 标签,功能稳定。系统上电后,LED 灯板正常显示时间,温湿度数据实时更新,闹钟触发时音频正常播报,按键交互流畅。
如果你正在学习 FreeRTOS 的任务调度、中断管理,或者正在寻找 STM32 实战项目作为简历作品,希望这个项目能帮到你。
实物图:
如果觉得有用,欢迎 Star / Fork!
- GitHub: https://github.com/Xuxiupa/stm32-humiture-app
- Gitee: https://gitee.com/yin-yongchu103/stm32-humiture-app
更多推荐


所有评论(0)