Files
stc32g128k/Docs/50_module-breakdown/mod-sys.md

61 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 模块拆分 - 系统状态机与 IAP 数据库 (Docs/50_module-breakdown/mod-sys.md)
本模块描述手环的核心生命周期调度器、业务状态机、软件 RTC 时钟,以及持久化防区配置 Flash 扇区读写。
## 1. 模块职责说明
* **职责范围**
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)
```c
typedef struct {
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)
```c
typedef enum {
STATE_CLOCK, // 时钟常态待机(大字走时与电量大图标)
STATE_SLEEP, // 彻底关屏断电深度睡眠(主时钟暂停,挂起 CPU
STATE_MENU, // 主选择菜单(单大条目卡片式循环切换)
STATE_SET_TIME, // 时间日期微调修改(单大参数显示)
STATE_PAIR_SEARCH, // 对码雷达搜寻等待
STATE_PAIR_CONFIRM, // 序号微调与保存确认
STATE_ARM_DISARM_SELECT, // 系统手动布撤防更改
STATE_IPC_BIND, // 对码绑定发射
STATE_ALARMING, // 收到传感器警报响应(高频爆闪与间歇振动)
STATE_SOS_EMITTED // 本地主动发射 SOS 求救
} SystemState;
```
---
## 3. 接口与函数说明
* `void System_Init(void)`
配置单片机寄存器(使能 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 -->