架构驱动 · 纯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 配置表]
→ os_task_create() ×4 [批量创建 tempHandler / WatchDog / Sensor / 5ms]
→ 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%)
│ ├── 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()← 背光控制(规划中)
├── // user_shutdown_monitor_5ms() ← 长按关机检测(规划中)
└── 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() 按原样恢复。
架构角色
源文件
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()
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
512B
userTaskInitFunction()
OS资源+watchdog_init → 批量创建业务任务 → 自删除
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适配
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), PA1(BL)
ST7789 LCD 显示屏(预留)
SPI2
硬件
PB13(CLK), PB15(MOSI), PB14(MISO), PB12(CS)
W25Q128 外部Flash(预留)
USART1
硬件
PA9(TX), PA10(RX)
蓝牙模块(预留)
ADC1
硬件
PA2(Ch2), PB0(Ch8), 内部VREF
光敏传感器 + 电池电压 + VREFINT校准(3通道间断模式)
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)
├── 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 集中分发
模块
状态
说明
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 待启用
模块
状态
说明
ST7789 LCD显示驱动
📋 预留
SPI1引脚已配置
CST816T 触摸驱动
📋 预留
I2C3已初始化
W25Q128 外部Flash
📋 预留
SPI2引脚已配置
BLE蓝牙通信
📋 预留
USART1已配置
LVGL UI框架
📋 预留
—
OTA固件升级
📋 预留
—
计步算法 / 心率算法
📋 预留
—
SPL06气压 / EM7028心率 / LIS2MDL磁力计
📋 预留
—
背光管理
📋 预留
ST7789 PWM 背光控制
关机按键监控
📋 预留
HP4570 PMIC 长按断电
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.