项目开发需求,STM32L053R8T6待机模式
待机模式下功耗最低(配置步骤也最简单),所有功能都停止
(这里使用的LL库函数/HAL库函数)
进入待机模式之前,为了正常退出待机模式需要配置唤醒源,这里是WAKEUP引脚上升沿唤醒
STM32L053R8T6唤醒引脚有PC13和PA0,硬件电路按下按键产生上升沿。我将其配置成了外部中断上升沿触发模式。
- <p> /*Configure GPIO pin : PtPin */</p><p> GPIO_InitStruct.Pin = KC13_Pin;</p><p> GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;</p><p> GPIO_InitStruct.Pull = GPIO_PULLDOWN;</p><p> HAL_GPIO_Init(KC13_GPIO_Port, &GPIO_InitStruct);</p><p>
- </p><p> /*Configure GPIO pin : PtPin */</p><p> GPIO_InitStruct.Pin = KA0_Pin;</p><p> GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;</p><p> GPIO_InitStruct.Pull = GPIO_PULLDOWN;</p><p> HAL_GPIO_Init(KA0_GPIO_Port, &GPIO_InitStruct);</p>
复制代码
进入待机模式之前需要使能唤醒引脚
- <p>LL_PWR_EnableWakeUpPin(LL_PWR_WAKEUP_PIN1|LL_PWR_WAKEUP_PIN2); //LL库函数 使能唤醒引脚</p><p>//等同寄存器操作 PWR->CSR|=PWR_CSR_EWUP1|PWR_CSR_EWUP2;</p>
复制代码
以下是进入待机模式
代码
- <p>//库函数</p><p>void stop(void)</p><p>{</p><p> //LL_PWR_DisablePVD(); //失能电压调节器</p><p> //LL_PWR_EnterLowPowerRunMode(); //深度睡眠模式下调压器进入低功耗模式</p><p> //LL_LPM_EnableSleepOnExit(); //SLEEPONEXIT = 1 <span style="white-space:pre"> </span></p><p><span style="white-space:pre"> </span> LL_LPM_EnableDeepSleep(); //SLEEPDEEP位=1:进入低功耗时为深度睡眠模式<span style="white-space:pre"> </span> <span style="white-space:pre"> </span> </p><p><span style="white-space:pre"> </span> LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY); //PDDS位=1:器件在CPU进入深度睡眠时进入待机模式</p><p><span style="white-space:pre"> </span> </p><p><span style="white-space:pre"> </span> //__set_PRIMASK(1); //屏蔽所有可屏蔽中断</p><p><span style="white-space:pre"> </span> //__disable_irq(); //关闭总中断</p><p><span style="white-space:pre"> </span> LL_SYSTICK_DisableIT(); //失能(挂起)系统时钟中断</p><p><span style="white-space:pre"> </span> LL_PWR_ClearFlag_WU(); //WUF位=0:清除收到唤醒事件标志</p><p><span style="white-space:pre"> </span>__WFI();</p><p>//<span style="white-space:pre"> </span>SystemInit();</p><p>
- </p><p>}</p><p>
- </p><p>//寄存器</p><p>//void enter_Standby(void)</p><p>//{</p><p>
- </p><p>//<span style="white-space:pre"> </span>/*EnableClocks*/</p><p>
- </p><p>//<span style="white-space:pre"> </span>RCC->APB1ENR|=RCC_APB1ENR_PWREN;</p><p>
- </p><p>//<span style="white-space:pre"> </span>/*PrepareforStandby*/</p><p>
- </p><p>//<span style="white-space:pre"> </span>//ifWKUPpinsarealreadyhigh,theWUFbitwillbeset</p><p>
- </p><p>//<span style="white-space:pre"> </span>PWR->CSR|=PWR_CSR_EWUP1|PWR_CSR_EWUP2;</p><p>
- </p><p>//<span style="white-space:pre"> </span>PWR->CR|=PWR_CR_CWUF;//cleartheWUFflagafter2clockcycles</p><p>
- </p><p>//<span style="white-space:pre"> </span>PWR->CR|=PWR_CR_ULP;//V_{REFINT}isoffinlow-powermode</p><p>
- </p><p>//<span style="white-space:pre"> </span>PWR->CR|=PWR_CR_PDDS;//EnterStandbymodewhentheCPUentersdeepsleep</p><p>
- </p><p>//<span style="white-space:pre"> </span>SCB->SCR|=SCB_SCR_SLEEPDEEP_Msk;//low-powermode=stopmode</p><p>
- </p><p>//<span style="white-space:pre"> </span>SCB->SCR|=SCB_SCR_SLEEPONEXIT_Msk;//reenterlow-powermodeafterISR</p><p>
- </p><p>//<span style="white-space:pre"> </span>__WFI();//enterlow-powermode</p><p>
- </p><p>//}</p>
复制代码
项目:两节1.5V电池串联供电,外设主要包括蓝牙、OLED等,使用的内部晶振,实测工作状态电流13mA,待机模式电流65uA,差强人意。
(单片机无程序状态下,电路电流为500mA左右,这电路就很离谱)
注意:
高阻态并不代表外围电路没有电流,如果电路中有使用I/O口控制外设电源的,那么进入待机模式后一定要实测,要实测,实测。
|