易思企业网站破解版,成都市成华区建设局官方网站,移动软件开发工程师,南昌网站建设联系方式一、电源管理系统简介
电源管理系统是STM32硬件设计和系统运行的基础#xff0c;它不仅为芯片本身提供稳定的电源#xff0c;还通过多种电源管理功能优化功耗、延长电池寿命#xff0c;并确保系统的可靠性和稳定性。
二、电源监控器
作用#xff1a;保证STM32芯片工作在…一、电源管理系统简介
电源管理系统是STM32硬件设计和系统运行的基础它不仅为芯片本身提供稳定的电源还通过多种电源管理功能优化功耗、延长电池寿命并确保系统的可靠性和稳定性。
二、电源监控器
作用保证STM32芯片工作在它自己要求的一个电压范围内。 STM32芯片主要通过引脚VDD从外部获取电源在它的内部具有电源监控器用于检测VDD的电压以实现复位功能及掉电紧急处理功能保证系统地运行。 2.1 上电复位POR与掉电复位PDR PORPower On Reset PDRPower Down Reset 当VDD/VDDA低于指定的限位电压VPOR/VPDR时系统保持为复位状态而无需外部复位电路。 在刚开始上电电压低于VPOR约1.92V时系统保持在上电复位状态当VDD电压持续上升到大于VPOR时系统开始正常运行 在系统正常运行时检测到VDD电压下降至低于VPDR阈值约1.88V时系统会进入掉电复位状态。 VPOR与VPDR的差值大概在40mv。 2.2 可编程电压监控器PVD
除了POR与PDR功能STM32还提供了PVD用于实时检测VDD电压当检测到VDD电压低于编程的VPVD阈值时会向内核产生一个PVD中断EXTI16线中断该中断不用手动设置以使内核在复位前进行紧急处理。 当VDD下降到PVD阀值以下和(或)当VDD上升到PVD阀值之上时根据外部中断第16线的上升/下降边沿触发设置就会产生PVD中断。 使用PVD可配置8个等级。 其中上升沿和下降沿分别表示VDD电压上升过程及下降过程的阈值。 PVD可以理解为POR与PDR的升级版对电压值可编程复位前通过中断通知。
三、电源系统 STM32的电源系统主要分为ADC电路、调压器供电电路以及备份域电路三个部分。
3.1 ADC电路VDDA供电区域
ADC电路的工作电源使用VDDA引脚输入使用VSSA作为独立的地连接VRED引脚则为ADC提供测量使用的参考电压。 为什么ADC配有单独的电源接口 为了提高转换精度方便进行单独的滤波。
VDDA供电区域包含模数转换的一部分。
3.2 调压器供电电路VDD/1.8V供电区域
调压器供电电路是STM32电源系统中最主要的部分为备份域及待机模式以外的所有数字电路供电其中包括内核、数字外设例如串口、GPIO口、CAN口等以及RAM。
调压器的输出电压约为1.8V。
调压器可以工作在运行模式、停止模式以及待机模式。 在运行模式下1.8V域全功率运行 在停止模式下 1.8V 域运行在低功耗状态 1.8V 区域的所有时钟都被关闭相应的外设都停止了工作但它会保留内核寄存器以及 SRAM 的内容 在待机模式下整个 1.8V 域都断电该区域的内核寄存器及 SRAM 内容都会丢失 (备份区域的寄存器不受影响)
除了后备供电区域外的所有数字逻辑都包含在VDD供电区域VDD供电区只包含数字逻辑不包含模拟。
CPU核心就是cortex m3内核电压调节器用来调节供给cortex内核是否供电。换句话说cortex核心由电压调节器单独供电。
3.3 备份域电路
备份域电路给晶振、时钟供电。
STM32 的 LSE 振荡器、 RTC 及备份寄存器这些器件被包含进备份域电路中这部分的电路可以通过 STM32 的 VBAT 引脚获取供电电源在实际应用中一般会使用 3V 的钮扣电池对该引脚供电。 上图中的电源开关结构类似于下图中的二极管。 后备供电区域由VBAT与VDD选择供电
当主电源供电时上面是3.3V大于下面纽扣电池的输出电压主电源供电给MCU当主电源掉电时就由纽扣电池给MCU供电。
BDCR寄存器备份域寄存器可以往这个寄存器中存储一些数据主电掉电后不会丢失有纽扣电池。
四、低功耗模式
按功耗由高到低排列 STM32 具有运行、睡眠、停止和待机四种工作模式。
上电复位后 STM32处于运行状态时当内核不需要继续运行就可以选择进入后面的三种低功耗模式降低功耗。
这三种模式中电源消耗不同、唤醒时间不同、唤醒源不同用户需要根据应用需求选择最佳的低功耗模式。 4.1 睡眠模式
在睡眠模式中仅关闭了内核时钟内核停止运行但其片上外设 CM3 核心的外设全都还照常运行。
进入睡眠模式通过执行WFIWait For Interrupt或WFEWait For Event指令进入睡眠状态。 从睡眠模式唤醒后程序会在进入睡眠模式的地方进行执行。 WFI与WFE的区别 WFI需要进入中断服务函数中执行WFE不需要进入中断服务函数中执行节省一点时间
4.2 停止模式
在停止模式中进一步关闭了其它所有的时钟于是所有的外设都停止了工作但由于其 1.2V区域的部分电源没有关闭还保留了内核的寄存器、内存的信息所以从停止模式唤醒并重新开启时钟后还可以从上次停止处继续执行代码。
停止模式可以由任意一个外部中断 (EXTI) 唤醒在停止模式中可以选择电压调节器为开模式或低功耗模式。 若调压器处于低功耗模式下唤醒的时间要长一点。等待调压器恢复 通过SLEEPDEEP位的设置选择进入睡眠模式还是停止模式。设置为0进入睡眠模式设置为1进入停止模式
4.3 待机模式
待机模式它除了关闭所有的时钟还把 1.8V 区域的电源也完全关闭了。
从待机模式唤醒程序会从启动文件开始执行相当于复位了。
待机模式有四种唤醒方式分别是 WKUP(PA0) 引脚的上升沿 RTC 闹钟事件 NRST 引脚的复位和 IWDG(独立看门狗) 复位。 睡眠模式、停止模式以及待机待机模式若备份域电源正常供电备份域内的RTC都可以正常运行备份域内的寄存器的数据会被保存不受功耗模式影响。 在进入待机模式后除了被使能了的用于唤醒的 I/O其余 I/O 都进入高阻态。
5、实验设计
5.1 睡眠模式
// main.c文件
#include stm32f10x.h
#include bsp_key.h
#include bsp_exti.h
#include bsp_systick.h
#include usart.hchar str[10] {0};int main(void)
{EXTI_KEY1_Config();EXTI_KEY2_Config();USART_Config();printf(\r\n 睡眠前 \r\n);__WFI();printf(\r\n 唤醒后 \r\n);printf(\r\n str%s \r\n, str);while(1){printf(\r\n 睡眠前 \r\n);__WFI();printf(\r\n 唤醒后 \r\n);printf(\r\n str%s \r\n, str);}}// stm32f10x_it.c
extern char str[10];
void EXTI0_IRQHandler(void)
{if(EXTI_GetFlagStatus(EXTI_Line_KEY1) ! RESET){//LED_G_TOGGLE();strcpy(str, 按键1中断);}EXTI_ClearFlag(EXTI_Line_KEY1);
}// 这里的中断名称不要写成 EXTI4_IRQHandler
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetFlagStatus(EXTI_Line_KEY2) ! RESET){//LED_B_TOGGLE();strcpy(str, 按键2中断);}EXTI_ClearFlag(EXTI_Line_KEY2);
}void USART1_IRQHandler(void)
{uint8_t ucTemp;if(USART_GetFlagStatus(DEBUG_USARTx, USART_IT_RXNE) ! RESET){strcpy(str, 串口中断);ucTemp USART_ReceiveData(DEBUG_USARTx);USART_SendData(DEBUG_USARTx, ucTemp);}
}注意不建议在中断服务函数中添加打印函数可能会影响系统的运行速度。
可以在中断服务函数中把要打印的数据赋值给变量在主函数中打印。 在 USART1_IRQHandler 中断服务函数中如果将函数内容改为
void USART1_IRQHandler(void)
{uint8_t ucTemp;if(USART_GetFlagStatus(DEBUG_USARTx, USART_IT_RXNE) ! RESET){strcpy(str, 串口中断);}
}在串口上无法看到打印的数据原因 没有清除接受中断标志位中断标志位会一直保持在置位状态导致中断服务函数一直被反复触发程序一直执行中断服务函数无法正常执行主函数逻辑。 执行了USART_ReceiveData函数会自动清除RXNE标志位。
5.2 停止模式
// main.c文件
#include stm32f10x.h
#include bsp_key.h
#include bsp_exti.h
#include bsp_rccclkconfig.h
#include bsp_systick.h
#include usart.hchar str[10] {0};static void SYSCLKConfig_STOP(void);int main(void)
{EXTI_KEY1_Config();EXTI_KEY2_Config();USART_Config();printf(\r\n 睡眠前 \r\n);SysTick_Delay_ms(500);PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);/* 恢复 HSE 时钟 */SYSCLKConfig_STOP();printf(\r\n 唤醒后 \r\n);printf(\r\n str%s \r\n, str);while(1){}}/*** brief 从停止模式唤醒后配置系统时钟:启用HSE、PLL并选择PLL作为系统时钟源。* param 无* retval 无*/
static void SYSCLKConfig_STOP(void)
{/* After wake-up from STOP reconfigure the system clock *//* 使能 HSE */RCC_HSEConfig(RCC_HSE_ON);/* 等待 HSE 准备就绪 */while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) RESET){}/* 使能 PLL */RCC_PLLCmd(ENABLE);/* 等待 PLL 准备就绪 */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) RESET){}/* 选择PLL作为系统时钟 */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* 等待PLL被选择为系统时钟 */while(RCC_GetSYSCLKSource() ! 0x08){}
}进入了停止模式退出时如果没有恢复HSE时钟系统的时钟可能会与进入停止模式的时钟不同导致一些其他问题如串口发送错误 5.3 待机模式
// main.c文件
#include stm32f10x.h
#include bsp_exti.h
#include bsp_rccclkconfig.h
#include bsp_systick.h
#include usart.hchar str[10] {0};static void SYSCLKConfig_STOP(void);int main(void)
{USART_Config();printf(\r\n 睡眠前 \r\n);SysTick_Delay_ms(500);// 进入待机模式必须开启PWR时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// 使能 PA0 引脚上升沿唤醒PWR_WakeUpPinCmd(ENABLE);PWR_EnterSTANDBYMode();printf(\r\n 唤醒后 \r\n);printf(\r\n str%s \r\n, str);while(1){}}注意 1、进入待机模式时必须开启PWR时钟 2、使用PA0引脚上升沿唤醒调用PWR_WakeUpPinCmd(ENABLE)即可 3、PA0 引脚上升沿唤醒与复位键唤醒效果相同系统都会从头开始运行。
5.4 PVD检测 PVD会产生EXTI16中断。 // main.c文件
#include stm32f10x.h
#include bsp_exti.h
#include bsp_led.h
#include bsp_rccclkconfig.h
#include bsp_systick.h
#include usart.h
#include bsp_pvd.hint main(void)
{PVD_Config();USART_Config();while(1){}}
// bsp_pvd.c文件
#include bsp_pvd.hstatic void EXTI_PVD_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStruct.NVIC_IRQChannel PVD_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority 1;NVIC_InitStruct.NVIC_IRQChannelCmd ENABLE;NVIC_Init(NVIC_InitStruct);
}void PVD_Config(void)
{EXTI_InitTypeDef EXTI_InitStruct;// 配置 NVIC EXTI_PVD_NVIC_Config();// 开启 PWR 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);/* 选择EXTI的信号源 */EXTI_InitStruct.EXTI_Line EXTI_Line16;/* EXTI为中断模式 */EXTI_InitStruct.EXTI_Mode EXTI_Mode_Interrupt;/* 上升沿中断 */EXTI_InitStruct.EXTI_Trigger EXTI_Trigger_Rising;/* 使能中断 */EXTI_InitStruct.EXTI_LineCmd ENABLE;EXTI_Init(EXTI_InitStruct);// 3.3V 引脚 的电压低于2.6V会产生中断其中3.3V引脚与STM32的VDD引脚相连PWR_PVDLevelConfig(PWR_PVDLevel_2V6);PWR_PVDCmd(ENABLE);
}// bsp_pvd.h文件
#ifndef __BSP_PVD_H
#define __BSP_PVD_H#include stm32f10x.hvoid PVD_Config(void);#endif /* __BSP_PVD_H */// stm32f10x_it.c文件
void PVD_Handler(void)
{if(PWR_GetFlagStatus(PWR_FLAG_PVDO) SET){// 此处做电压下降的紧急处理LED_B(ON);}EXTI_ClearITPendingBit(EXTI_Line16);
}PVD监控VDD的引脚电压当VDD引脚电压低于设定值时产生PVD中断。 另外 进入睡眠模式、停止模式、待机模式后不能使用调试功能。 进入低功耗模式后程序下载不进去解决方法 1、退出低功耗模式再下载SWD、SCK引脚没有被更改为其他模式 2、接RST复位引脚或按复位按键