STM32的低待机模式3种: 1)睡眠模式(CM3停止,外设继续运行) 2)模式(全部停止) 3)极限(待机)(1.8V电源关闭模式)从输出模式模式后唤醒的代码执行等同于复位后的执行进入待机后,只能有唤醒脚和RTC唤醒模式,特别是唤醒后,程序最开始运行,也就是相当于软件复位。会略有不同,一般新出的芯片功能会增加一些。
STM32L系列有五种低功耗模式,分别是待机,停止,睡眠,低功耗的睡眠,低功耗运行。
待机模式下消耗最低,实测电流为1uA,不同模式下数据不保存。
停止模式实测消耗为1.3uA,模式下数据保存
为1mA,主要受左右频率。等影响,启动
使用RTC调用,使用其他方式唤醒方式相对简单如下,官方示例程序此代码。
用场景模式的理由及与停止模式的区别
开始
装卸模式设备消耗时间结束,电池在电路板上,关闭模具,一直到用户使用,保持最低功耗。
和停止模式的区别是
![]()
因为SRAM和控制器的内容会保存,即能PC跟踪记录程序当前运行的位置,从停止模式启动时,可以继续到时进入停止模式处往下运行。(故运行时,设备检测到是电池供电时,选用停止模式:采集完数据进入停止模式,2小时后(根据需求自定义)定时唤醒采集,依此循环)
![]()
SRAM和寄存器内容不会保存,即待机模式唤醒相当于系统复位,从头运行(设备完成,从头运行(设备完成,入库时),通过外部等方式进入多种模式模式)特征
![]()
模式实现整体
![]()
模式三个步骤说明:
1.将系统控制控制第二位置1,当进入深度睡眠时,允许停止系统时钟(系统控制屏蔽参考《Cortex-M3
![]()
权威能指南》)2.使PWR_CR的PDDS位,隐藏睡眠时进入
标志模式3.清除WUF唤醒标志(WUF由硬件组成)置位,当系统是WKUP 唤醒复位而不是上电应用等复位时会置位。中可以保存PWR_CSR 的WUF 位是否为1 来判断系统复位是非唤醒唤醒)
4.
以上三个步骤由库函数WR_EnterSTANDYMode()实现
![]()
进入模式B
void Standby_Enter(void)
{
RCC_APB2PeriphResetCmd(0x01fc,禁用);//准备进入待机模式,复位所有IO,降低功耗(参照手册,根据需要复位对应IO)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //需要配置电源控制寄存器,所以使能时钟,否则不能正常使用命令进入唤醒状态和唤醒
PWR_WakePinCmd(ENABLE); //使能WKUP唤醒功能,WKUP唤醒不能退出
PWR_EnterSTANDBYMode(); //进入状态模式
}
void Standby_Config(void)
{
GPIO_InitTypeDef_GPIOInitStructure;
//EXTI_InitTypeDef EXTI_InitStructure;
//NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(WAKEUP_PORT, &GPIO_InitStructure);
/*00只是为了唤醒,这不要,唤醒不能中断,可以中断停止工作,如果正常模式下需要部分中断,可根据需要添加中断事件,这就是中断事件
EXTILineConfig(GPIO_PortSourceGPIOA0_PinSourceGPIOA0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
NVIC_InitStructure.NVIC_IRQChannelCmd = 启用;
NVIC_Init(&NVIC_InitStructure);
*/
}
中断处理(注:唤醒后接近复位,不会执行中断函数里的内容)
void EXTI0_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
}
void main(void)
{
。..
Standby_Configure();
。..
//读取PWR_CSR的WUF位检测复位复位,也为什么在进入唤醒模式之前需要清除WUF唤醒标志,这样检测到唤醒这就是启动标志确定发生了唤醒复位
if(PWR_GetFlagStatus(PWR_FLAG_WU) == SET)//从唤醒唤醒后,除了电源控制/状态智能(PWR_CSR),所有的手腕被复位
{
//是提前唤醒,可帮助 电调试
}
else
{
//上复位、软件复位等非唤醒复位
}
while(1)
{
if(外部特征标志) //根据硬件和个人需求确定什么时候进入示范模式
{
Standby_Entering();
}
//数据采集,发送
//进入停止模式
//定时从停止模式唤醒
}
}