以下心得,雅特力科技AT32F403A PWR几种低功耗模式说明
目前主流的单片机均具备低功耗功能,其中包括AT、ST等型号做得基本都差不多,不过几个低功耗模式之间差异比较大,以下主要从我的观点对各个模式做一个对比
1)Sleep<睡眠>
仅CPU 时钟关闭,其他所有外设时钟比如数字的TMR以及模拟的ADC时钟无影响。注意所有外设时钟都没有被关闭,因此外设还能工作
进入Sleep:
在开PWR时钟前提下清SLEEPDEEP后执行WFI或者WFE即可
AT有将进Sleep命令封装到库函数内,因此用户只需要调用PWR_EnterSleepMode(/*参数*/)即可,ST未做库函数封装,需要用户自己写这几句命令
退出Sleep:
WFI进入的Sleep固定通过外设中断+NVIC使能。WFE进的Sleep可通过三种方式唤醒①外设中断+NVIC使能,②外设中断+SEVONPEND,③EXTI事件
2)Stop<停机>
1.2V供电区域的的所有时钟(包括CPU及普通外设)都被停止,SysTick除外,PLL、HSI和HSE RC振荡器的功能被禁止,SRAM和寄存器内容被保留下来。注意外设时钟只是被停止,此时之前被拉高的GPIO还会保持
进入Stop:
在开PWR时钟前提下清PWR_CTR的PDDS位,并设置SLEEPDEEP后执行WFI或者WFE即可
调用库函数PWR_EnterSTOPMode(/*参数*/)
退出Stop:
WFI进入的Stop固定通过EXTI线中断+NVIC使能。WFE进的Stop可通过三种方式唤醒①EXTI中断+NVIC使能,②EXTI中断+SEVONPEND,③EXTI事件
3)Standby<待机>
1.2V供电区域被断电,PLL、HSI和HSE振荡器也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电。注意大多数外设被断电,其中用于唤醒的外设除外
进入Standby:
在开PWR时钟前提下清PWR_CTRLSTS中的WUF位,设置PWR_CTR的PDDS位,并设置SLEEPDEEP后执行WFI或者WFE即可
调用库函数PWR_EnterSTANDBYMode()
退出Standby:
此时不在有WFI/WFE进入的唤醒差异,固定唤醒源为WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位
小黑板:
A.对于Sleep/Stop,通过WFE进入并经外设/EXTI中断+SEVONPEND或者EXTI事件唤醒的唤醒时间是最短的,因为没有时间损失在中断的进入或退出上
B.Stop唤醒后,如果用户不期望系统时钟为HSI的话,就需要进行重新配置,因为在STOP唤醒后,系统时钟会被硬件固定选择为HSI
C.不管什么唤醒源唤醒,Standby的唤醒后,代码是重新从头执行的,因此Standby模式需要慎用
D.Sleep下的电流消耗一般维持在几十或近百mA级别,Stop下的电流消耗一般维持在一或几mA级别,Standby下的电流消耗一般维持在几个uA级别
E.主要用于调试的MCUDBG中的Bit位DBG_SLEEP、DBG_STOP、DBG_STANDBY对低功耗模式存在一定程度的影响,计划后续将对此做一点必要的使用说明