# 编码实现 - 系统核心控制与存储 (Docs/60_coding/mod-sys.md) 本文件对应系统控制与存储的具体编码实现细节。只包含手环代码实现。 ## 1. 对应代码源文件 * [App/main.c](file:///c:/workfile/105/stc32g12k128/App/main.c) (系统主循环、定时器中断、IAP 存取) * [App/config.h](file:///c:/workfile/105/stc32g12k128/App/config.h) (系统状态及数据结构定义) ## 2. 关键代码片段与逻辑实现 ### 2.1 定时器 1 中断服务 (Timer1_Isr) 定时器初始化配置为 1ms,在 `main.c` 中第 190~250 行左右实现。 在 `Timer1_Isr` 里,我们累加 `ms_tick`。当累加到 1000 时,重置 `ms_tick = 0`,自增 `current_sec`。若秒达 60,则自增 `current_min` 并置位 `clock_updated = 1` 通知主循环在下一个周期重绘时钟画面。 ### 2.2 IAP 读写细节 在 `main.c` 中通过 IAP 寄存器控制读写。 ```c void IAP_EraseSector(u16 addr) { IAP_CMD = 3; // 扇区擦除 IAP_ADDRL = addr & 0xFF; IAP_ADDRH = addr >> 8; IAP_TRIG = 0x5A; // 触发 IAP_TRIG = 0xA5; _nop_(); } ``` - 主动擦除与写字节前必须先调用使能,写完后调用 `IAP_Disable()` 避免误写入损坏配置。 - 数据库保存在末尾扇区 `0xFE0000`(大小为 512 字节)。 ### 2.3 获取出厂唯一 ID (Get_Bracelet_Factory_ID) 从 STC32G 的内置 IDATA RAM 区域 `0xF1~0xF7` 处读取 7 字节唯一硬件 ID,并将其转换为符合 EV1527 的 20 位地址码: ```c u32 Get_Bracelet_Factory_ID(void) { unsigned char idata *p_uid = (unsigned char idata *)0xF1; u32 uid = 0; // 组合后 3 字节并进行 20 位掩码过滤 uid = ((u32)p_uid[4] << 16) | ((u32)p_uid[5] << 8) | p_uid[6]; uid &= 0x0FFFFF; // 20-bit address range limit for EV1527 if (uid == 0) { uid = CLONED_ADDR; // 防错备份 } return uid; } ```