fix(sleep): pin P3.6 to a fixed rising-edge trigger before Power Down

RF_HandleEdgeInterrupt()'s software ping-pong toggle can leave P3IM0
parked in either edge direction while awake; Enter_Low_Power_Sleep()
never reset it, so sleep entry could randomly land on a direction that
misses the wake edge. Per the datasheet truth table (WO-04 2.9), only
edge modes support power-down wake, not level modes, so this forces a
known rising-edge state (matching RF_Init()'s own boot default) instead
of switching to level-triggered as originally requested. wo-05 updated
to record the deviation and rationale.
This commit is contained in:
edisondeng
2026-07-31 18:14:22 +08:00
parent ae235d3c51
commit 79d604a387
2 changed files with 14 additions and 6 deletions

View File

@@ -346,8 +346,16 @@ void Enter_Low_Power_Sleep(void)
P2WKUE |= 0x40; // 使能 P2.6 掉电唤醒
// 9. 配置 Port3 掉电唤醒源 (RF_RX_DATA=P3.6)
// 双边沿触发与 P3INTE 中断允许现已在 RF_Init() 中常态开启 (供正常运行期间的边沿解码使用)
// 此处只需重新武装 P3WKUE (掉电唤醒使能,会被 Wakeup_Restore() 清零) 与清除挂起标志
// RF_HandleEdgeInterrupt() 用软件乒乓单边沿切换模拟双边沿触发,运行期间 P3IM0 会在
// 上升沿/下降沿之间动态翻转;如果休眠前不重新固定它,进入 Power Down 那一刻 P3IM0
// 具体停在哪个方向是不确定的可能导致唤醒不了或唤醒延迟。根据《STC32G 技术手册》
// 15.1.3 节真值表PxIM1/PxIM0 的四种模式里只有下降沿(0,0)和上升沿(0,1)两种边沿模式
// 标注支持掉电唤醒,高/低电平两种模式都不支持——所以这里没有改成电平触发,而是强制
// 固定为上升沿 (与 RF_Init() 开机时的初始配置一致),确保休眠那一刻处于一个明确的、
// 手册标注支持唤醒的状态;唤醒后 P3IM0 就停在上升沿,与开机状态相同,解码状态机从
// 一个已知状态重新开始,不需要额外恢复。
P3IM1 &= ~0x40;
P3IM0 |= 0x40; // (0,1) 上升沿触发
P3INTF = 0x00; // 清除挂起标志
P3WKUE |= 0x40; // 使能 P3.6 掉电唤醒