近期有个项目需要对功耗进行严格控制,经综合考虑选定STM32L433。因为我们用到LCD段码屏显示,而L433自身就可以直接驱动LCD屏幕,并且进入低功耗模式不会影响到屏幕的显示。其他外设还用到了ADC,两个串口。
首先我们要配置一个唤醒源,我们用的是STOP2模式。所以LCD中断,RTC中断,外部中断都可以唤醒,因为我们要定时上传数据,所以选定RTC中断,RTC中断有两种,一个是闹钟,一个是周期性的定时。我们不需要精准的时间点唤醒,只需要一个固定的周期就可以了。所以初始化了RTC。如图:
并且配置了一个定时器,代码如下:
/* 开启RTC唤醒中断 唤醒周期10000/2K=5S*/
if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 10000, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
{
Error_Handler();
}
DBGMCU->CR |= DBGMCU_CR_DBG_STOP; /* 为了能够在停止模式下调试 */
在需要休眠之前,我们还需要做一些工作,比如释放掉用不到的GPIO,外设等资源,进一步控制功耗(按需处理)。代码如下:
/*停止ADC节能*/
HAL_ADCEx_InjectedStop(&hadc1);
HAL_ADC_Stop(&hadc1);
/*复位ADC */
HAL_ADC_DeInit(&hadc1);
/*关闭模组通讯串口 */
HAL_UART_MspDeInit(&hlpuart1);
/*释放GPIO */
HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
然后关掉滴答定时器:
/* De-Init the low level hardware */
SysTick->CTRL = 0x00;//关闭定时器 他喵的,不关不好使
SysTick->VAL = 0x00;//清空val,清空定时器
然后进入STOP2模式,因为我们定义的是RTC中断,所以可以使用WFI指令:
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); //进入STOP模式 通过RTC唤醒
等到唤醒以后第一件事,要重新配置时钟(及其重要):
SystemClock_Config();
最后按需恢复自己用到的外设就可以了。
总结一下:
1.进入低功耗模式之前一定要关闭用不到的外设,这些外设不关闭会消耗很大的电流。
2.手册说不用关闭滴答定时器,实测是需要关闭的。
3.恢复后的代码是从唤醒终端开始执行的,我们中断啥都没做,所以是从休眠后的第一句执行的。
4.恢复后第一件是要配置时钟,因为休眠过程部分时钟关闭了。
5.其他外设使用前,一定记得初始化!
完事,下班!