架构驱动 · 纯C面向对象 · 生产级代码规范
一款不只是实现功能的智能手表固件,更是嵌入式 C 语言架构设计的最佳实践。
┌──────────────────────────────────────────────────────────────────┐
│ 01_APP/ 应用层 │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 系统初始化 │ │ RTOS配置表 │ │ ISR Handlers │ │
│ │ Bootstrap │ │ 声明式资源管理 │ │ 中断分发路由 │ │
│ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │
├───────────┼────────────────────┼─────────────────────────────────┤
│ │ │ │
│ ┌────────┴────────────────────┴──────────────────────────────┐ │
│ │ 04_Service/ 服务层 │ │
│ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │ │
│ │ │ 5ms_Cycle │ │ Sensor Service │ │ Temp/Humi Port │ │ │
│ │ │ 系统调度+BMS │ │ 传感器轮询 │ │ + Motion Port │ │ │
│ │ └────────────────┘ └────────────────┘ └────────────────┘ │ │
│ │ ┌────────────────────┐ ┌────────────────────┐ │ │
│ │ │ Watchdog Monitor │ │ Power Manager │ │ │
│ │ │ 看门狗监控 │ │ 低功耗管理(STOP) │ │ │
│ │ └────────────────────┘ └────────────────────┘ │ │
│ └────────┬───────────────────────────────────────────────────┘ │
├───────────┼──────────────────────────────────────────────────────┤
│ │ │
│ ┌────────┴──────────────────────────────────────────────────┐ │
│ │ 02_BSP_Platform/ BSP驱动层 │ │
│ │ ┌────────────────┐ ┌──────────────────┐ │ │
│ │ │ 01_Bsp/Drivers │ │ 02_Adapter/Wrapper│ │ │
│ │ │ 驱动+Handler │ │ 适配器+Bridge │ │ │
│ │ └────────────────┘ └──────────────────┘ │ │
│ └────────┬──────────────────────────────────────────────────┘ │
├───────────┼──────────────────────────────────────────────────────┤
│ │ │
│ ┌────────┴──────────────────────────────────────────────────┐ │
│ │ 02_MCU_Platform/ MCU外设抽象层 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ GPIO │ │ I2C │ │ ADC │ │ │
│ │ │ 引脚抽象 │ │ 双模总线 │ │ 多通道 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ └────────┬──────────────────────────────────────────────────┘ │
├───────────┼──────────────────────────────────────────────────────┤
│ │ │
│ ┌────────┴──────────────────────────────────────────────────┐ │
│ │ 02_OS_Platform/ OS抽象层 │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │ Task/Queue │ │ Mutex/Sema │ │Event/System│ │ │
│ │ │ 任务/队列 │ │ 互斥/信号量│ │事件/系统 │ │ │
│ │ └────────────┘ └────────────┘ └────────────┘ │ │
│ └────────┬──────────────────────────────────────────────────┘ │
├───────────┼──────────────────────────────────────────────────────┤
│ │ │
│ ┌────────┴──────────────────────────────────────────────────┐ │
│ │ Drivers/STM32F4xx_HAL_Driver/ STM32 HAL库 │ │
│ │ Core/ CMSIS + 启动代码 │ │
│ │ Middlewares/ FreeRTOS V10.3.1 │ │
│ └───────────────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────────┤
│ 03_Libraries/ 通用库 (DWT延时 / I2C软件总线 / FIFO / 调试) │
└──────────────────────────────────────────────────────────────────┘
架构角色
源文件
系统入口,时钟配置,外设初始化,启动RTOS调度器
Core/Src/main.c
入口头文件(引脚宏定义、Error_Handler)
Core/Inc/main.h
FreeRTOS初始化 + 启动任务创建
Core/Src/freertos.c
FreeRTOS配置(V10.3.1, CMSIS-RTOS V2, heap_4, 30KB堆)
Core/Inc/FreeRTOSConfig.h
用户应用初始化入口(创建 init task → 资源初始化 → 自删除)
01_APP/User_Init/User_Init_Imple/user_init.c
全局状态结构体 + OS句柄导出
01_APP/User_Init/User_Init_Imple/user_init.h
外设适配器注册(调用 drv_adapter_temphumi_register())
01_APP/User_Init/01_Platform_IO_Register/user_periph_setup.c
外设注册头文件
01_APP/User_Init/01_Platform_IO_Register/user_periph_setup.h
中断分发路由 :HAL_GPIO_EXTI_Callback + HAL_I2C_MemRxCpltCallback 集中管理,分发到 MPU6050/CST816T 等驱动
01_APP/User_Isr_handlers/user_isr_handlers.c
ISR Handler 头文件(PA0 按键回调声明)
01_APP/User_Isr_handlers/user_isr_handlers.h
启动流程:
Reset_Handler (startup_stm32f411xe.s)
→ SystemInit() [FPU使能]
→ 拷贝 .data, 清零 .bss
→ main() [Core/Src/main.c]
→ HAL_Init() [SysTick, NVIC优先级组]
→ SystemClock_Config() [HSI→PLL 100MHz]
→ MX_GPIO/DMA/USART1/I2C3/SPI1/SPI2/I2C1/ADC1/RTC/IWDG_Init()
→ user_debug_init() [SEGGER RTT + EasyLogger]
→ app_periph_init() [注册AHT21适配器]
→ osKernelInitialize()
→ MX_FREERTOS_Init() [创建defaultTask + UserAppTask_Init]
→ osKernelStart() [调度器启动,永不返回]
**UserAppTask_Init 内部流程(user_init.c):**
userTask (PRI_EMERGENCY, one-shot)
→ user_os_resources_init() [Queue×2 / Mutex×2 / Sema×2]
→ core_gpio_init() [GPIO ROM 配置表]
→ lv_init() + lv_port_disp_init() [LVGL + ST7789 显示初始化]
→ os_task_create() ×4 [批量创建 tempHandler / WatchDog / Sensor / 5ms]
→ lv_demo_widgets() [创建 LVGL demo 界面]
→ os_event_create() [温湿度事件组]
→ core_i2c_register_mutex() [I2C 互斥锁注册]
→ watchdog_init() [看门狗互斥锁初始化]
→ vTaskDelete(NULL) [初始化任务自删除]
> 注:userTask 拥有最高优先级 (PRI_EMERGENCY),所有创建的任务在其自删除前不会调度,因此 `watchdog_init()` 在业务任务实际运行前一定完成。
架构角色
源文件
Task/Queue/Mutex/Semaphore 静态配置表 + 批量创建 + Weak符号桩
01_APP/User_Init/02_User_Task_Config/user_task_config.c
优先级分带宏、配置结构体定义
01_APP/User_Init/02_User_Task_Config/user_task_config.h
优先级分带:
优先级带
值(相对 configMAX_PRIORITIES)
用途
PRI_EMERGENCY
configMAX_PRIORITIES - 1 (最高)
初始化任务(一次性自删除)
PRI_HARD_REALTIME
PRI_EMERGENCY - 4
硬实时(传感器Handler线程)
PRI_SOFT_REALTIME
PRI_HARD_REALTIME - 5
软实时(传感器轮询、看门狗)
PRI_NORMAL
PRI_SOFT_REALTIME - 7
普通业务任务
PRI_BACKGROUND
1
后台任务
资源配置表内容:
资源类型
数量
名称
Task(任务)
4个
tempHandlerTask, WatchDog_Thread, SensorTask, Thread_5ms_Task
Queue(队列)
2个
SensorDataQueue (深度2, uint32_t), LastPressCntQueue (深度1)
Mutex(互斥锁)
2个
SensorDataMutex, SensorI2CMutex
Semaphore(信号量)
2个
SleepReqSem (二值), WakeupSem (二值)
Weak符号桩设计:
temp_humi_handler_thread() 和 wdg_handler_thread() 以 __WEAK 修饰提供空实现(while(1)),当实际Handler模块参与链接时自动覆盖。这使得功能模块可以通过编译期链接选择性地启用/裁剪。
3. 服务层 (04_Service) — 源码映射
04_Service/
├── Service_5ms_Cycle/ ← 5ms 系统调度器(心跳 + BMS + 状态机)
│ ├── service_5ms_cycle.c ← 主调度器入口
│ ├── battery_monitor/ ← 电池监控(ADC→VDDA→电压→SOC%)
│ ├── black_light_manage/ ← 背光管理(队列消费 + 状态机分派 → PWM)
│ ├── system_state_manager/ ← 8状态FSM引擎 + 状态回调实现
│ └── calender_calculate/ ← RTC 时间读取
├── Service_PowerManager/ ← 低功耗管理(STOP 模式进出)
├── Service_Sensor/ ← 传感器服务(轮询 + 封装)
│ ├── service_sensor.c ← 传感器轮询主任务
│ ├── service_temp_humi_process/ ← 温湿度业务封装
│ └── service_motion_process/ ← 运动传感器业务封装
└── service_watchdog_monitor/ ← 看门狗监控
3.1 Service_5ms_Cycle — 系统 5ms 调度器
以 5ms 为节拍的系统心跳,按固定顺序驱动各子模块。
架构角色
源文件
主调度器入口 :thread_5ms_task(),每 5ms 执行一轮固定序列
04_Service/Service_5ms_Cycle/service_5ms_cycle.c
调度器头文件
04_Service/Service_5ms_Cycle/service_5ms_cycle.h
5ms 周期的执行序列:
thread_5ms_task() [PRI_SOFT_REALTIME+4, 栈256B, 每5ms循环]
├── watchdog_feed() ← 喂狗(保活)
├── adc_sample_all() ← 采集3路 ADC(电池/VREF/光敏,间断模式)
├── battery_task_5ms() ← 电池电压/电量计算(内部限频 1Hz)
├── user_rtc_read_5ms() ← 读取 RTC 时间(内部限频 200ms)
├── // system_state_task_5ms() ← 状态机(代码完整,待启用)
├── control_blacklight_task_5ms()← 背光控制(PWM 0~100%)
├── user_shutdown_monitor_5ms() ← 长按关机检测(PA0→HP4570 PMIC 断电)
└── os_task_delay(5) ← 阻塞 5ms,让出 CPU
架构角色
源文件
电池 ADC 采样、VDDA 反推校准、滑动均值滤波、OCV-SOC 查表插值
04_Service/Service_5ms_Cycle/battery_monitor/battery_monitor.c
电池状态数据结构体 + LUT 映射表项定义
04_Service/Service_5ms_Cycle/battery_monitor/battery_monitor.h
电池数据结构体 Battery_Status_t: adc_bat_raw, adc_vref_raw, vdda_mv, bat_mv, percentage (0~100%)。
关键算法: 使用 STM32 内部 VREFINT 校准值反推真实 VDDA 消除 ADC 误差 → 5阶滑动均值滤波平滑高阻 (1MΩ) 采样抖动 → 12段 OCV-SOC 查找表 + 线性插值。
系统状态机 (System State Manager)
架构角色
源文件
FSM 引擎:状态初始化、状态切换调度、onEnter/onRun/onExit 表驱动
04_Service/Service_5ms_Cycle/system_state_manager/system_state_manager.c
状态枚举 + 配置结构体定义
04_Service/Service_5ms_Cycle/system_state_manager/system_state_manager.h
8 个状态的 Enter/Run/Exit 回调实现 + 中断保存/恢复
04_Service/Service_5ms_Cycle/system_state_manager/state_moniter.c
8 状态流转: INIT → ACTIVE ⇄ IDLE → PRE_SLEEP → STOP (按键/传感器中断唤醒回 ACTIVE);低电时 ACTIVE → PRE_SHUTDOWN → SHUTDOWN。
状态
说明
STATE_INIT
上电复位初始态,清除信号量后→ACTIVE
STATE_ACTIVE
正常工作:30s 稳定后清零失败计数;低电→PRE_SHUTDOWN;30s 无触摸→IDLE
STATE_OTA
OTA 升级(预留)
STATE_IDLE
浅休眠:30s 无操作→PRE_SLEEP;有触摸→ACTIVE
STATE_PRE_SLEEP
预休眠:暂停看门狗→保存/禁用非唤醒中断→挂起传感器任务→关屏
STATE_STOP
深休眠:通知 PowerManager 进入 STOP 模式,阻塞等待 WakeupSem
STATE_PRE_SHUTDOWN
预关机:低电告警,保存关键数据(预留)
STATE_SHUTDOWN
关机:通过 HP4570 PMIC 断电(预留)
中断保存/恢复: state_moniter.c 维护 g_irq_states[] 表 (DMA/SPI/USART/TIM11 等 9 个中断源),save_and_disable_interrupts() 逐项保存使能状态 + 禁用 + 清除 Pending 位;restore_interrupts() 按原样恢复。
背光管理 (Black Light Manage)
架构角色
源文件
背光管理 5ms 周期任务:队列消费最新亮度 → 系统状态机分派(ACTIVE应用 / IDLE最低 / SLEEP关闭) → PWM 背光
04_Service/Service_5ms_Cycle/black_light_manage/black_light_manage.c
头文件(亮度百分比数据块定义)
04_Service/Service_5ms_Cycle/black_light_manage/black_light_manage.h
架构角色
源文件
RTC 时间读取(每 200ms),读小时/分钟/秒 + 年月日
04_Service/Service_5ms_Cycle/calender_calculate/calender_calculate.c
头文件
04_Service/Service_5ms_Cycle/calender_calculate/calender_calculate.h
3.2 Service_PowerManager — 低功耗管理
架构角色
源文件
核心 :低功耗监控任务,配合状态机完成 STOP 模式进出
04_Service/Service_PowerManager/lower_power_manager.c
头文件
04_Service/Service_PowerManager/lower_power_manager.h
工作流程:
low_power_monitor_task()
├── 初始:drv_adapter_hp4570_init() [初始化 HP4570 PMIC]
├── 循环:
│ ├── watchdog_unregister() → os_sema_take(SleepReqSem) [等待休眠信号]
│ ├── watchdog_register() → watchdog_pause()
│ ├── enter_stop_mode_rtos() [HAL_SuspendTick→关SysTick→STOP(WFI)]
│ ├── 唤醒后 SystemClock_Config() + HAL_ResumeTick
│ ├── watchdog_resume() → watchdog_feed()
│ └── os_sema_give(WakeupSem) [通知状态机已唤醒]
└── 回到循环开头
3.3 Service_Sensor — 传感器服务
架构角色
源文件
核心 :传感器轮询任务,周期性读取温湿度+运动数据,Mutex保护写入全局状态,Queue发布数据
04_Service/Service_Sensor/service_sensor.c
传感器服务头文件(传感器类型位掩码、传感器状态结构体、MPU6050数据结构体)
04_Service/Service_Sensor/service_sensor.h
传感器类型位掩码(预留扩展):
#define SENSOR_TEMP (1 << 0) // 温度
#define SENSOR_HUMIDITY (1 << 1) // 湿度
#define SENSOR_MOTION (1 << 2) // 运动(已启用,MPU6050)
#define SENSOR_PRESSURE (1 << 3) // 气压(预留)
#define SENSOR_ALTITUDE (1 << 4) // 海拔(预留)
#define SENSOR_HEARTRATE (1 << 5) // 心率(预留)
轮询状态结构体:
字段
类型
用途
active_sensors
uint32_t
当前活跃传感器掩码
temp_sample_rate
uint32_t
温度采样间隔(ms),默认 10000ms
motion_sample_rate
uint32_t
运动采样间隔(ms),默认 100ms
last_temp_sample
uint32_t
上次温度采样时间戳
last_motion_sample
uint32_t
上次运动采样时间戳
temp_sampling_enabled
bool
温度采样使能标志
motion_sampling_enabled
bool
运动采样使能标志
MPU6050 传感器数据结构体(定义在 service_sensor.h):
字段
类型
含义
accel_x/y/z_raw
int16_t
原始加速度计数据
ax/ay/az
double
转换后的加速度 (g)
gyro_x/y/z_raw
int16_t
原始陀螺仪数据
gx/gy/gz
double
转换后的角速度 (dps)
temperature
float
芯片温度 (°C)
kalman_angle_x/y
double
Kalman 滤波角度 (预留)
架构角色
源文件
薄封装层(对 aht21_wrapper 的二次封装,提供业务级API)
04_Service/Service_Sensor/service_temp_humi_process/temp_humi_port.c
封装层头文件(init/deinit/read_temp/read_humi/read_temp_and_humi)
04_Service/Service_Sensor/service_temp_humi_process/temp_humi_port.h
架构角色
源文件
薄封装层(对 mpu6050_wrapper 的二次封装,提供业务级 motion API)
04_Service/Service_Sensor/service_motion_process/motion_port.c
封装层头文件(init/deinit/readdata/getreqstate/readdataend)
04_Service/Service_Sensor/service_motion_process/motion_port.h
motion_port API:
API
功能
motion_init()
初始化 MPU6050 驱动全链路
motion_deinit()
反初始化 MPU6050
motion_readdata()
获取 DMA 缓冲区原始数据指针
motion_getreqstate()
查询数据就绪状态(Queue 超时检查)
motion_readdataend()
结束本次读取,释放缓冲区
架构角色
源文件
核心 :硬件IWDG + 软件任务注册/喂狗/巡检 + 安全模式
04_Service/service_watchdog_monitor/watchdog_monitor.c
看门狗头文件(注册/取消/喂狗 API)
04_Service/service_watchdog_monitor/watchdog_monitor.h
看门狗API:
API
功能
watchdog_register(handle, timeout_ms, name)
注册任务到监控列表(按 OS 句柄索引)
watchdog_feed(handle)
任务喂狗(更新最后活跃时间)
watchdog_unregister(handle)
取消注册
watchdog_pause() / watchdog_resume()
暂停/恢复监控
watchdog_is_paused() / watchdog_is_safe_mode()
查询监控状态
watchdog_clear_boot_fail_count()
清除启动失败计数
4. BSP驱动层 (02_BSP_Platform) — 源码映射
每个传感器驱动遵循统一的三层架构 :
Driver (纯寄存器级) → Handler (事件队列 + RTOS线程) → Adapter + Wrapper (Bridge模式)
层级
源文件
Driver :OOP-style vtable、依赖注入接口、I2C寄存器读写
02_BSP_Platform/01_Bsp/AHT21/AHT21_Driver/aht21_driver.h
Driver实现:aht21_inst() 构造函数、初始化序列、温湿度计算
02_BSP_Platform/01_Bsp/AHT21/AHT21_Driver/aht21_driver.c
寄存器地址定义
02_BSP_Platform/01_Bsp/AHT21/AHT21_Driver/aht21_reg.h
Handler :FreeRTOS事件线程,管理事件队列、温湿度数据解包
02_BSP_Platform/01_Bsp/AHT21/AHT21_Handler/aht21_handler.h
Handler实现
02_BSP_Platform/01_Bsp/AHT21/AHT21_Handler/aht21_handler.c
AHT21 Driver 接口依赖注入:
bsp_aht21_driver_t
├── aht21_driver_input_api_t
│ ├── i2c_bus_interface_t → I2C start/stop/send/recv/ACK
│ ├── timebase_interface_t → 系统tick获取
│ └── yield_interface_t → RTOS任务让出
MPU6050 六轴IMU(Driver + Handler接口已定义)
层级
源文件
Driver :20+虚函数vtable、6接口DI、Kalman数据结构
02_BSP_Platform/01_Bsp/MPU6050/MPU6050_Driver/mpu6050_driver.h
Driver实现
02_BSP_Platform/01_Bsp/MPU6050/MPU6050_Driver/mpu6050_driver.c
寄存器地址定义
02_BSP_Platform/01_Bsp/MPU6050/MPU6050_Driver/mpu6050_reg.h
寄存器位域宏
02_BSP_Platform/01_Bsp/MPU6050/MPU6050_Driver/mpu6050_reg_bit.h
环形缓冲区(DMA→Buffer→Queue 数据管道)
02_BSP_Platform/01_Bsp/MPU6050/MPU6050_Driver/circular_buffer.h
环形缓冲区实现
02_BSP_Platform/01_Bsp/MPU6050/MPU6050_Driver/circular_buffer.c
Handler :队列/信号量/任务通知,支持DMA中断链
02_BSP_Platform/01_Bsp/MPU6050/MPU6050_Handler/mpu6050_handler.h
Handler实现
02_BSP_Platform/01_Bsp/MPU6050/MPU6050_Handler/mpu6050_handler.c
MPU6050 接口依赖注入图:
bsp_mpu6050_driver_t
├── mpu6050_iic_driver_interface_t → I2C总线读/写/DMA读
├── hardware_interrupt_interface_t → GPIO中断使能/禁用
├── mpu6050_delay_interface_t → us/ms延时
├── mpu6050_timebase_interface_t → 系统tick获取
├── mpu6050_yield_interface_t → RTOS任务让出
├── mpu6050_os_interface_t → Queue/Mutex/Semaphore (11个方法)
└── buffer_interface_t → DMA环形缓冲区管理
层级
源文件
Driver :OOP-style vtable(12个虚函数)、I2C 依赖注入接口、充电使能/电压/电流配置
02_BSP_Platform/01_Bsp/HP4570/HP4570_Driver/hp4570_driver.h
Driver实现
02_BSP_Platform/01_Bsp/HP4570/HP4570_Driver/hp4570_driver.c
寄存器地址定义
02_BSP_Platform/01_Bsp/HP4570/HP4570_Driver/hp4570_reg.h
寄存器实现
02_BSP_Platform/01_Bsp/HP4570/HP4570_Driver/hp4570_reg.c
HP4570 Driver 接口依赖注入:
bsp_hp4570_driver_t
├── hp4570_iic_driver_interface_t → I2C mem_write/mem_read
├── pf_inst() → 构造函数(注入I2C实例 + 芯片版本)
└── vtable:
├── pf_init() / pf_deinit()
├── pf_enable_charge() / pf_disable_charge()
├── pf_set_vbat_mv() / pf_set_ichg_ma()
├── pf_read_chip_ver() / pf_read_charge_stat0()
层级
源文件
Driver :OOP-style vtable、SPI 3线接口、240×280 RGB565、硬件复位序列
02_BSP_Platform/01_Bsp/ST7789/ST7789_Driver/bsp_st7789_driver.h
Driver实现:st7789_init() 寄存器初始化序列 + Gamma校正 + 填充/打点/画线/写字符串
02_BSP_Platform/01_Bsp/ST7789/ST7789_Driver/bsp_st7789_driver.c
Driver接口链接(函数指针装配)
02_BSP_Platform/01_Bsp/ST7789/ST7789_Driver/bsp_st7789_link.h
寄存器命令/数据定义
02_BSP_Platform/01_Bsp/ST7789/ST7789_Driver/st7789_reg_define.h
PWM背光控制 :TIM2_CH2 839Hz PWM,0~100% 线性占空比
02_BSP_Platform/01_Bsp/ST7789/ST7789_Driver/backlight_control.c
ST7789 Driver 接口依赖注入:
bsp_st7789_driver_t
├── basic_oper_driver_interface_t → SPI传输 + CS/DC/RST GPIO控制
├── st7789_spi_driver_interface_t → 写命令/写数据/写单字节
├── st7789_timebase_interface_t → OS延时/tick获取
└── st7789_yield_interface_t → RTOS任务让出
层
源文件
Wrapper :抽象显示接口 display_drv_t(init/deinit/draw_pixel/set_backlight/draw_image)
02_BSP_Platform/02_Adapter/02_4-ST7789/wrapper/bsp_wrapper_display.h
Wrapper实现(注册表管理 + 分发)
02_BSP_Platform/02_Adapter/02_4-ST7789/wrapper/bsp_wrapper_display.c
Adapter :注册函数 drv_adapter_display_register(),装配 ST7789 全链路
02_BSP_Platform/02_Adapter/02_4-ST7789/adapter/bsp_adapter_port_display.h
Adapter实现
02_BSP_Platform/02_Adapter/02_4-ST7789/adapter/bsp_adapter_port_display.c
4.3 Adapter + Wrapper(Bridge模式适配层)
设计模式说明: Wrapper 定义抽象接口(函数指针结构体),Adapter 提供注册函数绑定具体驱动,使上层服务代码不依赖具体芯片型号。
层
源文件
Wrapper :抽象接口 temphumi_drv_t(init/deinit/read_temp/read_humi/read_both)
02_BSP_Platform/02_Adapter/02_1-AHT21/wrapper/aht21_wrapper.h
Wrapper实现
02_BSP_Platform/02_Adapter/02_1-AHT21/wrapper/aht21_wrapper.c
Adapter :注册函数 drv_adapter_temphumi_register(),装配Driver+Handler+OS+I2C
02_BSP_Platform/02_Adapter/02_1-AHT21/adapter/aht21_adaption.h
Adapter实现
02_BSP_Platform/02_Adapter/02_1-AHT21/adapter/aht21_adaption.c
层
源文件
Wrapper :抽象运动传感器接口
02_BSP_Platform/02_Adapter/02_2-MPU6050/wrapper/mpu6050_wrapper.h
Wrapper实现
02_BSP_Platform/02_Adapter/02_2-MPU6050/wrapper/mpu6050_wrapper.c
Adapter :注册函数,装配MPU6050全链路
02_BSP_Platform/02_Adapter/02_2-MPU6050/adapter/mpu6050_adaption.h
Adapter实现
02_BSP_Platform/02_Adapter/02_2-MPU6050/adapter/mpu6050_adaption.c
层
源文件
Wrapper :抽象充电管理接口 hp4570_drv_t(10个虚函数:init/deinit/charge/voltage/current/status/pwrkey/batfet)
02_BSP_Platform/02_Adapter/02_3-HP4570/wrapper/hp4570_wrapper.h
Wrapper实现(全局注册/分发函数)
02_BSP_Platform/02_Adapter/02_3-HP4570/wrapper/hp4570_wrapper.c
Adapter :注册函数 drv_adapter_hp4570_register(),装配 HP4570 Driver+I2C 全链路
02_BSP_Platform/02_Adapter/02_3-HP4570/adapter/hp4570_adaption.h
Adapter实现
02_BSP_Platform/02_Adapter/02_3-HP4570/adapter/hp4570_adaption.c
5. MCU外设抽象层 (02_MCU_Platform) — 源码映射
外设
源文件
GPIO :集中式引脚枚举表、ROM配置表、动态RCC时钟使能
02_MCU_Platform/MCU_Core_GPIO/gpio_port.c
GPIO头文件(引脚枚举 CORE_GPIO_TEMPHUMI_SDA/SCL 等)
02_MCU_Platform/MCU_Core_GPIO/gpio_port.h
GPIO引脚宏定义(传感器I2C引脚 PB6/PB7)
02_MCU_Platform/MCU_Core_GPIO/gpio_define.h
I2C :硬件/软件双模I2C、Mutex保护、DMA读支持
02_MCU_Platform/MCU_Core_I2C/i2c_port.c
I2C头文件(总线枚举、便捷宏 SENSOR_I2C_HARDWARE_WRITE)
02_MCU_Platform/MCU_Core_I2C/i2c_port.h
ADC :多通道ADC抽象、score_adc_measure() 轮询接口
02_MCU_Platform/MCU_Core_ADC/adc_port.c
ADC头文件(总线枚举 CORE_ADC_BUS_1、便捷宏 LIGHT_ADC_MEASURE)
02_MCU_Platform/MCU_Core_ADC/adc_port.h
I2C总线分配:
总线
模式
引脚
挂载设备
I2C1
硬件
PB6(SCL) / PB7(SDA)
AHT21 + MPU6050(共享总线)
I2C3
硬件
PA8(SCL) / PB4(SDA)
CST816T 触摸屏(预留)
6. OS抽象层 (02_OS_Platform) — 源码映射
[Application] 01_APP/ 04_Service/
↑ 调用平台OS API
[OS Public API] 02_OS_Platform/inc/platform_os.h
↑ 委托到各模块实现
[OS Implementation] 02_OS_Platform/src/{Task,Queue,Mutex,Sema,Event,System}/
↑ 调用
[FreeRTOS Kernel] Middlewares/Third_Party/FreeRTOS/
注意:当前项目采用扁平两层OSAL ,未引入独立的 Middlewares/os_adapter/ 中间件层。所有OS句柄为 void* opaque handle,业务代码完全不包含FreeRTOS原生头文件。
层级
功能
源文件
总入口
统一引用所有OSAL子模块 + 便捷API(os_delay_ms, os_enter_critical 等)
02_OS_Platform/inc/platform_os.h
Task API
os_task_create/delete/get_handle
02_OS_Platform/src/Task/os_task_port.h
Task实现
xTaskCreate/xTaskDelete/xTaskGetCurrentTaskHandle
02_OS_Platform/src/Task/os_task_port.c
Queue API
os_queue_create/put/get/delete/put_from_isr
02_OS_Platform/src/Queue/os_queue_port.h
Queue实现
xQueueCreate/xQueueSend/xQueueReceive(含ISR版本路由)
02_OS_Platform/src/Queue/os_queue_port.c
Mutex API
os_mutex_create/take/give/delete
02_OS_Platform/src/Mutex/os_mutex_port.h
Mutex实现
xSemaphoreCreateMutex/xSemaphoreTake/xSemaphoreGive
02_OS_Platform/src/Mutex/os_mutex_port.c
Semaphore API
os_sema_create/take/give(支持Binary/Counting)
02_OS_Platform/src/Sema/os_sema_port.h
Semaphore实现
xSemaphoreCreateBinary/Counting/Give/Take
02_OS_Platform/src/Sema/os_sema_port.c
EventGroup API
os_event_create/wait/set/clear/delete
02_OS_Platform/src/Event/os_event_port.h
EventGroup实现
xEventGroupCreate/WaitBits/SetBits/ClearBits/Delete
02_OS_Platform/src/Event/os_event_port.c
System API
os_enter_critical/os_exit_critical/os_delay_ms/os_get_tick_ms
02_OS_Platform/src/System/os_system_port.h
System实现
taskENTER_CRITICAL/vTaskDelay/xTaskGetTickCount
02_OS_Platform/src/System/os_system_port.c
任务
优先级
栈大小
入口函数
角色
userTask (one-shot)
PRI_EMERGENCY
2048B
userTaskInitFunction()
OS资源+watchdog_init+LVGL显示初始化 → 批量创建业务任务 → 自删除
tempHandlerTask
PRI_HARD_REALTIME + 1
512B
temp_humi_handler_thread()
AHT21事件驱动温湿度处理
WatchDog_Thread
PRI_SOFT_REALTIME + 3
512B
server_watchdog_task()
软件看门狗:巡检注册任务 → 喂硬件IWDG
SensorTask
PRI_SOFT_REALTIME + 3
512B
sensor_polling_task()
传感器轮询(100ms周期,温湿度10s + 运动100ms)
Thread_5ms_Task
PRI_SOFT_REALTIME + 4
256B
thread_5ms_task()
5ms 系统调度器:ADC+BMS+状态机+RTC
defaultTask
PRI_NORMAL
512B
StartDefaultTask()
空闲循环(osDelay(5))
已注释待启用的任务: MPU6050Task (MPU6050, PRI_HARD_REALTIME+1, 1024B) / LowPower_Thread (低功耗监控, PRI_SOFT_REALTIME, 256B)。
8.1 模式 A:全局状态 + 互斥锁(共享内存)
sensor_polling_task() 任何消费者任务
│ │
├─ os_mutex_take(SensorDataMutex) ├─ os_mutex_take(SensorDataMutex)
├─ g_system_status.temperature = x ├─ val = g_system_status.temperature
├─ g_system_status.humidity = y ├─ val = g_system_status.humidity
└─ os_mutex_give(SensorDataMutex) └─ os_mutex_give(SensorDataMutex)
角色
源文件
全局状态结构体定义 (system_status_t)
01_APP/User_Init/User_Init_Imple/user_init.h
Mutex句柄初始化 (SensorDataMutex)
01_APP/User_Init/02_User_Task_Config/user_task_config.c
写入方 :传感器任务更新 g_system_status
04_Service/service_sensor.c
全局状态实例
01_APP/User_Init/User_Init_Imple/user_init.c
Queue名称
深度
数据大小
发送方
接收方
SensorDataQueue
2
uint32_t
sensor_polling_task()
外部消费者
LastPressCntQueue
1
uint32_t
LVGL indev(触摸/按键事件)
state_moniter.c (active_run/idle_run)
Queue配置表定义: 01_APP/User_Init/02_User_Task_Config/user_task_config.c
8.3 模式 C:Semaphore 同步(低功耗休眠/唤醒握手)
系统状态机 (state_moniter.c) 与低功耗执行者 (lower_power_manager.c) 之间通过二值信号量做休眠/唤醒握手:
state_moniter (状态机) lower_power_manager (执行者)
│ │
│ [进入 STATE_STOP] │ [等待休眠信号量]
├─ os_sema_give(SleepReqSem) ──────────→ ├─ os_sema_take(SleepReqSem, ∞)
│ │ [收到信号,进入 STOP 模式]
├─ os_sema_take(WakeupSem, ∞) [阻塞] │ enter_stop_mode_rtos() [WFI挂起]
│ ←中断唤醒→
│ │ [恢复时钟、看门狗]
│ ←────├─ os_sema_give(WakeupSem)
├─ [收到唤醒信号] │
│ [判断唤醒源 → STATE_ACTIVE] │ [回到循环起点,等待下一次休眠信号]
信号量定义: SleepReqSem (二进制), WakeupSem (二进制),定义于 user_task_config.c。
8.4 模式 D:任务挂起/恢复(低功耗上下文保护)
进入休眠 (STATE_PRE_SLEEP) 时通过 os_task_suspend() 挂起传感器任务,唤醒 (STATE_STOP exit) 后通过 os_task_resume() 恢复:
// state_moniter.c:276-278 — pre_sleep_enter
os_task_suspend (st_usertaskcfg [USER_IDX_sensor_polling_task ].task_handle );
os_task_suspend (st_usertaskcfg [USER_IDX_temp_humi_handler_thread ].task_handle );
// state_moniter.c:327-328 — stop_exit
os_task_resume (st_usertaskcfg [USER_IDX_sensor_polling_task ].task_handle );
os_task_resume (st_usertaskcfg [USER_IDX_temp_humi_handler_thread ].task_handle );
9. 库与中间件层 (03_Libraries + Middlewares) — 源码映射
模块
源文件
用途
软件I2C总线
03_Libraries/02_1-Common/IIC_BUS/i2c_bus.c
位脉冲式I2C主机,支持单字节/多字节读写
软件I2C头文件
03_Libraries/02_1-Common/IIC_BUS/i2c_bus.h
i2c_bus_t 引脚可配置结构体
DWT延时
03_Libraries/02_1-Common/DWT_Delay/DWT_delay.c
ARM DWT周期计数器微秒级精确延时
DWT延时头文件
03_Libraries/02_1-Common/DWT_Delay/DWT_Delay.h
delay_us() / DWT_Init()
FIFO缓冲区
03_Libraries/02_1-Common/FIFO/multi_cyc_fifo.c
多字节环形FIFO
FIFO头文件
03_Libraries/02_1-Common/FIFO/multi_cyc_fifo.h
FIFO结构体与API
模块
源文件
用途
EasyLogger (v2.2.0)
03_Libraries/02_2-ThirdParty/elog/
结构化日志框架,log_d()/log_e()/log_i()
SEGGER RTT (v3.54)
03_Libraries/02_2-ThirdParty/SEGGER/
J-Link实时传输,SEGGER_RTT_printf()
SEGGER SystemView (v3.54)
03_Libraries/02_2-ThirdParty/SEGGER/
FreeRTOS任务级追踪与性能分析
Debug初始化
02_BSP_Platform/02_Adapter/02_X-Debug/user_debug.c
统一初始化RTT + EasyLogger
模块
路径
用途
FreeRTOS V10.3.1
Middlewares/Third_Party/FreeRTOS/
抢占式RTOS内核 (56优先级, heap_4, 30KB堆)
CMSIS-RTOS V2
Middlewares/Third_Party/FreeRTOS/CMSIS_RTOS_V2/
FreeRTOS → CMSIS-RTOS V2 API适配
LVGL V8.3.10
Middlewares/LVGL/lvgl-8.3.10/
嵌入式GUI框架,双缓冲区 (240×25×2),lv_demo_widgets
STM32F4 HAL
Drivers/STM32F4xx_HAL_Driver/
STM32硬件抽象层
CMSIS Core
Drivers/CMSIS/
Cortex-M4核心支持
模块
源文件
用途
启动文件
startup_stm32f411xe.s
中断向量表、Reset_Handler
链接脚本
STM32F411XX_FLASH.ld
512KB Flash / 128KB RAM 内存布局
中断服务函数
Core/Src/stm32f4xx_it.c
EXTI/DMA/USART/TIM IRQ Handler
HAL MSP
Core/Src/stm32f4xx_hal_msp.c
外设GPIO/时钟引脚初始化
HAL Timebase
Core/Src/stm32f4xx_hal_timebase_tim.c
TIM11作为HAL 1ms时基
时钟配置
Core/Src/main.c (SystemClock_Config)
HSI 16MHz → PLL → 100MHz SYSCLK
外设
实例
引脚
用途
I2C1
硬件
PB6(SCL), PB7(SDA)
AHT21 + MPU6050 + HP4570 共享总线
I2C3
硬件
PA8(SCL), PB4(SDA)
CST816T 触摸屏(预留)
SPI1
硬件
PA5(CLK), PA7(MOSI), PA4(CS), PA6(DC), PB10(RST)
ST7789 LCD 显示屏 (240×280 RGB565)
SPI2
硬件
PB13(CLK), PB15(MOSI), PB14(MISO), PB12(CS)
W25Q128 外部Flash(预留)
USART1
硬件
PA9(TX), PA10(RX)
蓝牙模块(预留)
ADC1
硬件
PA2(Ch2), PB0(Ch8), 内部VREF
光敏传感器 + 电池电压 + VREFINT校准(3通道间断模式)
TIM2_CH2
硬件
PA1 (AF1)
ST7789 PWM 背光 (839Hz, 0~100% 占空比)
TIM11
硬件
内部
HAL 1ms时基
IWDG
硬件
内部
硬件看门狗
RTC
硬件
内部
实时时钟
EXTI0
外部中断
PA0
用户按键3
EXTI2
外部中断
PB2
触摸屏中断(预留)
EXTI9_5
外部中断
PB5
MPU6050 中断(预留)
角色
源文件
根构建文件 :可执行目标 SmartWatch_STM32F411,链接所有子库
CMakeLists.txt
工具链配置 :arm-none-eabi-gcc, Cortex-M4 + hard FP
cmake/gcc-arm-none-eabi.cmake
HAL/FreeRTOS构建 :STM32CubeMX生成的源文件编译规则
cmake/stm32cubemx/CMakeLists.txt
CMake预设 :Debug (-O0 -g3) / Release (-Os -g0)
CMakePresets.json
STM32CubeMX工程
SmartWatch_STM32F411.ioc
链接库结构:
SmartWatch_STM32F411 (executable)
├── stm32cubemx (interface lib: HAL/FreeRTOS头文件路径 + 编译宏)
├── STM32_Drivers (object lib: 所有HAL .c 文件)
├── FreeRTOS (object lib: FreeRTOS内核 + CMSIS-RTOS V2 + port + heap_4)
├── lvgl (LVGL 8.3.10 核心库)
├── lvgl_demos (LVGL demo widgets)
├── app (interface lib: 01_APP/)
├── bsp_adapter (02_BSP_Platform/)
├── os_platform (02_OS_Platform/)
├── mcu_platform (02_MCU_Platform/)
├── libraries (03_Libraries/)
├── service (04_Service/)
└── -lm (数学库)
设计模式
体现位置
核心源文件
面向对象C(struct + 函数指针vtable)
所有BSP Driver
aht21_driver.h, mpu6050_driver.h
依赖注入(接口注入)
Driver _inst() 构造函数
aht21_driver.c, mpu6050_adaption.c
Bridge模式(抽象与实现分离)
Adapter + Wrapper(AHT21/MPU6050/HP4570)
aht21_wrapper.h, mpu6050_wrapper.h, hp4570_wrapper.h
三层架构(Driver/Handler/Adapter-Wrapper)
每个BSP外设
01_Bsp/*/ + 02_Adapter/*/
状态机表驱动(FSM Table-Driven)
8状态系统状态机
state_moniter.c (g_stateTable[STATE_MAX_COUNT])
信号量握手同步(Semaphore Handshake)
低功耗休眠/唤醒
state_moniter.c ⇄ lower_power_manager.c
声明式配置(数据即配置)
RTOS资源创建
user_task_config.c (st_usertaskcfg_t[])
弱符号桩(编译期功能裁剪)
任务函数默认实现
user_task_config.c (__WEAK 函数)
类型擦除(Opaque Handle)
OS抽象层
platform_os.h (void* 句柄)
生产者-消费者(Queue解耦)
传感器数据发布
service_sensor.c → g_sensor_data_queue
注册/回调模式
看门狗任务监控
watchdog_monitor.c
事件驱动Handler
传感器数据处理
aht21_handler.c (事件队列 + RTOS线程)
模块
状态
说明
启动流程 + 时钟配置
✅ 完成
HSI→PLL 100MHz
FreeRTOS + CMSIS-RTOS V2
✅ 完成
56优先级, heap_4, 30KB堆
OS抽象层 (Task/Queue/Mutex/Sema/Event/System)
✅ 完成
全opaque handle
GPIO抽象层
✅ 完成
集中式引脚枚举 + ROM配置表
I2C抽象层 (硬件+软件双模)
✅ 完成
Mutex保护, DMA读
AHT21传感器 (Driver→Handler→Adapter→Wrapper)
✅ 完成
完整三层+Bridge
SEGGER RTT + EasyLogger 调试
✅ 完成
RTT printf + 结构化日志
传感器轮询服务
✅ 完成
温湿度 + 运动数据采集,Mutex保护 + Queue发布
运动传感器封装层
✅ 完成
motion_port 薄封装,对 MPU6050 Wrapper 二次封装
看门狗监控服务
✅ 完成
注册/喂狗/安全模式
MPU6050 Adapter/Wrapper
✅ 完成
motion_drv_t Bridge模式全链路装配
声明式RTOS资源配置
✅ 完成
4任务 + 2队列 + 2互斥锁 + 2信号量批量创建 + Weak桩
软件I2C位脉冲驱动
✅ 完成
引脚可配置
5ms 周期调度器
✅ 完成
固定序列:喂狗→ADC采样→电池计算→RTC;状态机/背光/关机检测待启用
电池监控 (BMS)
✅ 完成
VREFINT 校准→VDDA 反推→5阶滑动滤波→12段 OCV-SOC LUT 线性插值
RTC 日历读取
✅ 完成
200ms 限频,读时分秒 + 年月日
ADC 多通道抽象层
✅ 完成
总线索引轮询,VREFINT/BAT/LIGHT 三通道间断模式
ISR 中断分发路由
✅ 完成
HAL_GPIO_EXTI_Callback + HAL_I2C_MemRxCpltCallback 集中分发
ST7789 LCD显示驱动 + LVGL 8.3.10
✅ 完成
SPI1 3线接口 (PA5 CLK/PA7 MOSI/PA6 DC/PA4 CS/PB10 RST),240×280 RGB565,LVGL widget demo 运行正常
PWM 背光控制
✅ 完成
TIM2_CH2 (PA1/AF1),839Hz,0~100% 线性占空比
长按关机检测
✅ 完成
PA0 长按→HP4570 PMIC 断电,位于 thread_5ms_task 中
模块
状态
说明
MPU6050 六轴IMU
🔧 Driver+Handler 已跑通
FIFO + DMA 中断链工作,加速度/角速度解包正常;MpuHandlerTask 待启用
8状态系统状态机 (FSM)
🔧 代码完整
表驱动 g_stateTable[],Enter/Run/Exit 回调;system_state_task_5ms() 调用待启用
HP4570 充电管理IC
🔧 驱动完整
完整三层+Bridge,充电使能/电压/电流/BATFET API 已实现;Adapter 注册待接入 app_periph_init
低功耗管理 (STOP 模式)
🔧 代码完整
Semaphore 握手、中断保存/恢复、WFI 深休眠均已实现;LowPower_Thread 待启用
模块
状态
说明
CST816T 触摸驱动
📋 预留
I2C3已初始化
W25Q128 外部Flash
📋 预留
SPI2引脚已配置
BLE蓝牙通信
📋 预留
USART1已配置
OTA固件升级
📋 预留
—
计步算法 / 心率算法
📋 预留
—
SPL06气压 / EM7028心率 / LIS2MDL磁力计
📋 预留
—
WT588语音
📋 预留
—
文档
路径
本架构映射文档
0X_DOC/SmartWatch.md
参考架构(EC_S100 Watch)
0X_DOC/项目架构.md
学习路径
0X_DOC/学习路径.md
温湿度传感器和陀螺仪驱动的差异
0X_DOC/温湿度传感器和陀螺仪驱动的差异.md
温湿度传感器调用链
0X_DOC/温湿度传感器调用链.md
使用建议: 当你在流程图中看到一个模块/模式,用此表快速定位到对应的 .c/.h 文件。本文档随每次涉及架构变动的 git commit 增量更新,始终保持与代码同步。
本项目采用 MIT License 开源协议。
Made with ❤️ and Architecture-First mindset.