🌤️ FreeRTOS Smart Weather Station (智能天气时钟)
项目简介:本项目是一个基于 STM32 与 ESP32-C3 的高刷新率、异构解耦桌面天气终端。核心聚焦于 **RTOS 任务调度优化、异步 UI 引擎设计以及底层通信协议 (SPI/I2C/UART) 的非阻塞重构,旨在验证复杂嵌入式系统下的高并发数据同步与稳定性设计。
💻 硬件架构 (Hardware Architecture)
本系统采用主从异构架构,硬件选型与接口定义如下:
| 模块名称 | 核心器件 | 通信总线 | 核心功能 |
|---|---|---|---|
| 主控核心 | STM32F4xx | 内部总线 | 统筹 FreeRTOS 调度、UI 渲染引擎计算与数据解析 |
| 网络协同 | ESP32-C3 | UART (DMA) | 负责 Wi-Fi 栈、HTTPS 请求 (心知天气) 与 SNTP 时钟同步 |
| 显示面板 | ST7789 (1.54寸) | 硬件 SPI | 高刷 UI 呈现,支持全角/半角、UTF-8/GB2312 混排自适应识别 |
| 环境感知 | AHT20 | 硬件 I2C | 室内温湿度高精度采集 |
⚙️ 软件架构与核心技术锚点 (Technical Highlights)
本项目彻底摒弃了传统的“大循环+裸机延迟 (Delay)”开发模式,基于 FreeRTOS 实现了业务逻辑与底层驱动的深度解耦:
-
异步 UI 引擎与优先级翻转规避 (UI Decoupling) 痛点:多任务频繁抢占 ST7789 的 SPI 总线易导致互斥锁死锁及优先级翻转 (Priority Inversion)。 重构方案:设计极简 UI 引擎,利用 FreeRTOS 消息队列 (Queue),将所有多任务对屏幕的异步写操作,统一打包封装为
struct-union-struct数据帧,转化为 UI 线程上的同步操作。 -
前后台任务分离 (Workqueue Mechanism)
- 引入 Linux 风格的
workqueue机制。 - 前台任务:UI 刷新(如秒针高频更新)、按键中断响应,确保人机交互的绝对实时性 (Real-time)。
- 后台任务:将 SNTP 请求、HTTPS 天气获取、I2C 传感器读取等高延迟/非实时操作委托给后台调度。利用软件定时器 (Software Timer) 作为发布者触发任务,大幅降低了应用层的栈内存 (Stack Size) 消耗。
-
高效 ESP-AT 串口模型 (Custom AT Parser) 弃用低效的轮询接收。自主封装发送、接收与解析闭环函数。 底层实现:采用 UART TX DMA 发送 + RX 空闲中断 (Idle Interrupt)。无需等待 DMA 传输完毕,直接通过信号量 (Semaphore) 阻塞等待解析完成,自带超时机制,极大提高了 CPU 的执行效率。
-
线程安全日志组件 (Thread-safe Logger)
- 规避标准库
printf的不可重入缺陷,引入并魔改easylogger组件。 - 增加互斥量 (Mutex) 保护,集成时间戳 (Timestamp)、Tag、日志等级分色、文件名与行号追踪,极大提升了多任务环境下的 Bug 排查效率。
📂 工程目录说明 (Directory Structure)
text ├── STM32F4_ColorBlock/ # 核心驱动模块与业务逻辑 ├── STM32F4_SPI/ # SPI 驱动重构层 ├── STM32F4_AHT20/ # 温湿度传感器 I2C 驱动 ├── STM32F4_Inputc/ # 按键与输入中断处理 ├── USART_int/ # 串口 DMA 及中断底层封装 ├── ST_Interrupt_all/ # 全局中断向量表与统一管理 └── README.md # 项目工程说明文档 🛠️ 编译与烧录指南 (How to Build) 开发环境:推荐使用 Keil uVision5 (MDK-ARM)。
依赖库:项目基于 STM32F4xx 标准外设库 (Standard Peripheral Library V1.9.0)。
编译:打开 mdk/ 目录下的 .uvprojx 工程文件,全编译 (F7) 即可。
烧录:支持 ST-Link 或 J-Link,接线方式遵循标准 SWD 接口(GND, SWCLK, SWDIO, 3V3)。