1、待机模式介绍-standby mode
2、程序编写
根据需要选择最低功耗模式——standby模式,使用WKUP引脚PA0唤醒,WKUP引脚高电平唤醒MCU
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
}
void Standy_mode(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟
PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能
PWR_ClearFlag(PWR_FLAG_WU);
PWR_EnterSTANDBYMode(); //进入待命(STANDBY)模式
}
3、所遇问题以及解决过程
测试待机功能表现正常,待机之后运行指令灯灭、屏灭,按下WKUP引脚,MCU被唤醒,运行指示灯重新闪烁。
测试功耗电流发现不符合要求,最低电流仍有300uA,并且偶尔有个13mA的电流
某人查看电流测试情况后提出判断,这种不平稳的功耗电流可能是没有真正进入待机,本人表示不认同但是功耗确实有问题,开始查阅资料、核对软件。
①通过查阅资料发现,待机模式后,所有IO口均为高阻态,待机前需对GPIO口做合理配置以降低功耗,网上说法挺多且有点乱,未能全部理解,因此在软件上做两点改进:
a)未被用到的GPIO口设为模拟输入
b)用到的GPIO口在待机前给予确定电平
(有错误或者需要补充的麻烦在评论区指正,我也是在学习中......)
②修改软件后再次测试功耗,还是一样的,再次琢磨软件,但是真的没找出软件的毛病,因此屏蔽软件其他功能,只留待机和运行指示灯作为测试软件,并断开板子其他可能耗电模块,测试结果一样
③断开stm32外围连接的所有IC,烧录测试软件与完整软件的测试功耗均符合要求,最低功耗约为3.7uA,逐步排查耗电部件,发现是一个5V转3V的IC在耗电,至此问题解决。(真真是吃了硬件太烂的亏.......)
4、参考文章