Skip to content

MomentA27/SmartWatch

Repository files navigation

MCU RTOS Language Architecture

⌚ SmartWatch STM32F411

架构驱动 · 纯C面向对象 · 生产级代码规范
一款不只是实现功能的智能手表固件,更是嵌入式 C 语言架构设计的最佳实践。

1. 整体分层架构

┌──────────────────────────────────────────────────────────────────┐
│                  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 / 调试)   │
└──────────────────────────────────────────────────────────────────┘

2. 应用层 (01_APP) — 源码映射

2.1 系统初始化

架构角色 源文件
系统入口,时钟配置,外设初始化,启动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()` 在业务任务实际运行前一定完成。

2.2 声明式资源配置表

架构角色 源文件
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

电池监控 (Battery Monitor)

架构角色 源文件
电池 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 日历读取

架构角色 源文件
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 — 传感器服务

3.3.1 传感器轮询服务

架构角色 源文件
核心:传感器轮询任务,周期性读取温湿度+运动数据,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 滤波角度 (预留)

3.3.2 温湿度封装层

架构角色 源文件
薄封装层(对 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

3.3.3 运动传感器封装层

架构角色 源文件
薄封装层(对 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() 结束本次读取,释放缓冲区

3.4 看门狗监控服务

架构角色 源文件
核心:硬件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) — 源码映射

4.1 驱动三层架构总览

每个传感器驱动遵循统一的三层架构

Driver (纯寄存器级) → Handler (事件队列 + RTOS线程) → Adapter + Wrapper (Bridge模式)

4.2 传感器驱动清单

AHT21 温湿度传感器(当前最完整实现)

层级 源文件
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环形缓冲区管理

HP4570 充电管理IC(完整三层实现)

层级 源文件
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()

ST7789 LCD 显示驱动(完整实现)

层级 源文件
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任务让出

ST7789 Adapter + Wrapper

源文件
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 提供注册函数绑定具体驱动,使上层服务代码不依赖具体芯片型号。

AHT21

源文件
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

MPU6050

源文件
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

HP4570

源文件
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) — 源码映射

6.1 两层结构

[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原生头文件。

6.2 完整文件映射

层级 功能 源文件
总入口 统一引用所有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

7. 运行时任务映射

任务 优先级 栈大小 入口函数 角色
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. 通信模式 — 源码映射

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

8.2 模式 B:Queue 异步消息

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) — 源码映射

9.1 通用工具库 (03_Libraries)

模块 源文件 用途
软件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

9.2 调试工具

模块 源文件 用途
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

9.3 第三方RTOS与HAL

模块 路径 用途
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核心支持

9.4 硬件初始化代码 (Core/)

模块 源文件 用途
启动文件 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

10. 外设硬件资源表

外设 实例 引脚 用途
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 中断(预留)

11. 构建系统 — 源码映射

角色 源文件
根构建文件:可执行目标 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                (数学库)

12. 关键设计模式速查

设计模式 体现位置 核心源文件
面向对象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.clower_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.cg_sensor_data_queue
注册/回调模式 看门狗任务监控 watchdog_monitor.c
事件驱动Handler 传感器数据处理 aht21_handler.c (事件队列 + RTOS线程)

13. 实现状态总览

已完整实现

模块 状态 说明
启动流程 + 时钟配置 ✅ 完成 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语音 📋 预留

14. 项目文档

文档 路径
本架构映射文档 0X_DOC/SmartWatch.md
参考架构(EC_S100 Watch) 0X_DOC/项目架构.md
学习路径 0X_DOC/学习路径.md
温湿度传感器和陀螺仪驱动的差异 0X_DOC/温湿度传感器和陀螺仪驱动的差异.md
温湿度传感器调用链 0X_DOC/温湿度传感器调用链.md

使用建议: 当你在流程图中看到一个模块/模式,用此表快速定位到对应的 .c/.h 文件。本文档随每次涉及架构变动的 git commit 增量更新,始终保持与代码同步。

📜 License

本项目采用 MIT License 开源协议。

Made with ❤️ and Architecture-First mindset.

About

一款面向架构的量产级智能手表固件,基于 STM32F411 + FreeRTOS。采用纯 C 面向对象设计(vtable/依赖注入/Bridge 模式),独创 Driver→Handler→Adapter 三层驱动框架,全 OS 抽象解耦,声明式资源管理。

Topics

Resources

Stars

Watchers

Forks

Contributors