由于项目需要,临时将STM32更换成C8051F410,本属于拿来主义者,快速入门,但唤醒部分资料甚少,很是花了点时间,以下是最终调试成功的休眠代码,可供有需要的朋友拿去借鉴
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
void CPU_GotoSleep (void)
{
XBR1 &= ~0x40; //交叉开关禁止,端口输出驱动器禁止
/* 关闭外设 降低功耗 */
SCON0 &= ~0x10; // disable UART0
TCON &= ~0x10; // disable T0
TCON &= ~0x40; // disable T1
TCON |= 0x05;
TMR2CN &= ~0x04; // disable T2
CPT0CN &= ~0x80; // 关闭比较器0
CPT1CN &= ~0x80; // 关闭比较器1
RSTSRC &= ~0x8F; // smartRTClock 不是复位源 挂不比时钟丢失检测 禁止VDD监视器
VDM0CN &= ~0x80; // disable voltage monitor
AD0EN = 0; // 禁止ADC0 将ADC0处于低功耗断点状态
/* 解锁smaRTClock接口 */
RTC0KEY = 0xA5;
RTC0KEY = 0xF1;
/*使能smaRTClock */
RTC0ADR = 0x06;
RTC0DAT = 0x80; // 使能smaRTClock,禁止 smaRTClock时钟丢失检测,禁止smaRTClock报警
while ((RTC0ADR & 0x80) == 0x80);
/* 将非唤醒IO口 全部配置为输入口 降低功耗 */
P0MDIN = 0x01; // P0^0 普通输入 用于匹配唤醒
P1MDIN = 0x00;
P2MDIN = 0;
P1 = 0;
P2 = 0;
/* 用于端口匹配唤醒 */
P0MASK = 0x01; // P0^0 用于匹配唤醒
P1MASK = 0x00;
P0MAT = 0x01; // 平时置高,拉低唤醒
P1MAT = 0x00;
OSCICN |= 0x20; // 进入挂起模式
// PCON = 0x02; // 进入【停机模式】
}
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
备注:之前发现小部分板子进入休眠失败,很快就唤醒了,最后发现就是因为没有关闭smaRTClock时钟丢失检测以及smaRTClock报警,导致被唤醒,加深部分代码是后续增加,切记切记!!