# 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
⌚ 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.