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

3.8 KiB
Raw Blame History

模块拆分 - 系统状态机与 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)

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)

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 索引获取设备名称前缀(如 PORTEPIR),拼装为 [前缀] [suffix_idx],存入槽位并执行 Save_Database() 持久化。
  • bit Check_Sensor_ID(u32 addr, u8 *out_slot_index):在数据库中查寻地址码,若匹配则返回槽位索引,作为警报时的名称提取依据。