docs: 修复事件矩阵和流程图中的引脚标号,使其与硬件原理图保持一致
This commit is contained in:
@@ -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
|
```mermaid
|
||||||
graph LR
|
graph LR
|
||||||
%% --- 硬件抽象与时基层 (左侧) ---
|
%% 输入物理源 -> 驱动解码 -> 软件缓冲区 -> 状态机消费
|
||||||
subgraph LayerHW ["硬件抽象与时基层 (HW Layer)"]
|
Pin_Key["物理按键 P2.0-P3.7"] -->|10ms 定时扫描| KEY["KEY 扫描与消抖"]
|
||||||
Timer1["Timer 1 (1ms中断)"]
|
KEY -->|判定按键事件| Buf_Key["key_event_buf (环形事件队列)"]
|
||||||
ADC["ADC (电量检测)"]
|
Buf_Key -->|主循环读取并清除| Scheduler["主循环 (main.c)"]
|
||||||
Flash["IAP (Flash读写)"]
|
|
||||||
GPIO["GPIO (引脚中断/控制)"]
|
|
||||||
end
|
|
||||||
|
|
||||||
%% --- 外设驱动层 (中间) ---
|
Pin_RF["433MHz 载波沿信号"] -->|INT2 中断触发| RF["RF 自适应解调解码"]
|
||||||
subgraph LayerDRV ["外设驱动层 (DRV Layer)"]
|
RF -->|解码合法 RFEvent| Scheduler
|
||||||
KEY["KEY (按键扫描/队列)"]
|
|
||||||
RF["RF (LR690L收发)"]
|
|
||||||
PM["PM (功耗电源管理)"]
|
|
||||||
AMOLED["AMOLED (屏幕绘制)"]
|
|
||||||
LED["LED (RGB彩灯时序)"]
|
|
||||||
MOTOR["MOTOR (马达异步震动)"]
|
|
||||||
end
|
|
||||||
|
|
||||||
%% --- 应用逻辑层 (右侧) ---
|
Scheduler -->|分发有效事件| StateMachine["业务状态机 (SysState)"]
|
||||||
subgraph LayerAPP ["应用逻辑层 (APP Layer)"]
|
|
||||||
MainScheduler["主循环调度器 (main.c)"]
|
|
||||||
SysStateMachine["SysState 业务状态机"]
|
|
||||||
SoftRTC["SoftRTC 软件时钟"]
|
|
||||||
end
|
|
||||||
|
|
||||||
%% --- 连线关系:时基与底层输入驱动外设 ---
|
|
||||||
Timer1 ==>|1ms时基中断| KEY
|
|
||||||
Timer1 ==>|1ms中断分频| MOTOR
|
|
||||||
Timer1 ==>|中断异步控制| LED
|
|
||||||
Timer1 ==>|秒计数器累加| SoftRTC
|
|
||||||
|
|
||||||
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
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 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. **单向依赖原则**:
|
1. **单向依赖原则**:
|
||||||
* **APP 层**仅依赖于 **DRV 层**提供的高级抽象接口(例如 `LED_Set_Color`、`Motor_Start_Pattern`)和 **HW 层**的数据库读写。**严禁**在 APP 层直接写入具体 IO 寄存器。
|
* **APP 层**仅依赖于 **DRV 层**提供的高级抽象接口(例如 `LED_Set_Color`、`Motor_Start_Pattern`)和 **HW 层**的数据库读写。**严禁**在 APP 层直接写入具体 IO 寄存器。
|
||||||
@@ -193,7 +195,7 @@ graph LR
|
|||||||
* 进入休眠前,由 `PM` 驱动断开 `SGM3833` 电源以彻底消除 AMOLED 的暗漏电流。
|
* 进入休眠前,由 `PM` 驱动断开 `SGM3833` 电源以彻底消除 AMOLED 的暗漏电流。
|
||||||
* 唤醒时,由 GPIO 的电平沿变化触发中断,唤醒 CPU 后由 `PM` 优先执行 **“上电 -> 强延时 50ms 避开浪涌 -> 屏幕控制器重初始化”** 的安全恢复时序,防止未稳定电网下的写屏导致屏幕损坏或花屏。
|
* 唤醒时,由 GPIO 的电平沿变化触发中断,唤醒 CPU 后由 `PM` 优先执行 **“上电 -> 强延时 50ms 避开浪涌 -> 屏幕控制器重初始化”** 的安全恢复时序,防止未稳定电网下的写屏导致屏幕损坏或花屏。
|
||||||
|
|
||||||
### 4.3 核心主程序调度框架 (main.c)
|
### 4.5 核心主程序调度框架 (main.c)
|
||||||
|
|
||||||
主程序采用完全解耦的时间片轮询加事件触发的非阻塞循环结构:
|
主程序采用完全解耦的时间片轮询加事件触发的非阻塞循环结构:
|
||||||
|
|
||||||
@@ -295,7 +297,7 @@ void main(void) {
|
|||||||
```mermaid
|
```mermaid
|
||||||
flowchart TD
|
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]
|
Carrier[433MHz 射频载波信号] -->|INT2 中断| ISR_INT2[INT2 唤醒中断 ISR]
|
||||||
|
|
||||||
%% 中断服务层 (ISR)
|
%% 中断服务层 (ISR)
|
||||||
@@ -334,11 +336,11 @@ flowchart TD
|
|||||||
|
|
||||||
| 事件名称 | 输入源 (触发条件与参数) | 状态机判定逻辑 (当前状态与条件) | 输出结果 & 动作执行 (显示、灯效、马达与无线) |
|
| 事件名称 | 输入源 (触发条件与参数) | 状态机判定逻辑 (当前状态与条件) | 输出结果 & 动作执行 (显示、灯效、马达与无线) |
|
||||||
| :--- | :--- | :--- | :--- |
|
| :--- | :--- | :--- | :--- |
|
||||||
| **按键操作事件**<br>`KEY_EVENT` | **源**:P0.1~P0.5 下降沿中断。<br>**参数**:`KEY_UP`、`KEY_DOWN`、`KEY_CONFIRM` (短按/长按)。 | **当前状态**:`STATE_CLOCK` / `STATE_MENU` 等。<br>**条件**:在待机下长按确认键 3 秒进入菜单;在菜单下短按 ▲/▼ 键翻页。 | 1. **显示**:置 `Redraw = 1`,LCD 刷新切换对应页面;<br>2. **触觉**:发出 50ms 极短振动作按键反馈。 |
|
| **按键操作事件**<br>`KEY_EVENT` | **源**:P2.0~P3.7 下降沿中断。<br>**参数**:`KEY_UP`、`KEY_DOWN`、`KEY_CONFIRM` (短按/长按)。 | **当前状态**:`STATE_CLOCK` / `STATE_MENU` 等。<br>**条件**:在待机下长按确认键 3 秒进入菜单;在菜单下短按 ▲/▼ 键翻页。 | 1. **显示**:置 `Redraw = 1`,LCD 刷新切换对应页面;<br>2. **触觉**:发出 50ms 极短振动作按键反馈。 |
|
||||||
| **主动求救事件**<br>`SOS_ACTIVE_EVENT` | **源**:上部任意 SOS 按键按下(短按或长按)。 | **当前状态**:除已报警外的任意业务状态。<br>**条件**:无视当前状态,拥有最高抢占优先级。 | 1. **状态**:切入 `STATE_SOS_EMITTED`;<br>2. **无线**:通过 LR690L 周期性(2s)发射手环 Factory ID 及 `0x08` (SOS) 数据包;<br>3. **显示**:LCD 闪烁呈现超大警灯与分行 `SOS EMIS` 字样;<br>4. **灯效**:WS2812B 红色高速交替闪烁(50ms周期);<br>5. **马达**:持续间歇长振(振 1000ms,停 200ms)。 |
|
| **主动求救事件**<br>`SOS_ACTIVE_EVENT` | **源**:上部任意 SOS 按键按下(短按或长按)。 | **当前状态**:除已报警外的任意业务状态。<br>**条件**:无视当前状态,拥有最高抢占优先级。 | 1. **状态**:切入 `STATE_SOS_EMITTED`;<br>2. **无线**:通过 LR690L 周期性(2s)发射手环 Factory ID 及 `0x08` (SOS) 数据包;<br>3. **显示**:LCD 闪烁呈现超大警灯与分行 `SOS EMIS` 字样;<br>4. **灯效**:WS2812B 红色高速交替闪烁(50ms周期);<br>5. **马达**:持续间歇长振(振 1000ms,停 200ms)。 |
|
||||||
| **无线对码捕获事件**<br>`RF_PAIR_RECV_EVENT` | **源**:LR690L 接收 433MHz 对码载波包。<br>**参数**:24-bit 物理地址 + 4-bit 传感器类型数据码。 | **当前状态**:`STATE_PAIR_SEARCH` (搜索对码中)。<br>**条件**:捕获到合法 EV1527 帧。 | 1. **状态**:切换至 `STATE_PAIR_CONFIRM` (确认微调);<br>2. **显示**:只读显示自动识别的传感器名称(如 `PORTE`)、大图标,以及超大 `[ 01 ]` 序号选框;<br>3. **马达**:发出 300ms 短振提醒成功捕获。 |
|
| **无线对码捕获事件**<br>`RF_PAIR_RECV_EVENT` | **源**:LR690L 接收 433MHz 对码载波包。<br>**参数**:24-bit 物理地址 + 4-bit 传感器类型数据码。 | **当前状态**:`STATE_PAIR_SEARCH` (搜索对码中)。<br>**条件**:捕获到合法 EV1527 帧。 | 1. **状态**:切换至 `STATE_PAIR_CONFIRM` (确认微调);<br>2. **显示**:只读显示自动识别的传感器名称(如 `PORTE`)、大图标,以及超大 `[ 01 ]` 序号选框;<br>3. **马达**:发出 300ms 短振提醒成功捕获。 |
|
||||||
| **传感器入侵警报事件**<br>`RF_ALARM_RECV_EVENT` | **源**:LR690L 接收 433MHz 警报载波包。<br>**参数**:传感器地址 + 4-bit 状态码。 | **当前状态**:`STATE_CLOCK` (待机)。<br>**条件**:1. 地址与 Flash 数据库匹配;<br>2. 该防区属于 ZONE 0 (24h) 或处于已布防状态下的 ZONE 1。 | 1. **状态**:切入 `STATE_ALARMING`;<br>2. **显示**:LCD 亮起 4px 闪烁红边框与 64x64px 对应传感器报警图标,显示 `PORTE 01 INTRUSION!`;<br>3. **灯效**:WS2812B 闪烁对应传感器防区色彩(500ms闪烁);<br>4. **马达**:根据传感器类型,输出对应的间歇振动波形(如门磁短振 1 次)。 |
|
| **传感器入侵警报事件**<br>`RF_ALARM_RECV_EVENT` | **源**:LR690L 接收 433MHz 警报载波包。<br>**参数**:传感器地址 + 4-bit 状态码。 | **当前状态**:`STATE_CLOCK` (待机)。<br>**条件**:1. 地址与 Flash 数据库匹配;<br>2. 该防区属于 ZONE 0 (24h) 或处于已布防状态下的 ZONE 1。 | 1. **状态**:切入 `STATE_ALARMING`;<br>2. **显示**:LCD 亮起 4px 闪烁红边框与 64x64px 对应传感器报警图标,显示 `PORTE 01 INTRUSION!`;<br>3. **灯效**:WS2812B 闪烁对应传感器防区色彩(500ms闪烁);<br>4. **马达**:根据传感器类型,输出对应的间歇振动波形(如门磁短振 1 次)。 |
|
||||||
| **系统自动休眠事件**<br>`AUTO_SLEEP_EVENT` | **源**:软件时钟 `inactivity_timer >= 1000` (10s)。 | **当前状态**:`STATE_CLOCK` / `STATE_MENU` / `STATE_SET_TIME` 等非报警状态。 | 1. **状态**:切入 `STATE_SLEEP`;<br>2. **硬件**:拉低 `SGM_CTRL = 0` 切断 AMOLED PMIC 供电;<br>3. **电源**:使能 P0 口电平中断及 INT2,挂起 CPU 进入 Power-Down 极低功耗模式。 |
|
| **系统自动休眠事件**<br>`AUTO_SLEEP_EVENT` | **源**:软件时钟 `inactivity_timer >= 1000` (10s)。 | **当前状态**:`STATE_CLOCK` / `STATE_MENU` / `STATE_SET_TIME` 等非报警状态。 | 1. **状态**:切入 `STATE_SLEEP`;<br>2. **硬件**:拉低 `SGM_CTRL = 0` 切断 AMOLED PMIC 供电;<br>3. **电源**:使能 P0 口电平中断及 INT2,挂起 CPU 进入 Power-Down 极低功耗模式。 |
|
||||||
| **中断唤醒系统事件**<br>`SYSTEM_WAKEUP_EVENT` | **源**:P0口按键沿变化或 INT2 载波接收中断。 | **当前状态**:`STATE_SLEEP` (深度休眠中)。 | 1. **状态**:切回 `STATE_CLOCK`;<br>2. **电源**:拉高 `SGM_CTRL = 1` 恢复 OLED 供电;<br>3. **延迟**:延时 50ms 避开冲击电流并完成 RM69310 的重初始化;<br>4. **显示**:置 `Redraw = 1` 重绘时钟走时界面。 |
|
| **中断唤醒系统事件**<br>`SYSTEM_WAKEUP_EVENT` | **源**:GPIO 端口按键沿变化或 INT2 载波接收中断。 | **当前状态**:`STATE_SLEEP` (深度休眠中)。 | 1. **状态**:切回 `STATE_CLOCK`;<br>2. **电源**:拉高 `SGM_CTRL = 1` 恢复 OLED 供电;<br>3. **延迟**:延时 50ms 避开冲击电流并完成 RM69310 的重初始化;<br>4. **显示**:置 `Redraw = 1` 重绘时钟走时界面格式。 |
|
||||||
| **IPC 摄像头对码事件**<br>`IPC_BIND_SEND_EVENT` | **源**:在菜单中确认进入 `4. LIAISON`。 | **当前状态**:`STATE_IPC_BIND`。 | 1. **无线**:连发 433MHz 手环 Factory ID 及 `0x01` 绑定对码包;<br>2. **显示**:呈现 48x48px 摄像头大图标及 `LIAISON EN COURS`;<br>3. **退出**:长按确认键 3 秒或长按 ▼ 键 2 秒,退出并恢复时钟。 |
|
| **IPC 摄像头对码事件**<br>`IPC_BIND_SEND_EVENT` | **源**:在菜单中确认进入 `4. LIAISON`。 | **当前状态**:`STATE_IPC_BIND`。 | 1. **无线**:连发 433MHz 手环 Factory ID 及 `0x01` 绑定对码包;<br>2. **显示**:呈现 48x48px 摄像头大图标及 `LIAISON EN COURS`;<br>3. **退出**:长按确认键 3 秒或长按 ▼ 键 2 秒,退出并恢复时钟。 |
|
||||||
| **警报解除复位事件**<br>`ALARM_CLEAR_EVENT` | **源**:报警状态下侧边或上部任意按键按下。 | **当前状态**:`STATE_ALARMING` 或 `STATE_SOS_EMITTED`。 | 1. **状态**:切回 `STATE_CLOCK`;<br>2. **灯效**:WS2812B 彻底熄灭;<br>3. **马达**:清空马达状态并立即停振;<br>4. **显示**:置 `Redraw = 1`,LCD 重绘走时时钟。 |
|
| **警报解除复位事件**<br>`ALARM_CLEAR_EVENT` | **源**:报警状态下侧边或上部任意按键按下。 | **当前状态**:`STATE_ALARMING` 或 `STATE_SOS_EMITTED`。 | 1. **状态**:切回 `STATE_CLOCK`;<br>2. **灯效**:WS2812B 彻底熄灭;<br>3. **马达**:清空马达状态并立即停振;<br>4. **显示**:置 `Redraw = 1`,LCD 重绘走时时钟。 |
|
||||||
|
|||||||
Reference in New Issue
Block a user