2026-07-09 10:49:15 +08:00
|
|
|
|
# 模块拆分 - 系统核心控制与存储 (Docs/50_module-breakdown/mod-sys.md)
|
2026-07-09 10:31:36 +08:00
|
|
|
|
|
2026-07-09 10:49:15 +08:00
|
|
|
|
本模块定义手环系统的生命周期、时间计数器、定时中断调度器以及断电保存数据库模块。只涉及手环本地代码实现。
|
2026-07-09 10:31:36 +08:00
|
|
|
|
|
|
|
|
|
|
## 1. 模块职责说明
|
|
|
|
|
|
|
|
|
|
|
|
* **职责范围**:
|
|
|
|
|
|
1. 驱动系统主状态机运转(`current_state`)。
|
|
|
|
|
|
2. 提供 RTC 软时钟维护(`current_hour`, `current_min`, `current_sec`)。
|
|
|
|
|
|
3. 利用 Timer 1 产生 1ms 定时器中断,维护毫秒滴答计数器并作为其他外设时效的基础。
|
|
|
|
|
|
4. 实现 IAP 读写底层函数,对防区数据库进行存取与读取。
|
2026-07-09 11:03:18 +08:00
|
|
|
|
5. 读取并管理手环出厂固定唯一的 `bracelet_factory_id`,作为主动射频发送的数据源地址。
|
2026-07-09 10:31:36 +08:00
|
|
|
|
|
|
|
|
|
|
## 2. 数据结构定义
|
|
|
|
|
|
|
|
|
|
|
|
### 2.1 传感器插槽结构体 (Sensor_Slot)
|
|
|
|
|
|
```c
|
|
|
|
|
|
typedef struct {
|
2026-07-09 11:32:00 +08:00
|
|
|
|
u8 is_used; // 0x01:已使用,其它:空闲
|
|
|
|
|
|
u8 addr[3]; // 24位 EV1527 对码物理地址
|
|
|
|
|
|
u8 type; // 传感器类型 (0~6)
|
|
|
|
|
|
u8 zone; // 防区类别 (0: 永久防区, 1: 可撤布防区)
|
|
|
|
|
|
char name_gbk[16]; // 法语自定义名字(前缀+两位数序号,如 PORTE 02)
|
2026-07-09 10:31:36 +08:00
|
|
|
|
} Sensor_Slot;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2.2 系统状态枚举 (SystemState)
|
|
|
|
|
|
```c
|
|
|
|
|
|
typedef enum {
|
|
|
|
|
|
STATE_NORMAL,
|
|
|
|
|
|
STATE_ARMED,
|
|
|
|
|
|
STATE_DISARMED,
|
|
|
|
|
|
STATE_PAIR_MENU,
|
|
|
|
|
|
STATE_PAIR_WAIT,
|
|
|
|
|
|
STATE_PAIR_CONFIRM,
|
|
|
|
|
|
STATE_PAIR_SUCCESS,
|
|
|
|
|
|
STATE_PAIR_FAIL,
|
2026-07-09 11:32:00 +08:00
|
|
|
|
STATE_ALARM,
|
2026-07-09 10:31:36 +08:00
|
|
|
|
STATE_SOS_EMITTED
|
|
|
|
|
|
} SystemState;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 3. 模块接口说明
|
|
|
|
|
|
|
|
|
|
|
|
### 3.1 定时与时钟函数
|
|
|
|
|
|
* `void Timer1_Init(void)`:配置 Timer 1 作为 1ms 中断源,并使能全局中断。
|
|
|
|
|
|
* `void Timer1_Isr(void) interrupt 3`:ISR 中断处理,自增时间滴答、维护 LED 闪烁周期、马达振动波形定时,以及维护软件 RTC(自增 `current_sec` 并在满 60 秒时触发主界面分钟刷新)。
|
|
|
|
|
|
|
|
|
|
|
|
### 3.2 IAP 数据库存储接口
|
|
|
|
|
|
* `void Load_Database(void)`:从 Flash 扇区 `0xFE0000` 读取 16 组传感器配置载入内存的 `sensor_list`。
|
|
|
|
|
|
* `void Save_Database(void)`:擦除 Flash 扇区并将内存中的 `sensor_list` 写入 Flash。
|
2026-07-09 11:32:00 +08:00
|
|
|
|
* `void Add_Sensor(u32 addr, u8 type, u8 suffix_idx)`:向 `sensor_list` 添加传感器信息,将其名字拼装为 `[前缀] [suffix_idx]`,并自动调用 `Save_Database()`。
|
2026-07-09 10:31:36 +08:00
|
|
|
|
* `bit Check_Sensor_ID(u32 addr, u8 *out_slot_index)`:在数据库中检索该地址码,若存在则返回它的槽位索引。
|
2026-07-09 11:03:18 +08:00
|
|
|
|
|
|
|
|
|
|
### 3.3 系统初始化与全局 ID 获取
|
|
|
|
|
|
* `void System_Init(void)`:
|
|
|
|
|
|
1. 初始化单片机系统寄存器(WTST, EAXFR 等)。
|
|
|
|
|
|
2. 读取 STC32G 硬件全球唯一 ID (UID)。
|
|
|
|
|
|
3. 提取 UID 中的后 3 字节,并通过 `& 0x0FFFFF` 裁剪为 20 位 EV1527 源地址,赋值给全局变量 `bracelet_factory_id`。如果读取失败,则默认赋予 `0x37A86UL`。
|
|
|
|
|
|
4. 载入数据库并配置 Timer1 和外设 GPIO 状态。
|
2026-07-09 13:06:01 +08:00
|
|
|
|
|
2026-07-09 14:03:01 +08:00
|
|
|
|
### 3.4 电池与充电检测接口
|
|
|
|
|
|
* `u16 Get_ADC_Result(u8 channel)`:底层 ADC 数据采集函数,完成单次指定通道的模拟量到 12-bit 数字量的转换并返回读数。
|
|
|
|
|
|
* `u8 Read_Battery_Percent(void)`:读取通道 8 (`P0.0`),将电压采样转换数据做线性比例转换(`1279~1628` 映射到 `0~100`),计算并返回电量百分比。
|
|
|
|
|
|
* `bit Is_Charging(void)`:读取 `P2.7`(充电检测管脚)的 GPIO 数字输入电平。当电平为高(1)时代表 USB 已接入,返回 `1`;否则返回 `0`。
|
|
|
|
|
|
|
2026-07-09 13:06:01 +08:00
|
|
|
|
<!-- Checked and verified with always-on screen and sleep removal changes -->
|