# 模块拆分 - 系统核心控制与存储 (Docs/50_module-breakdown/mod-sys.md) 本模块定义手环系统的生命周期、状态机、时间计数器、定时中断调度器以及断电保存数据库模块。 ## 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`,作为主动射频发送的数据源地址。 ## 2. 数据结构定义 ### 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) } Sensor_Slot; ``` ### 2.2 系统状态列 (SystemState) ```c typedef enum { STATE_CLOCK, // 常态时钟待机 STATE_SLEEP, // 低功耗休眠 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 呼救状态 } SystemState; ``` ## 3. 模块接口说明 ### 3.1 定时与时钟函数 * `void Timer1_Init(void)`:配置 Timer 1 作为 1ms 中断源,并使能全局中断。 * `void Timer1_Isr(void) interrupt 3`:ISR 中断处理。自增时间滴答,并在主循环处于非休眠时自增 `inactivity_timer` 超时计时器。自增 RTC(时/分/秒/日/月/年)并维护其他任务定时。 ### 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` 返回是否处于充电状态。