docs: optimize all module breakdown files with architect-level details

This commit is contained in:
2026-07-09 18:42:00 +08:00
parent 9f54220e27
commit 039029ab20
7 changed files with 183 additions and 160 deletions

View File

@@ -1,67 +1,60 @@
# 模块拆分 - 系统核心控制与存储 (Docs/50_module-breakdown/mod-sys.md)
# 模块拆分 - 系统状态机与 IAP 数据库 (Docs/50_module-breakdown/mod-sys.md)
本模块定义手环系统的生命周期、状态机、时间计数器、定时中断调度器以及断电保存数据库模块
本模块描述手环的核心生命周期调度器、业务状态机、软件 RTC 时钟,以及持久化防区配置 Flash 扇区读写
## 1. 模块职责说明
* **职责范围**
1. 驱动系统主状态机运转(`current_state`
2. 提供 RTC 时钟维护`current_hour`, `current_min`, `current_sec`)。
3. 利用 Timer 1 产生 1ms 定时器中断作为按键消抖、LED闪烁、马达脉冲及超时休眠计数器的调度时基
4. 维护无按键操作计时器 `inactivity_timer`,计满 10 秒后触发系统进入 `STATE_SLEEP`
5. 实现 IAP 读写底层函数,对防区数据库进行存取与读取
6. 读取并管理手环出厂固定唯一的 `bracelet_factory_id`,作为主动射频发送的数据源地址
1. 驱动核心 SystemState 状态迁移,为其他所有外设(显示、指示灯、振动、无线)提供全局状态指示
2. 提供基于软件计数分频的高可靠 RTC 时钟维护日历:时、分、秒、年、月、日)。
3. 利用 Timer 1 产生 1ms 系统滴答,自增休眠超时计时器 `inactivity_timer`
4. **持久化 IAP 配置数据库管理**
利用 STC32G 内部 Flash 闪存的第 254 扇区(地址:`0xFE0000`)实现数据库的掉电不丢失存储。最大支持 16 个传感器槽位,提供写入、删除、检索和配置防区类别的全套数据库处理接口
5. 管理出厂固定唯一的 `bracelet_factory_id`(通过读取芯片全球唯一硬 UID 进行哈希映射生成20位有效
---
## 2. 数据结构定义
### 2.1 传感器槽结构体 (Sensor_Slot)
### 2.1 传感器槽位信息结构体 (Sensor_Slot)
```c
typedef struct {
u8 is_used; // 0x01:已使用,其它:空闲
u8 addr[3]; // 24位 EV1527 对码物理地址
u8 type; // 传感器类型 (0~6)
u8 zone; // 防区类别 (0: 永久防区, 1: 可撤布防区)
char name_gbk[16]; // 法语自定义名字(前缀+两位数序号,如 PORTE 02
u8 is_used; // 0x01: 有效配置槽位,其它: 空闲槽位
u8 addr[3]; // 24位对码 EV1527 传感器无线物理地址
u8 type; // 传感器类型0(门磁), 1(红外), 2(烟感), 3(紧急), 4(气体), 5(水浸), 6(振动)
u8 zone; // 防区类别0(永久防区 - 24h), 1(普通可撤布防区)
char name_gbk[16]; // 法语防区名称,拼装格式为 "[预设前缀] [微调序号]" (如 PORTE 02)
} Sensor_Slot;
```
### 2.2 系统状态列 (SystemState)
### 2.2 系统核心状态枚举 (SystemState)
```c
typedef enum {
STATE_CLOCK, // 常态时钟待机
STATE_SLEEP, // 低功耗休眠
STATE_MENU, // 主选择菜单
STATE_SET_TIME, // 时间日期设置
STATE_PAIR_SEARCH, // 对码等待搜寻
STATE_CLOCK, // 时钟常态待机(大字走时与电量大图标)
STATE_SLEEP, // 彻底关屏断电深度睡眠(主时钟暂停,挂起 CPU
STATE_MENU, // 主选择菜单(单大条目卡片式循环切换)
STATE_SET_TIME, // 时间日期微调修改(单大参数显示)
STATE_PAIR_SEARCH, // 对码雷达搜寻等待
STATE_PAIR_CONFIRM, // 序号微调与保存确认
STATE_ARM_DISARM_SELECT, // 手动选择布撤防设定
STATE_IPC_BIND, // IPC 对码发射绑定
STATE_ALARMING, // 被动防区报警响应
STATE_SOS_EMITTED // 本地主动发射 SOS 呼救状态
STATE_ARM_DISARM_SELECT, // 系统手动布撤防更改
STATE_IPC_BIND, // 对码绑定发射
STATE_ALARMING, // 收到传感器警报响应(高频爆闪与间歇振动)
STATE_SOS_EMITTED // 本地主动发射 SOS 求救
} SystemState;
```
## 3. 模块接口说明
---
### 3.1 定时与时钟函数
* `void Timer1_Init(void)`:配置 Timer 1 作为 1ms 中断源,并使能全局中断。
* `void Timer1_Isr(void) interrupt 3`ISR 中断处理。自增时间滴答,并在主循环处于非休眠时自增 `inactivity_timer` 超时计时器。自增 RTC时/分/秒/日/月/年)并维护其他任务定时。
## 3. 接口与函数说明
### 3.2 IAP 数据库存储接口
* `void Load_Database(void)`:从 Flash 扇区 `0xFE0000` 读取 16 组传感器配置载入内存的 `sensor_list`
* `void Save_Database(void)`:擦除 Flash 扇区并将内存中的 `sensor_list` 写入 Flash。
* `void Add_Sensor(u32 addr, u8 type, u8 suffix_idx)`:向 `sensor_list` 添加传感器信息,将其名字拼装为 `[前缀] [suffix_idx]`,并自动调用 `Save_Database()`
* `bit Check_Sensor_ID(u32 addr, u8 *out_slot_index)`:在数据库中检索该地址码,若存在则返回它的槽位索引。
### 3.3 系统初始化与全局 ID 获取
* `void System_Init(void)`
1. 初始化单片机系统寄存器(WTST, EAXFR 等)
2. 读取 STC32G 硬件全球唯一 ID (UID) 生成 `bracelet_factory_id`
3. 载入数据库并配置 Timer1 和外设 GPIO 状态。
### 3.4 电池与充电检测接口
* `u16 Get_ADC_Result(u8 channel)`:底层 ADC 数据采集函数
* `u8 Read_Battery_Percent(void)`读取通道 8 (`P0.0`) 并返回 0%~100% 的电量
* `bit Is_Charging(void)`:读取 `P2.7` 返回是否处于充电状态
配置单片机寄存器(使能 FCON开启扩展 SFR调整外部 RAM 模式)。读取内置全球唯一 UID 拼装 Factory ID。初始化 Timer 1 开启 1ms 时基,载入 Flash 数据库
* `void Timer1_Init(void)`:配置 Timer 1 中断,提供 1ms 精度的时基回调
* `void Timer1_Isr(void) interrupt 3`
中断服务函数。累加 `inactivity_timer`;更新 RTC秒/分/时/日/月/年)数值;分频驱动马达状态机和 RGB 闪烁标志。
* `void Load_Database(void)`:读取 `0xFE0000` Flash 扇区数据至内存缓冲槽。
* `void Save_Database(void)`:通过 STC IAP 命令擦除 `0xFE0000` 扇区,并将缓冲槽内的 16 组数据完整写回
* `void Add_Sensor(u32 addr, u8 type, u8 suffix_idx)`向空闲槽位添加新传感器。根据 `type` 索引获取设备名称前缀(如 `PORTE``PIR`),拼装为 `[前缀] [suffix_idx]`,存入槽位并执行 `Save_Database()` 持久化
* `bit Check_Sensor_ID(u32 addr, u8 *out_slot_index)`:在数据库中查寻地址码,若匹配则返回槽位索引,作为警报时的名称提取依据
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->