This commit is contained in:
edisondeng
2026-07-31 13:57:06 +08:00
parent d8df5d49d3
commit a7a2cc9465
23 changed files with 902 additions and 328 deletions

View File

@@ -342,11 +342,10 @@ void Enter_Low_Power_Sleep(void)
P2INTE |= 0x40; // 开启 P2.6 中断允许
P2WKUE |= 0x40; // 使能 P2.6 掉电唤醒
// 9. 配置 Port3 中断唤醒源 (RF_RX_DATA=P3.6)
P3IM1 |= 0x40;
P3IM0 |= 0x40; // 双边沿触发
// 9. 配置 Port3 掉电唤醒源 (RF_RX_DATA=P3.6)
// 双边沿触发与 P3INTE 中断允许现已在 RF_Init() 中常态开启 (供正常运行期间的边沿解码使用)
// 此处只需重新武装 P3WKUE (掉电唤醒使能,会被 Wakeup_Restore() 清零) 与清除挂起标志
P3INTF = 0x00; // 清除挂起标志
P3INTE |= 0x40; // 开启 P3.6 中断允许
P3WKUE |= 0x40; // 使能 P3.6 掉电唤醒
// 确保引脚上拉和输入使能,防止因浮空产生的功耗泄漏
@@ -365,7 +364,10 @@ void Enter_Low_Power_Sleep(void)
p3_wakeup_flag = 0;
rf_wakeup_flag = 0;
// 10. 关闭系统滴答定时器 Timer1 中断,防止休眠时被定时器误唤醒
// 10. 关闭系统滴答定时器 Timer1 与 RF 时间戳基准 Timer0 的中断,防止休眠时被定时器误唤醒
// (Power Down 模式下主振荡器本应整体停振Timer0/1 都会随之停止计数;这里仍显式关闭
// 中断允许作为防御性保险,与 ET1 的处理方式保持一致)
ET0 = 0;
ET1 = 0;
EA = 1; // 开启全局中断
@@ -383,10 +385,15 @@ void Enter_Low_Power_Sleep(void)
void Wakeup_Restore(void)
{
EAXFR = 1;
// 1. 立即关闭所有掉电外部中断允许与唤醒允许,防止重入
// 1. 立即关闭 P0/P2 掉电外部中断允许与全部唤醒允许,防止重入
// P3INTE 的 P3.6 位不清零 —— 该中断常态用于正常运行期间的 RF 边沿解码,唤醒后仍需保持开启
P0INTE = 0x00;
P2INTE = 0x00;
P3INTE = 0x00;
P3INTE = 0x40;
// 恢复休眠前被 Enter_Low_Power_Sleep() 关闭的 P3.6 内部上拉LR690L 在 SHUT=1 期间数据脚
// 高阻悬空,配合常态开启的 P3.6 中断会引发中断风暴,唤醒后必须立刻用上拉钳住电平
P3PU |= 0x40;
P0WKUE = 0x00;
P2WKUE = 0x00;
P3WKUE = 0x00;
@@ -398,8 +405,9 @@ void Wakeup_Restore(void)
WKTCH = 0x00;
WKTCL = 0x00;
// 3. 开启全局中断并重启系统滴答定时器
// 3. 开启全局中断并重启系统滴答定时器 Timer1 与 RF 时间戳基准 Timer0
EA = 1;
ET0 = 1;
ET1 = 1;
// 4. 恢复射频芯片工作模式