笔记来源于STM32F103VET6,野火指南者,中文参考手册,HAL库开发手册和b站的野火指南者视频。观看过好多次了,但往往理解得不够全面,现记下小笔记,用来回顾。属于个人笔记。
STM32芯片主要通过VDD引脚从外部获取电源,在它的内部具有电源监控器用于检测VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统可靠地运行。
当检测到VDD的电压低于阈值VPOR及VPDR时,无需外部电路辅助,STM32芯片会自动保持在复位状态,防止因电压不足强行工作而带来严重的后果。
在刚开始电压低于VPOR时(约1.92V),STM32保持在上电复位状态(POR,Power On Reset)。当VDD电压持续上升至大于VPOR时,芯片开始正常运行。
而在芯片开始正常运行的时候,当检测到VDD电压下降至低于VPDR阈值(约1.88V),会进入掉电复位状态(PDR,Power Down Reset)。
当检测到VDD电压低于编程的VPVD阈值时,会向内核产生一个PVD中断(EXTI16线中断)以使内核在复位前进行紧急处理。该电压阈值可通过电源控制寄存器PWR_CSR设置。
阈值等级 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
级别0 | 上升沿 | 2.1 | 2.18 | 2.26 | V |
级别0 | 下降沿 | 2 | 2.08 | 2.16 | V |
级别1 | 上升沿 | 2.19 | 2.28 | 2.37 | V |
级别1 | 下降沿 | 2.09 | 2.18 | 2.27 | V |
级别2 | 上升沿 | 2.28 | 2.38 | 2.48 | V |
级别2 | 下降沿 | 2.18 | 2.28 | 2.38 | V |
级别3 | 上升沿 | 2.38 | 2.48 | 2.58 | V |
级别3 | 下降沿 | 2.28 | 2.38 | 2.48 | V |
级别4 | 上升沿 | 2.47 | 2.58 | 2.69 | V |
级别4 | 下降沿 | 2.37 | 2.48 | 2.59 | V |
级别5 | 上升沿 | 2.57 | 2.68 | 2.79 | V |
级别5 | 下降沿 | 2.47 | 2.58 | 2.69 | V |
级别6 | 上升沿 | 2.66 | 2.78 | 2.9 | V |
级别6 | 下降沿 | 2.56 | 2.68 | 2.8 | V |
级别7 | 上升沿 | 2.76 | 2.88 | 3 | V |
级别7 | 下降沿 | 2.66 | 2.73 | 2.9 | V |
为了提高转换精度,STM32的ADC配有独立的电源接口,方便进行单独的滤波。ADC的工作电源使用VDDA引脚输入,使用VSSA作为独立的地连接,VREF引脚作为ADC提供测量使用的参考电压。
所有数字逻辑都在内。VDD的供电电压为1.8V。
接晶振。RTC用到的纽扣电池推荐CR1220。
工作模式(高功耗->低功耗):运行、睡眠、停止、待机。
若备份域电源正常供电,备份域内的RTC都可以正常运行,备份域内的寄存器的数据会被保存,不受功耗模式影响。
特性 | 说明 |
立即睡眠 | 在执行WFI或WFE指令时立即进入睡眠模式 |
退出时睡眠 | 在退出优先级最低的中断服务程序后才进入睡眠模式 |
进入方式 | 内核寄存器的SLEEPDEEP=0,然后调用WFI或WFE指令即可进入睡眠模式; 另外若内核寄存器的SLEEPONEXXIT=0时,进入“立即睡眠”模式。SLEEPONEXXIT=1时,进入“退出时睡眠”模式 |
唤醒方式 | 如果是使用WFI指令睡眠的,则可使用任意中断唤醒; 如果是使用WFE指令睡眠的,则由事件唤醒; |
睡眠时 | 关闭内核时钟,内核停止,而外设正常运行,在软件上表现为不再执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据 |
唤醒延迟 | 无延迟 |
唤醒后 | 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序; 若由事件唤醒,直接接着执行WFE后的程序 |
在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设停止了工作,但由于其1.8V区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所有从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒,在停止模式中可以选择电压调节器开启或低功耗模式。
特性 | 说明 |
调压器低功耗模式 | 在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗 |
进入方式 | 内核寄存器的SLEEPDEEP=1,PWR_CR:PDDS=0,然后调用WFI或WFE指令即可进入停止模式; PWR_CR:LPDS=0,调压器工作在正常模式;PWR_CR:LPDS=1,调压器工作在低功耗模式; |
唤醒方式 | 如果是使用WFI指令睡眠的,可使用任意EXTI线的中断唤醒; 如果是使用WFE指令睡眠的,可使用任意配置为事件模式的EXTI线事件唤醒; |
停止时 | 内核停止,片上外设也停止。这个状态会保留停止前的内核寄存器、内存的数据 |
唤醒延迟 | 基础延迟为HSI振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间 |
唤醒后 | 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序; 若由事件唤醒,直接接着执行WFE后的程序。唤醒后,STM32会使用HSI作为系统时钟 |
待机模式,它除了关闭所有的时钟,还把1.8V区域的电源也完全关闭了。即从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片进行复位,重新检测boot条件,从头开始执行程序。
它由四种唤醒方式,分别是WKUP(PA0)引脚的上升沿、RTC闹钟事件、NRST引脚的复位和IWDG(独立看门狗)复位。
特性 | 说明 |
进入方式 | 内核寄存器的SLEEPDEEP=1,PWR_CR:PDDS=1,PWR_CR:WUF=0,然后调用WFI或WFE指令即可进入停止模式; |
唤醒方式 | 通过WKUP引脚的上升沿、RTC闹钟、唤醒、入侵、时间戳事件或NRST引脚外部复位及IWDG复位唤醒 |
待机时 | 内核停止,片上外设也停止。内核寄存器、内存的数据会丢失;除复位引脚、RTC_AF1引脚及WKUP引脚,其它I/O口均工作在高阻态 |
唤醒延迟 | 芯片复位的时间 |
唤醒后 | 相当于芯片复位,在程序表现为从头开始执行代码 |
低于阈值产生PVD中断。阈值由参数配置。参数可选择宏,宏对应上述的阈值等级。
void PWR_EnterSTOPMode(uint32_t PWR_Regulator,uint8_t PWR_STOPEntry);
PWR_Regulator可选择宏:PWR_Regulator_ON、PWR_Regulator_LowPower。
PWR_STOPEntry可选择宏:PWR_STOPEntry_WFI、PWR_STOPEntry_WFE。
#define __WFI __wfi
#define __WFE __wfe
void PWR_EnterSTANDBYMode(void);
进入待机模式必须开启PWR时钟。