docs: 增加手环主动发射 SOS 和获取出厂固定 ID 芯片硬件 UID 规划

This commit is contained in:
2026-07-09 11:03:18 +08:00
parent fdf0c5ed1b
commit 89ff52c9b3
15 changed files with 96 additions and 15 deletions

View File

@@ -76,6 +76,8 @@ void Key_Scan_Process(void) {
}
```
<!-- Checked and verified with bracelet_factory_id and active SOS changes -->
### 2.2 事件异步读取与清除
主循环在其周期内轮询 `key_event_buf`。一旦发现其非 `KEY_EVENT_NONE`,拷贝并立即重置该缓冲区为 `KEY_EVENT_NONE` 以防止重复触发:
```c

View File

@@ -56,3 +56,16 @@ void LCD_ShowStringCentered(u16 y, char *str, u16 color, u16 bg_color) {
LCD_ShowString((135 - len * 8) / 2, y, str, color, bg_color);
}
```
### 2.5 绑定界面 ID 渲染实现
`main.c` 中通过 `FormatHex` 接口将 `bracelet_factory_id` 转换为十六进制字符串,并显示在绑定界面的底部:
```c
void UI_ShowBindingPage(void) {
char id_str[15];
// 渲染背景与图标
// ...
// 绘制手环自身的出厂 ID
FormatHex(bracelet_factory_id, id_str);
LCD_ShowStringCentered(180, id_str, COLOR_GRAY, COLOR_BLACK);
}
```

View File

@@ -53,4 +53,6 @@ void Port0_Isr(void) interrupt 37 {
}
}
```
<!-- Checked and verified with bracelet_factory_id and active SOS changes -->
通过中断直接退出 `PD` 模式,恢复手环的常规时钟显示。

View File

@@ -24,8 +24,8 @@
```
4. **极速解析与 CPU 效率**:去除了之前在主循环中阻塞多帧解析的详细日志串口打印,仅在解析整帧成功后发送一行 Summary。单帧处理耗时控制在 **2ms** 以内,彻底避免了连续波形导致的丢包现象。
### 2.2 主动对码广播发射
手环通过 LT4455 发送对码广播,在 `rf.c` 中实现:
### 2.2 主动广播发射 (EV1527_Transmit)
手环通过 LT4455 发送对码广播或主动 SOS 警报,在 `rf.c` 中实现:
```c
void EV1527_Transmit(u32 addr, u8 data_code) {
// 产生多帧 EV1527 时序
@@ -34,3 +34,5 @@ void EV1527_Transmit(u32 addr, u8 data_code) {
}
```
通过控制发射引脚的电平跳转产生标准的 433MHz EV1527 载波信号。
* **绑定对码**:当用户触发对码绑定时,传入 `addr = bracelet_factory_id``data_code = 0x01`。
* **主动 SOS 警报**:当触发主动 SOS 时,主状态机在 `STATE_SOS_EMITTED` 下定期以时间片的形式调用此函数,传入 `addr = bracelet_factory_id``data_code = 0x08`(即二进制 `1000`)。

View File

@@ -27,3 +27,21 @@ void IAP_EraseSector(u16 addr) {
```
- 主动擦除与写字节前必须先调用使能,写完后调用 `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;
}
```