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

3.5 KiB
Raw Blame History

模块拆分 - 系统核心控制与存储 (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)

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)

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 3ISR 中断处理。自增时间滴答,并在主循环处于非休眠时自增 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 返回是否处于充电状态。