
一、项目概述本项目是基于STM32F103C8T6 主控芯片搭载FreeRTOS 实时操作系统开发的一款桌面温湿度闹钟。项目集成了DHT11 温湿度采集、DS1302 RTC 实时时钟、TC5020EJ LED 灯板显示、NV020D 音频提示以及按键、触摸和声控交互功能。项目摒弃了传统的裸机轮询开发模式采用 RTOS 多任务机制有效解决了单总线传感器时序冲突和音频播放卡顿的问题。目前代码已开源工程结构清晰适合嵌入式初学者和求职者参考。项目开源地址GitHub: https://github.com/Xuxiupa/stm32-humiture-appGitee: https://gitee.com/yin-yongchu103/stm32-humiture-app二、硬件选型与原理MCUSTM32F103C8T6Cortex-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.iocSTM32CubeMX 的工程配置文件编译与烧录使用 Keil MDK-ARM 打开MDK-ARM/Humiture.uvprojx。选择 ST-Link 下载器进行烧录。代码规范遵循 Conventional Commits如feat:,fix:,docs:便于版本管理。六、演示效果与源码开源目前项目已打上v1.0标签功能稳定。系统上电后LED 灯板正常显示时间温湿度数据实时更新闹钟触发时音频正常播报按键交互流畅。如果你正在学习 FreeRTOS 的任务调度、中断管理或者正在寻找 STM32 实战项目作为简历作品希望这个项目能帮到你。实物图如果觉得有用欢迎 Star / ForkGitHub: https://github.com/Xuxiupa/stm32-humiture-appGitee: https://gitee.com/yin-yongchu103/stm32-humiture-app