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:
12
App/system.c
12
App/system.c
@@ -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 掉电唤醒
|
||||
|
||||
|
||||
Reference in New Issue
Block a user