# SmartWatch **Repository Path**: xuelaoda/SmartWatch ## Basic Information - **Project Name**: SmartWatch - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-10 - **Last Updated**: 2026-06-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

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` | **传感器类型位掩码(预留扩展):** ```c #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()` 恢复: ```c // 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.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线程) | --- ## 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](LICENSE) 开源协议。

Made with ❤️ and Architecture-First mindset.