• PWR电源控制


    一、PWR简介

    1、PWR(Power Control)电源控制

    (1)PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器低功耗模式的功能

    (2)可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务

    (3)低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间

    2、电源框图

    3、上电复位和掉电复位

    4、可编程电压监测器

    5、低功耗模式

    6、模式选择

            执行WFI(Wait For Interrupt)或者WFE(Wait For Event)指令后,STM32进入低功耗模式

    7、睡眠模式

    (1)执行完WFI/WFE指令后,STM32进入睡眠模式程序暂停运行唤醒后程序从暂停的地方继续运行

    (2)SLEEPONEXIT位决定STM32执行完WFI或WFE后,是立刻进入睡眠,还是等STM32从最低优先级的中断处理程序中退出时进入睡眠

    (3)在睡眠模式下,所有的I/O引脚保持它们在运行模式时的状态

    (4)WFI指令进入睡眠模式,可被任意一个NVIC响应的中断唤醒

    (5)WFE指令进入睡眠模式,可被唤醒事件唤醒

    8、停止模式

    (1)执行完WFI/WFE指令后,STM32进入停止模式程序暂停运行唤醒后程序从暂停的地方继续运行

    (2)1.8V供电区域的所有时钟都被停止PLL、HSI和HSE被禁止SRAM和寄存器内容被保留下来

    (3)在停止模式下,所有的I/O引脚保持它们在运行模式时的状态

    (4)当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟(8MHz)

    (5)当电压调节器处于低功耗模式下,系统从停止模式退出时,会有一段额外的启动延时

    (6)WFI指令进入停止模式,可被任意一个EXTI中断唤醒

    (7)WFE指令进入停止模式,可被任意一个EXTI事件唤醒

    9、待机模式

    (1)执行完WFI/WFE指令后,STM32进入待机模式唤醒后程序从头开始运行

    (2)整个1.8V供电区域被断电PLL、HSI和HSE也被断电SRAM和寄存器内容丢失只有备份的寄存器和待机电路维持供电

    (3)在待机模式下,所有的I/O引脚变为高阻态(浮空输入)

    (4)WKUP引脚上升沿RTC闹钟事件上升沿NRST引脚上外部复位IWDG复位退出待机模式

    二、修改主频

    1、按照以下接线方式连接,并将STLINK插到电脑上

    2、解除只读

    打开工程文件夹,对应文件的位置,右键属性

    取消只读的勾

    如果想要整个文件夹都取消只读,就需要对文件夹的属性只读去掉就好了

    3、修改主频

    (1)修改主频为36MHz

    (2)编写main.c文件

    1. #include "stm32f10x.h" // Device header
    2. #include "Delay.h"
    3. #include "OLED.h"
    4. int main(void)
    5. {
    6. OLED_Init();
    7. OLED_ShowString(1,1,"SYSCLK:");
    8. OLED_ShowNum(1,8,SystemCoreClock,8);
    9. while(1)
    10. {
    11. OLED_ShowString(2,1,"Running");
    12. Delay_ms(500);
    13. OLED_ShowString(2,1," ");
    14. Delay_ms(500);
    15. }
    16. }

    4、实现效果

    修改主频

    主频由72MHz修改到36MHz,Running闪烁周期由1s变成2s 

    三、睡眠模式&串口发送和接收

    1、按照以下接线方式连接,并将STLINK插到电脑上

    2、修改串口发送和接收的main.c文件

    1. #include "stm32f10x.h" // Device header
    2. #include "Delay.h"
    3. #include "OLED.h"
    4. #include "Serial.h"
    5. uint8_t RxData;
    6. int main(void)
    7. {
    8. OLED_Init();
    9. Serial_Init();
    10. OLED_ShowString(1,1,"RxData:");
    11. while(1)
    12. {
    13. if(Serial_GetRxFlag() == 1)
    14. {
    15. RxData = Serial_GetRxData();
    16. Serial_SendByte(RxData);
    17. OLED_ShowHexNum(1,8,RxData,2);
    18. }
    19. OLED_ShowString(2,1,"Running");
    20. Delay_ms(100);
    21. OLED_ShowString(2,1," ");
    22. Delay_ms(100);
    23. __WFI();//中断唤醒
    24. }
    25. }

    3、实现效果

    睡眠模式下串口发送和接收

            在主循环最后执行WFI,CPU会立刻睡眠,程序停在WFI指令这里,发送数据,USART外设收到数据,产生中断,唤醒CPU,程序在暂停的地方继续运行,先进入中断再回到主循环

            Running闪烁一次,程序在收到数据之后,可以唤醒工作一次,CPU在空闲时睡眠,节约用电

            注:再次下载程序显示下载不成功,所以按住复位键,再按下载键,最后松开复位键才可以下载成功

    四、停止模式&对射式红外传感器计次

    1、按照以下接线方式连接,并将STLINK插到电脑上

    2、PWR库函数的功能

    3、修改对射式红外传感器计次的main.c文件

    1. #include "stm32f10x.h" // Device header
    2. #include "Delay.h"
    3. #include "OLED.h"
    4. #include "CountSensor.h"
    5. int main(void)
    6. {
    7. OLED_Init();
    8. CountSensor_Init();
    9. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//开启PWR时钟
    10. OLED_ShowString(1,1,"Count:");
    11. while(1)
    12. {
    13. OLED_ShowNum(1,7,CountSensor_Get(),5);
    14. OLED_ShowString(2,1,"Running");
    15. Delay_ms(100);
    16. OLED_ShowString(2,1," ");
    17. Delay_ms(100);
    18. PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);//停机模式,电压调节器开启
    19. SystemInit();//重新启动HSE,配置72M的主频,退出停止模式时,HSI(8MHz)被选为系统时钟,首次复位后,SystemInit函数配置的是HSE*9倍频的72M主频,所以复位后第一次Running闪烁很快
    20. }
    21. }

    4、实现效果

    停止模式下对射式红外传感器计次

    五、待机模式&实时时钟

    1、按照以下接线方式连接,并将STLINK插到电脑上

    2、修改实时时钟的main.c文件

    1. #include "stm32f10x.h" // Device header
    2. #include "Delay.h"
    3. #include "OLED.h"
    4. #include "MyRTC.h"
    5. int main(void)
    6. {
    7. OLED_Init();
    8. MyRTC_Init();
    9. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //开启PWR时钟
    10. OLED_ShowString(1,1,"CNT :");//秒计数器
    11. OLED_ShowString(2,1,"ALR :");//闹钟值
    12. OLED_ShowString(3,1,"ALRF:");//闹钟标志位
    13. PWR_WakeUpPinCmd(ENABLE);//WKUP引脚唤醒,WKUP引脚悬空就是低电平,WKUP上升沿唤起待机
    14. uint32_t Alarm = RTC_GetCounter() +10;
    15. RTC_SetAlarm(Alarm);//闹钟寄存器是只写的,不可以读,可以在写之前把数据存起来
    16. OLED_ShowNum(2,6,Alarm,10);//这样就可以读闹钟寄存器的值了
    17. while(1)
    18. {
    19. OLED_ShowNum(1,6,RTC_GetCounter(),10);
    20. OLED_ShowNum(3,6,RTC_GetFlagStatus(RTC_FLAG_ALR),1);//获取闹钟标志位
    21. OLED_ShowString(4,1,"Running");
    22. Delay_ms(100);
    23. OLED_ShowString(4,1," ");
    24. Delay_ms(100);
    25. OLED_ShowString(4,9,"STANDBY");
    26. Delay_ms(1000);
    27. OLED_ShowString(4,9," ");
    28. Delay_ms(1000);
    29. OLED_Clear();//表示在待机模式之前把外部接的模块全部断电
    30. PWR_EnterSTANDBYMode();//进入待机模式,待机模式退出,程序从头开始,待机模式以下的代码不会别执行
    31. }
    32. }

    3、实现效果

    待机模式下实时时钟

            最开始显示一些信息,进入待机,OLED清屏,等待一会,闹钟触发之后唤醒一次,并用WKUP引脚唤醒待机模式,WKUP引脚悬空就是低电平,WKUP上升沿唤起待机

  • 相关阅读:
    2022年9月电子学会Python等级考试试卷(三级)答案解析
    React 入门:组件实例三大属性之refs
    《机器学习算法竞赛实战》读书笔记
    解析视频编辑SDK的技术服务支持与价格
    【C语言进阶(13)】文件操作
    SwiftUI 组件大全之使用 SceneKit 和 SwiftUI 构建交互式 3D 饼图(教程含源码)
    Exploration by random network distillation论文笔记
    【动态规划】198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III
    【NLP】第9章 匹配分词器和数据集
    【1++的刷题系列】之双指针
  • 原文地址:https://blog.csdn.net/qq_45419343/article/details/139784375