一、原理
睡眠模式不响应其他操作,比如烧写程序,烧写时按住复位键松手即可下载,在禁用JTAG也可如此烧写程序。
对于低功耗模式可以通过RTC唤醒、外部中断唤醒、中断唤醒。
1、电源框图:
VDDA主要负责模拟部分的供电、Vref+和Vref-为模拟参考电压。有些芯片单独引出,有些内部接到了VDD和Vss。
VDD主要供电电压调节器、待机电路、独立看门狗等。电压调节器降压供电1.8V到CPU核心存储器、内置数字外设等。
后备供电区域:通过VBAT给LSE晶体振荡器、RCC BDCR寄存器、RTC等供电。通过低电压检测器,VDD有电时通过VDD供电,没电时通过VBAT供电。
2、低功耗模式
1、睡眠模式:只关闭CPU时钟,所有涉及运算和时序的操作都暂停,程序暂停运行。内部寄存器和存储器的数据保持不变。CPU不运行但是外设可以运行。可通过任一中断和唤醒时间唤醒。
2、停机模式:关闭所有1.8V的高速时钟。CPU核心存储器和内置数字外设(比如SPI、串口、NIVC、I2C等功能外设,但是外部中断GPIO可用)都不能运行。但是电压调节器1.8V不断电(CPU核心存储器和内置数字外设都是电压调节器供电,不断电恢复上电更快),停止前的状态保持,寄存器内容保存,唤醒可以继续运行。
PDDS用来区分是停机模式还是待机模式,PDDS=0进入停机模式,PDDS=1进入待机模式。
LPDS用来设置停机模式电压调节器(关于1.8V主区域供电),LPDS=0电压调节器开启,LPDS=1电压调节器进入低功耗模式。关乎到存储器和核心区域是否供电。
只能通过外部中断唤醒。
3、待机模式:SLEEPDEEP=1表示深度睡眠,PDDS=1进入待机模式。调用WFI|WFE进入待机模式。更难以唤醒,对比停机模式,待机模式更是将1.8V电压调节器供电都关闭了,只能通过待机电路唤醒。需要重新从程序起始位置运行,存储器的内容也丢失。
注意!!!停止模式和待机模式关闭了HSI和HSE,唤醒后若主频变低说明和HSE(默认启动后通过HSI时钟唤醒HSE通过PLL倍频得到72MHz)启动失败,会使用HSI(8Mhz时钟),所以可以在唤醒后启动HSE配置主频为72MHz。
2.1低功耗模式选择:
睡眠模式的立即睡眠和等待中断后睡眠(中断内使用),差别不大,注意使用位置即可。
停机模式的电压调节器开启和电压调节器低功耗差别也不大。更省电但是唤醒延迟更高。
2.2低功耗模式注意事项
2.2.1睡眠模式
2.2.2停止模式
2.2.3待机模式
3、详细功耗内容 ,详细见文件《STM32F103xx数据手册》
关闭外设和开启外设功耗对比
从RAM运行程序比闪存运行程序功耗要低一些
主频、温度、耗电的关系(正比)
睡眠模式功耗情况
停机模式(需要启动时间)和待机模式(待机模式需要更长的启动时间)和VBAT供电功耗
3、上电复位和掉电复位
迟滞的阈值1.92-1.88=40mV,所以复位为大于1.92V上电,小于1.88V下电。复位持续时间2.5ms。
4、可编程电压检测器(上下电阈值可编程调节)
可以看到PVD阈值可以通过编程调节为2.2V~2.9V左右。PVD上限和下限迟滞电压100mV左右。可以看到PVD的检测电压范围比Vpdr上电掉电复位阈值要高。
5、电压检测器原理
PVD中断使用外部中断,只有外部中断可以唤醒停止模式,所以RTC和PVD等接入到外部中断。
二、相关基础
标准库文件system_stm32f10x.c和.h中可以修改主频,两个文件主要用来配置RCC时钟树。
可以改变文件只读性质
通过SystemInit()可以查看系统初始化的内容。函数一开始默认配置使用HSI内部高速8MHz时钟。
在SystemInit()调用SetSysClock函数();可以看到SetSysClock();中通过不同的宏定义运行不同的函数,配置HSE。
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----