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

68 lines
3.5 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.

# 模块拆分 - 系统核心控制与存储 (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` 返回是否处于充电状态。
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->