From 388f1e7ed200f09920ffa0da094e38c453b2f733 Mon Sep 17 00:00:00 2001 From: zouhaitao Date: Thu, 9 Jul 2026 19:53:01 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E4=BF=AE=E5=A4=8D=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=9F=A9=E9=98=B5=E5=92=8C=E6=B5=81=E7=A8=8B=E5=9B=BE=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=BC=95=E8=84=9A=E6=A0=87=E5=8F=B7=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E5=85=B6=E4=B8=8E=E7=A1=AC=E4=BB=B6=E5=8E=9F=E7=90=86=E5=9B=BE?= =?UTF-8?q?=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/30_architecture/main.md | 120 ++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/Docs/30_architecture/main.md b/Docs/30_architecture/main.md index 555b3c8..c64998d 100644 --- a/Docs/30_architecture/main.md +++ b/Docs/30_architecture/main.md @@ -116,68 +116,70 @@ typedef struct { 软件系统采用 **分层依赖、事件驱动、非阻塞** 的模块化架构设计。其层级结构与核心依赖关系如下: -### 4.1 系统层级依赖与调用图 +### 4.1 系统软件架构分层 (三层架构设计) + +为了清晰呈现系统的软硬件隔离层次,手环系统采用单向依赖的层级架构: + +```mermaid +graph TD + subgraph APP ["应用逻辑层 (APP Layer)"] + MainScheduler["主循环调度 (main.c)"] + SysStateMachine["业务状态机 (sys_state)"] + end + subgraph DRV ["外设驱动层 (DRV Layer)"] + KEY["KEY 驱动"] + RF["RF 驱动"] + AMOLED["AMOLED 屏刷"] + PM["PM 功耗驱动"] + LED["LED 彩灯驱动"] + MOTOR["马达震动驱动"] + end + subgraph HW ["硬件抽象与时基层 (HW Layer)"] + Timer1["Timer 1 中断时基"] + GPIO["GPIO / ADC / IAP Flash"] + end + + HW ===>|驱动时基与中断沿| DRV + DRV ===>|提供抽象API与事件缓冲区| APP + APP ===>|调度外设控制指令| DRV +``` + +### 4.2 输入事件采集与流转链条 (Input Event Dataflow) + +展示按键与无线接收信号从物理引脚触发,经过驱动消抖/解码,进入软件事件缓冲区,并最终被主循环及状态机消费的完整依赖链路: ```mermaid graph LR - %% --- 硬件抽象与时基层 (左侧) --- - subgraph LayerHW ["硬件抽象与时基层 (HW Layer)"] - Timer1["Timer 1 (1ms中断)"] - ADC["ADC (电量检测)"] - Flash["IAP (Flash读写)"] - GPIO["GPIO (引脚中断/控制)"] - end + %% 输入物理源 -> 驱动解码 -> 软件缓冲区 -> 状态机消费 + Pin_Key["物理按键 P2.0-P3.7"] -->|10ms 定时扫描| KEY["KEY 扫描与消抖"] + KEY -->|判定按键事件| Buf_Key["key_event_buf (环形事件队列)"] + Buf_Key -->|主循环读取并清除| Scheduler["主循环 (main.c)"] - %% --- 外设驱动层 (中间) --- - subgraph LayerDRV ["外设驱动层 (DRV Layer)"] - KEY["KEY (按键扫描/队列)"] - RF["RF (LR690L收发)"] - PM["PM (功耗电源管理)"] - AMOLED["AMOLED (屏幕绘制)"] - LED["LED (RGB彩灯时序)"] - MOTOR["MOTOR (马达异步震动)"] - end - - %% --- 应用逻辑层 (右侧) --- - subgraph LayerAPP ["应用逻辑层 (APP Layer)"] - MainScheduler["主循环调度器 (main.c)"] - SysStateMachine["SysState 业务状态机"] - SoftRTC["SoftRTC 软件时钟"] - end - - %% --- 连线关系:时基与底层输入驱动外设 --- - Timer1 ==>|1ms时基中断| KEY - Timer1 ==>|1ms中断分频| MOTOR - Timer1 ==>|中断异步控制| LED - Timer1 ==>|秒计数器累加| SoftRTC + Pin_RF["433MHz 载波沿信号"] -->|INT2 中断触发| RF["RF 自适应解调解码"] + RF -->|解码合法 RFEvent| Scheduler - GPIO -.->|外部中断沿触发| RF - GPIO -.->|按键电平读取| KEY - - %% --- 连线关系:外设动作驱动与底层交互 --- - PM -->|SHUT引脚开关SGM3833| GPIO - AMOLED -->|SPI接口像素写指令| GPIO - LED -->|P2.6输出彩灯数据| GPIO - MOTOR -->|P2.4输出马达电平| GPIO - - %% --- 连线关系:主循环轮询输入 --- - KEY ==>|压入环形队列 / 主循环读出| MainScheduler - RF ==>|解码成功包 / 主循环获取| MainScheduler - MainScheduler ==>|喂看门狗| GPIO - - %% --- 连线关系:状态机控制外设输出 --- - MainScheduler -->|分发事件| SysStateMachine - SysStateMachine -->|读取电量及状态| ADC - SysStateMachine -->|读写配对防区数据| Flash - SysStateMachine -->|休眠判定/深度睡眠控制| PM - SysStateMachine -->|Redraw=1 触发重绘| AMOLED - SysStateMachine -->|射频包发射| RF - SysStateMachine -->|指示灯闪烁指示| LED - SysStateMachine -->|马达震动反馈| MOTOR - SysStateMachine -->|获取与同步时间| SoftRTC + Scheduler -->|分发有效事件| StateMachine["业务状态机 (SysState)"] ``` -### 4.2 架构设计与依赖原则说明 +### 4.3 控制输出与外设执行链路 (Output Control Flow) + +展示业务状态机跳转后,如何通过驱动层向底层硬件引脚输出电平信号,以驱动显示、声光报警、马达振动及电源 PMIC 切断: + +```mermaid +graph LR + %% 状态机 -> 外设执行接口 -> 物理引脚拉低/高 + StateMachine["业务状态机 (SysState)"] -->|Redraw=1 重绘页面| AMOLED["Truly RM69310 绘制"] + StateMachine -->|防区警示闪烁| LED["WS2812B 彩灯控制"] + StateMachine -->|特定防区震动模式| MOTOR["马达时序控制"] + StateMachine -->|无操作 10s 超时休眠| PM["PM 功耗与电源断电"] + + AMOLED -->|SPI 引脚输出| Pin_OLED["OLED 屏幕 (Pin 9-14)"] + LED -->|P2.6 单线时序| Pin_LED["RGB 灯珠 (Pin 27)"] + MOTOR -->|P2.4 PWM 电平| Pin_Mot["马达驱动 (Pin 25)"] + PM -->|P2.7 SHUT 拉低| Pin_PMIC["SGM3833 PMIC (Pin 28)"] +``` + +### 4.4 架构设计与依赖原则说明 1. **单向依赖原则**: * **APP 层**仅依赖于 **DRV 层**提供的高级抽象接口(例如 `LED_Set_Color`、`Motor_Start_Pattern`)和 **HW 层**的数据库读写。**严禁**在 APP 层直接写入具体 IO 寄存器。 @@ -193,7 +195,7 @@ graph LR * 进入休眠前,由 `PM` 驱动断开 `SGM3833` 电源以彻底消除 AMOLED 的暗漏电流。 * 唤醒时,由 GPIO 的电平沿变化触发中断,唤醒 CPU 后由 `PM` 优先执行 **“上电 -> 强延时 50ms 避开浪涌 -> 屏幕控制器重初始化”** 的安全恢复时序,防止未稳定电网下的写屏导致屏幕损坏或花屏。 -### 4.3 核心主程序调度框架 (main.c) +### 4.5 核心主程序调度框架 (main.c) 主程序采用完全解耦的时间片轮询加事件触发的非阻塞循环结构: @@ -295,7 +297,7 @@ void main(void) { ```mermaid flowchart TD %% 硬件输入事件 - PinKey[物理按键按下 / 下降沿] -->|P0.1-P0.5 端口中断| ISR_Port0[Port0 中断 ISR] + PinKey[物理按键按下 / 下降沿] -->|P2.0-P3.7 端口中断| ISR_Port0[GPIO 中断 ISR] Carrier[433MHz 射频载波信号] -->|INT2 中断| ISR_INT2[INT2 唤醒中断 ISR] %% 中断服务层 (ISR) @@ -334,11 +336,11 @@ flowchart TD | 事件名称 | 输入源 (触发条件与参数) | 状态机判定逻辑 (当前状态与条件) | 输出结果 & 动作执行 (显示、灯效、马达与无线) | | :--- | :--- | :--- | :--- | -| **按键操作事件**
`KEY_EVENT` | **源**:P0.1~P0.5 下降沿中断。
**参数**:`KEY_UP`、`KEY_DOWN`、`KEY_CONFIRM` (短按/长按)。 | **当前状态**:`STATE_CLOCK` / `STATE_MENU` 等。
**条件**:在待机下长按确认键 3 秒进入菜单;在菜单下短按 ▲/▼ 键翻页。 | 1. **显示**:置 `Redraw = 1`,LCD 刷新切换对应页面;
2. **触觉**:发出 50ms 极短振动作按键反馈。 | +| **按键操作事件**
`KEY_EVENT` | **源**:P2.0~P3.7 下降沿中断。
**参数**:`KEY_UP`、`KEY_DOWN`、`KEY_CONFIRM` (短按/长按)。 | **当前状态**:`STATE_CLOCK` / `STATE_MENU` 等。
**条件**:在待机下长按确认键 3 秒进入菜单;在菜单下短按 ▲/▼ 键翻页。 | 1. **显示**:置 `Redraw = 1`,LCD 刷新切换对应页面;
2. **触觉**:发出 50ms 极短振动作按键反馈。 | | **主动求救事件**
`SOS_ACTIVE_EVENT` | **源**:上部任意 SOS 按键按下(短按或长按)。 | **当前状态**:除已报警外的任意业务状态。
**条件**:无视当前状态,拥有最高抢占优先级。 | 1. **状态**:切入 `STATE_SOS_EMITTED`;
2. **无线**:通过 LR690L 周期性(2s)发射手环 Factory ID 及 `0x08` (SOS) 数据包;
3. **显示**:LCD 闪烁呈现超大警灯与分行 `SOS EMIS` 字样;
4. **灯效**:WS2812B 红色高速交替闪烁(50ms周期);
5. **马达**:持续间歇长振(振 1000ms,停 200ms)。 | | **无线对码捕获事件**
`RF_PAIR_RECV_EVENT` | **源**:LR690L 接收 433MHz 对码载波包。
**参数**:24-bit 物理地址 + 4-bit 传感器类型数据码。 | **当前状态**:`STATE_PAIR_SEARCH` (搜索对码中)。
**条件**:捕获到合法 EV1527 帧。 | 1. **状态**:切换至 `STATE_PAIR_CONFIRM` (确认微调);
2. **显示**:只读显示自动识别的传感器名称(如 `PORTE`)、大图标,以及超大 `[ 01 ]` 序号选框;
3. **马达**:发出 300ms 短振提醒成功捕获。 | | **传感器入侵警报事件**
`RF_ALARM_RECV_EVENT` | **源**:LR690L 接收 433MHz 警报载波包。
**参数**:传感器地址 + 4-bit 状态码。 | **当前状态**:`STATE_CLOCK` (待机)。
**条件**:1. 地址与 Flash 数据库匹配;
2. 该防区属于 ZONE 0 (24h) 或处于已布防状态下的 ZONE 1。 | 1. **状态**:切入 `STATE_ALARMING`;
2. **显示**:LCD 亮起 4px 闪烁红边框与 64x64px 对应传感器报警图标,显示 `PORTE 01 INTRUSION!`;
3. **灯效**:WS2812B 闪烁对应传感器防区色彩(500ms闪烁);
4. **马达**:根据传感器类型,输出对应的间歇振动波形(如门磁短振 1 次)。 | | **系统自动休眠事件**
`AUTO_SLEEP_EVENT` | **源**:软件时钟 `inactivity_timer >= 1000` (10s)。 | **当前状态**:`STATE_CLOCK` / `STATE_MENU` / `STATE_SET_TIME` 等非报警状态。 | 1. **状态**:切入 `STATE_SLEEP`;
2. **硬件**:拉低 `SGM_CTRL = 0` 切断 AMOLED PMIC 供电;
3. **电源**:使能 P0 口电平中断及 INT2,挂起 CPU 进入 Power-Down 极低功耗模式。 | -| **中断唤醒系统事件**
`SYSTEM_WAKEUP_EVENT` | **源**:P0口按键沿变化或 INT2 载波接收中断。 | **当前状态**:`STATE_SLEEP` (深度休眠中)。 | 1. **状态**:切回 `STATE_CLOCK`;
2. **电源**:拉高 `SGM_CTRL = 1` 恢复 OLED 供电;
3. **延迟**:延时 50ms 避开冲击电流并完成 RM69310 的重初始化;
4. **显示**:置 `Redraw = 1` 重绘时钟走时界面。 | +| **中断唤醒系统事件**
`SYSTEM_WAKEUP_EVENT` | **源**:GPIO 端口按键沿变化或 INT2 载波接收中断。 | **当前状态**:`STATE_SLEEP` (深度休眠中)。 | 1. **状态**:切回 `STATE_CLOCK`;
2. **电源**:拉高 `SGM_CTRL = 1` 恢复 OLED 供电;
3. **延迟**:延时 50ms 避开冲击电流并完成 RM69310 的重初始化;
4. **显示**:置 `Redraw = 1` 重绘时钟走时界面格式。 | | **IPC 摄像头对码事件**
`IPC_BIND_SEND_EVENT` | **源**:在菜单中确认进入 `4. LIAISON`。 | **当前状态**:`STATE_IPC_BIND`。 | 1. **无线**:连发 433MHz 手环 Factory ID 及 `0x01` 绑定对码包;
2. **显示**:呈现 48x48px 摄像头大图标及 `LIAISON EN COURS`;
3. **退出**:长按确认键 3 秒或长按 ▼ 键 2 秒,退出并恢复时钟。 | | **警报解除复位事件**
`ALARM_CLEAR_EVENT` | **源**:报警状态下侧边或上部任意按键按下。 | **当前状态**:`STATE_ALARMING` 或 `STATE_SOS_EMITTED`。 | 1. **状态**:切回 `STATE_CLOCK`;
2. **灯效**:WS2812B 彻底熄灭;
3. **马达**:清空马达状态并立即停振;
4. **显示**:置 `Redraw = 1`,LCD 重绘走时时钟。 |