低功耗系列
一、Standby模式是什么?
Standby模式是指进入待机模式,系统的功耗比立即睡眠模式会达到一个新低的情况。(由于我的是开发板实测电流会降很多,但是还是在mA以上)
二、代码使用步骤
1.使用STM32CUBEMX创建工程
挑选MCU:
配置时钟:
使能并配置RTC时钟:
使能并配置RTC时钟:
这里是5s唤醒一次
使能中断
配置显示串口:
配置串口无中断
配置下载口:
配置下载引脚,具体你要选那个视情况而定
配置工程编译环境:
2.代码分析
主函数代码如下:
int main(void)
{
/* 方便观察的两行log */
uint8_t temp[30]="***Enter STANDBY Mode***\r\n";
uint8_t rtc_temp[40]="******RTC SET OK******\r\n";
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
/* RTC的初始化 后面说 */
MX_RTC_Init();
MX_USART1_UART_Init();
printf("----STM32L431RCT6 STANDBY TEST----\r\n");
RTC_TimeShow();
while (1)
{
HAL_Delay(500);
/* 判断按键是否按下,按下后发送两条log,设置唤醒时间
* 进入STANDBYMode
*/
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,GPIO_PIN_2) == RESET)
{
HAL_UART_Transmit(&huart1,rtc_temp,sizeof(rtc_temp),2);
HAL_UART_Transmit(&huart1,temp,sizeof(temp),2);
/* 这句话尤为重要,因为你创建工程的时候这句话系统不会写出来,自己要写*/
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 5, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
HAL_PWR_EnterSTANDBYMode();
}
}
}
void RTC_TimeShow(void)
{
RTC_DateTypeDef getSdate;
RTC_TimeTypeDef getTime;
/*日历显示时间用的,没有仔细研究*/
/* Get the RTC current Date */
HAL_RTC_GetDate(&hrtc, &getSdate, RTC_FORMAT_BIN);
/* Get the RTC current Time */
HAL_RTC_GetTime(&hrtc, &getTime, RTC_FORMAT_BIN);
/* Display time Format : Year:Month:Date:WeekDay */
printf("%02d-%02d-%02d ",getSdate.Year, getSdate.Month, getSdate.Date);
// printf("\t\t");
/* Display time Format : hh:mm:ss */
printf("%02d:%02d:%02d",getTime.Hours, getTime.Minutes, getTime.Seconds);
printf("\r\n");
}
3.演示结果
上电正常现象
按下进入待机按键,5s出来
5s后CPU唤醒,程序重新执行
总结
本文简单的写了关于待机模式的代码,这是HAL库的版本。标准库版本可以网上搜索。文章并没有详述待机模式的理论还得读者自己查找文献研究。有错误可以留言指出。