本帖最后由 zhufy 于 2021-3-19 20:38 编辑
今天在做个低功耗的产品,使用HC32L136K8TA ,首先使用RCL跑32.768k,驱动LCD液晶屏,功耗做到12.8ua左右。然后想进一步降低功耗,进入普通休眠模式,功耗降低到5.8ua左右。配置I/O口外部下降沿唤醒。问题来了,一开始外部触发后可以正常唤醒,但唤醒几次后突然唤不醒了。唤不醒的状态下测功耗是在5.8ua,说明就是在休眠,反复多次外部触发也没用。使用标记位测试,程序就停留在进入休眠的语句,就是没唤醒。测量i/o口电平正常。
问题关键是,为什么前几次可以正常唤醒,然后怎么就突然唤不醒了?(这里保证中途没有改变I/O触发设置)!!!
附上休眠初始化程序:
//Lpm Cfg 低功耗休眠模式配置
stc_lpm_config_t stcLpmCfg;
DDL_ZERO_STRUCT(stcLpmCfg);
stcLpmCfg.enSEVONPEND = Se***dDisable;
stcLpmCfg.enSLEEPDEEP = SlpDpDisable; //使能:执行WFI不进入深度休眠;
stcLpmCfg.enSLEEPONEXIT = SlpExtDisable; //不使能 使能:退出异常处理并返回时,处理器自动进入休眠模式的特性禁止.
Lpm_Config(&stcLpmCfg);
附上休眠进入程序:
//外部触发中断使能 下降沿触发
Gpio_EnableIrq(GpioPortB,GpioPin9,GpioIrqFalling); //PB09 按钮
Gpio_EnableIrq(GpioPortC,GpioPin3,GpioIrqFalling); //PC03 RST1
Gpio_EnableIrq(GpioPortC,GpioPin2,GpioIrqFalling); //PC02 RST2
Gpio_EnableIrq(GpioPortD,GpioPin6,GpioIrqFalling); //PD06 SIG
Lpm_GotoLpmMode();//进入休眠
goto Task_Start;
问题关键是,为什么前几次可以正常唤醒,然后怎么就突然唤不醒了?(这里保证中途没有改变I/O触发设置)!!! |
stcLpmCfg.enSEVONPEND = Se***dEnable; //事件挂起使能 并且修改休眠进入函数 Lpm_GotoLpmMode();中的 __WFI(); --> __WFE();
既然有人想知道怎么解决的,那我就说说吧。 首先看应用手册关于休眠模式的说明,其中提到(4 若在中断中进入 sleep,只有优先级高于此中断的中断才能唤醒,先执行高优先级, 再执行低优先级;优先级低于或等于此中断的中断不能唤醒。) 我的程序就是因为这个中断优先级问题才导致的唤不醒。 所以我将低功耗唤醒配置将原来的 中断触发唤醒 --> 事件挂起唤醒