stm32-电源控制

[复制链接]
发表于 2025-10-25 16:48:46 | 显示全部楼层 |阅读模式
STM32 的 PWR(Power Control)外设 是用于管理微控制器电源模式和外设电源控制的模块。通过 PWR 外设,可以实现低功耗模式、电压调治、备份域控制等功能,从而优化体系的功耗和性能

stm32内部电源框图


电源地区


  •         VDD 供电区(主电源)

    • 重要用于为 CPU 核心内存数字外设 提供电力。
    • VDD 通常是 3.3V,为单片机的全部数字部门提供电源。
    • 该地区还包罗 电压调治器,用于确保提供稳固的电源给各个模块。
           
  •         VSSA 和 VDDA(模仿部门电源)

    • VSSA模仿地,用于提供模仿部门的参考电压。
    • VDDA 用于为模仿模块供电,如 A/D 转换器温度传感器 等。
    • 该部门通常由 外部稳压电源 提供 2.4V 至 3.6V 的电源。
           
  •         1.8V 供电区

    • 该部门为一些低功耗模块提供 1.8V 电压,重要用于 CPU 核心低功耗寄存器 和一些特定的外设。
    • 在大多数今世微控制器中,1.8V 电源用于 低功耗利用,淘汰能耗。
           
  •         低电压检测电路

    • 用于监控监控电源电压是否过低。当电压低于肯定值时,体系大概会实行复位或其他掩护机制,防止因电压不稳固导致的非常利用。
           
时钟部门


  •         PLL(锁相环)

    • 用于提供更高频率的时钟,支持更快的处理处罚速率。
    • 通常,STM32 系列单片机利用 PLL 来从较低频率的输入时钟天生更高的主时钟频率(比方从 8 MHz 外部晶振天生 72 MHz)。
           
  •         LSE(低速外部晶体振荡器)

    • 提供给 RTC(及时时钟) 等低速外设一个稳固的时钟源,通常为 32.768 kHz
    • 这个时钟源用于处理处罚低功耗利用,如 待机模式定时器利用
           
备用电源


  •         V_BAT(备用电池)

    • 用于为 RTC其他低功耗外设 提供电力,确保这些模块在主电源关闭时依然可以或许工作。
    • 这通常是由 CR2032 电池 或类似电池提供的。
           
  •         RCC BDCR 寄存器

    • 这个寄存器管理 时钟源,包罗 LSERTC 等外设的时钟。
           
CPU 和存储


  • CPU 核心:实行重要的盘算和逻辑利用。
  • 存储:包罗 闪存SRAM存储模块,用于存储步伐代码和数据。
I/O 电路


  • 用于 外部输入输出 信号的处理处罚。
  • 该电路通常包罗 GPIO 引脚,用于毗连外部装备,如按键、LED、传感器等。


PWR 外设的重要功能
1. 电源模式管理:
   - 支持多种低功耗模式,如眠模式、制止模式和待机模式。
   - 通过设置 PWR 寄存器,可以进入或退出这些模式。
2. 电压调治:
   - 支持动态电压调治(DVS),通过调解核心电压来优化功耗和性能

PWR 上电复位与掉电复位

PWR(Power)模块在 STM32 系列微控制器中重要用于管理电源相干的利用,比方上电、掉电复位、低功耗模式等。电源模块控制着体系的电源源供给,涉及到 上电复位掉电复位 两种状态。
1. 上电复位 (Power-On Reset, POR)

上电复位是指单片机在接通电源时,体系主动举行复位的过程。上电时复位的作用是确保芯片的状态从不确定的状态规复到已知的初始状态。上电复位通常由内部的复位电路完成,不必要外部触发。其重要作用包罗:

  • 确保体系电压稳固,制止不稳固电压引起的非常利用。
  • 规复芯片内部的寄存器值至初始状态,制止由于未界说状态引发的错误。
在 STM32 系列中,PWR模块中的 POR 机制通常由电源电压(VDD)稳固后触发复位信号。
2. 掉电复位 (Brownout Reset, BOR)

掉电复位用于监控监控电源电压的稳固性。如果电源电压跌至一个设定的阈值以下,体系将主动复位,以制止在电压不稳固时继承工作。BOR 掩护功能可以防止体系在低电压下继承运行,制止导致数据错误或体系非常。掉电复位的特性:

  • 如果电压低于设定阈值(比如 2.7V),体系将触发复位。
  • 该机制可以掩护装备在电源电压降落时不产生错误,防止运行在不可靠的电压下。
STM32 提供了一个 BOR 电压检测器,可以设置为差别的阈值,用户可以根据必要启用或禁用该功能。
总结


  • 上电复位 (POR) 是在电源初次接通时主动触发的,确保体系从一个已知状态开始。
  • 掉电复位 (BOR) 是当电源电压低于肯定阈值时触发的,包管体系不会在电压不稳固时继承运行,防止出现错误。





PWR 可编程电压电测器 (PVD)

PVD(Programmable Voltage Detector,可编程电压电测器)是 STM32 微控制器中的一个紧张功能,它用于监测芯片的电源电压,并在电压超出设定范围时触发制止或复位。PVD 重要用于在电压过低时掩护体系,制止因电压不稳固而导致的数据丢失或体系不稳固。

PVD 的功能和作用

PVD 重要有以下功能:

  •         电压监测

    • PVD 可监测供电电压是否超出预定范围,确保装备在稳固的电压范围内运行。
    • 监测电源电压降落到指定阈值时,举行掩护利用。
           
  •         可编程阈值

    • PVD 答应用户设置电压阈值(比方 2.7V、2.8V 等),并在电压低于该阈值时触发相干利用。
           
  •         掩护体系

    • 如果电源电压降到低于预设阈值,PVD 会触发复位大概制止,以掩护体系不在不可靠的电压下继承工作,制止埋伏的数据粉碎或非常运动。
           
  •         启用和禁勤奋能

    • 用户可以根据必要启用或禁用 PVD 功能。
    • 通过设置寄存器,可以设定触发电压的阈值,并选择制止方式。
           
PVD(可编程电压电测器)工作原理具体表明:

PVD 是 STM32 系列芯片中的一个紧张电源管理功能,重要用于监测体系的电源电压,确保体系在稳固的电压下运行。具体来说,PVD 的工作原理如下:
1. 电压监测


  • 电压阈值设置:PVD 答应用户设置一个电压阈值(比方 2.4V、2.7V、3.0V 等)。当体系电源电压降落到这个阈值以下时,PVD 会触发事故。
  • 电压及时监测:PVD 会及时监测 VDD 电压,一旦电压低于设置的阈值,它会做出反应。
2. 触发事故(复位或制止)

当电源电压降落到设定的阈值以下时,PVD 会触发以下两种大概的事故之一:

  • 复位:体系主动复位,以确保体系从一个已知、稳固的状态重新启动。复位后,体系会重新初始化全部外设和内存,确保没有电压不稳固导致的非常。
  • 制止:如果用户启用了制止,PVD 会触发制止,如许体系可以在制止服务步伐中实行相应的处理处罚。制止通常用于处理处罚如进入低功耗模式、制止某些外设等利用。
3. 低功耗模式控制

在电压降落时,PVD 还可以共同 低功耗模式 利用,资助体系只管淘汰功耗。具体利用包罗:

  • 进入低功耗模式:当 PVD 触发事故时,体系可以设置为主动进入低功耗模式(如 Sleep 模式)。这有助于节流电能,延伸电池寿命。
  • 关闭外设:体系也可以选择关闭某些不紧张的外设(如未利用的 GPIO、外设接口等),从而进一步低沉功耗。
4. 体系复位后规复稳固

PVD 可以确保在电压过低时体系能快速规复到安全状态。具体来说:

  • 规复电压稳固:一旦电压规复到正常水平,PVD 会制止触发复位或制止,体系可以继承正常工作。
  • 重新启动全部功能:当 PVD 触发复位后,体系会重新启动,全部外设和数据会规复到初始状态。这是为了制止因电压不稳固引起的体系运行错误。
5. 与其他电源管理功能的共同

PVD 通常与 STM32 的其他电源管理功能联合利用:

  • 独立看门狗(IWDG):如果体系出现非常或复位未能正常处理处罚,IWDG 可以确保体系在肯定时间内规复正常。
  • 电压检测:体系大概配备其他电压检测电路,以确保电源电压始终在预设范围内。
工作流程


  • PVD 阈值设定:起首,用户通过编程设置电压阈值,比方 2.7V。
  • 及时监控监控:PVD 会不绝监测体系电源电压。
  • 电压低于阈值:当电压低于 2.7V 时,PVD 会触发预设的利用(复位或制止)。
  • 触发利用

    • 如果选择了复位,芯片将重新启动,规复到安全状态。
    • 如果选择了制止,体系会实行制止服务步伐,通常会举行电压规复处理处罚、进入低功耗模式或关闭非须要外设。
           
  • 电压规复正常:当电源电压规复到正常值时,PVD 监控制止,体系继承正常运行

PVD 的设置:

在 STM32 微控制器中,PVD 的设置通常是通过编程寄存器来完成的。以下是 PVD 设置的几个常用步调:

  • 选择阈值电压:可以通过 PVDCR 寄存器设置阈值电压(如 2.4V、2.7V 等)
  • 启用 PVD:通过设置相应的控制寄存器,启用 PVD 功能。
  • 设置制止(可选):如果必要,可以设置 PVD 制止,使得体系在触发 PVD 时可以举行相干处理处罚。
PVD 设置示例:
  1. // 启用 PVD 功能并设置阈值为 2.7V
  2. PWR_PVDLevelConfig(PWR_PVDLevel_2); // 设置 PVD 阈值为 2.7V
  3. PWR_PVDCmd(ENABLE); // 启用 PVD
复制代码
总结

PVD(可编程电压电测器)是一个非常紧张的功能,它可以或许监测电源电压并掩护体系在电压非常时接纳相应步伐。通过设置阈值,可以在电压降到设定值以下时触发制止或复位,从而制止电压不稳固导致的体系错误或数据丢失。


低功耗模式:


STM32 的低功耗模式概述

在 STM32 微控制器中,低功耗模式重要有以下几种:

  • 就寝模式(Sleep Mode)
  • 停机模式(Stop Mode)
  • 待机模式(Standby Mode)
1. 就寝模式(Sleep Mode)

就寝模式是 STM32 的最轻功耗模式,重要用于体系处于空闲状态时,但仍旧必要保持快速相应。
工作原理


  • 核心制止:在就寝模式下,CPU 核心制止工作,但 外设 仍旧可以正常工作。
  • 时钟源选择:外设可以利用差别的时钟源(比方 HSE、HSI、PLL等),而时钟源仍旧在运行,以是相应时间较短。
功耗


  • 功耗较低,但不如其他模式低,由于外设时钟仍旧保持运行。
  • 用于必要保持外设运行但不必要 CPU 实行盘算使命的场景,如时钟信号天生、通讯协议期待等。
叫醒方式


  • 通过制止或外部事故叫醒,比方 GPIO 引脚状态厘革、外部制止、定时器制止等。

  • 进入方式:通过设置 SLEEP-NOW 或 SLEEP-ON-EXIT 进入。SLEEP-NOW 表现立刻进入就寝模式,SLEEP-ON-EXIT 则是在当前指令实行完后进入就寝模式。
  • 叫醒:任何制止可以叫醒就寝模式,叫醒事故会触发 CPU 和其他时钟规复正常。
  • 电源影响

    • 对于 1.8V 地区:CPU 的时钟被停息,但其他时钟和 ADC 的时钟不受影响。
    • 对于 VDD 地区:时钟保持开启,电压调治器保持开启,体系可以或许快速规复。
           
2. 停机模式(Stop Mode)

停机模式是一种较低功耗的模式,实用于必要尽大概节流电池能量的场景。
工作原理


  • CPU 核心制止:与就寝模式类似,CPU 制止工作。
  • 外设关闭:停机模式下,体系时钟源制止,大部门外设制止工作。但是一些 特定外设(如 RTC)仍旧可以工作。
  • 内部时钟关闭:在此模式下,主时钟源和 PLL 被关闭,体系进入极低功耗状态。
功耗


  • 功耗进一步低沉,但必要较长的叫醒时间,由于时钟必要重新启动。
叫醒方式


  • 通过外部制止、定时器制止、RTC 制止等事故叫醒。
  • 叫醒速率相对较快,但仍旧必要一些时间来重新启动时钟和外设。


  • 进入方式:通过设置 PDDS 和 SLEEPDEEP 位进入。在此模式下,CPU 核心制止工作,整个体系制止全部运动,进入低功耗状态。
  • 叫醒:外部事故大概 WKUP 引脚触发时可以叫醒。
  • 电源影响

    • 对于 1.8V 地区:停机模式下,全部时钟都被关闭。
    • 对于 VDD 地区:关闭 HSI 和 HSE 振荡器,电压调治器关闭,体系处于低功耗状态,叫醒时必要肯定时间规复。
           
3. 待机模式(Standby Mode)

待机模式是 STM32 微控制器的 最低功耗模式,实用于装备长时间处于休眠状态,但必要包管某些功能(如 RTC、备份寄存器)一连工作。
工作原理


  • CPU 和全部外设制止工作:与停机模式差别,待机模式下 CPU 和全部外设(包罗内部时钟源)都制止工作,险些全部模块都被关闭。
  • 保持最低功耗:只有一些核心模块(如 RTC、低速外部振荡器 LSE、备份寄存器)继承工作。
功耗


  • 最低功耗,得当长时间待机的应用场景。
  • 叫醒时间较长,通常在 几毫秒几十毫秒
叫醒方式


  • 叫醒可以通过 外部制止RTC复位 叫醒。
  • 由于必要重新启动时钟,叫醒过程相对较慢。


  • 进入方式:通过设置 PDDS 和 SLEEPDEEP 位进入,联合 WKUP 引脚触发。
  • 叫醒:通过外部制止,WKUP 引脚大概 NRST 引脚触发时可以规复。
  • 电源影响

    • 对于 1.8V 地区:完全关闭全部时钟。
    • 对于 VDD 地区:关闭 HSI 和 HSE 振荡器,电压调治器关闭,体系进入最低功耗状态。
           
PWR 低功耗模式的选择和设置

在 STM32 中,可以通过 PWR 控制寄存器来设置和启用差别的低功耗模式。具体的选择取决于体系的需求:必要较低的功耗还是较短的相应时间。
设置步调


  • 选择低功耗模式:根据应用需求选择就寝模式、停机模式或待机模式。
  • 设置外设:设置是否启用必要保存工作的外设(如 RTC、外部制止等)。
  • 使能相应的模式:通过 PWR_CR 寄存器设置并使能所选的低功耗模式。
  • 叫醒设置:设置叫醒条件,比方定时器制止、外部制止等。
示例代码(进入就寝模式)
  1. // 配置 STM32 进入睡眠模式
  2. void Enter_Sleep_Mode(void)
  3. {
  4.     // 禁用不必要的外设时钟,降低功耗
  5.     // 使能睡眠模式
  6.     PWR_EnterSleepMode(PWR_SLEEPEntry_WFI);
  7. }
复制代码
示例代码(进入停机模式)
  1. // 配置 STM32 进入停机模式
  2. void Enter_Stop_Mode(void)
  3. {
  4.     // 禁用不必要的外设时钟,进入停机模式
  5.     PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
  6. }
复制代码
示例代码(进入待机模式)
  1. // 配置 STM32 进入待机模式
  2. void Enter_Standby_Mode(void)
  3. {
  4.     // 进入待机模式
  5.     PWR_EnterSTANDBYMode();
  6. }
复制代码
总结


  • 就寝模式 是最轻的低功耗模式,体系会制止 CPU 核心的工作,但其他外设时钟和 ADC 仍旧工作,叫醒速率较快。
  • 停机模式 可以关闭更多的外设时钟,到达更低的功耗,但叫醒速率较慢。
  • 待机模式 是最低功耗模式,险些全部的时钟和外设都关闭,叫醒时间最慢。






3. 备份域控制:
   - 管理备份域(Backup Domain)的电源,包罗备份寄存器(Backup Registers)和 RTC(及时时钟)。
   - 在 V<sub>BAT</sub> 模式下,备份域可以由电池供电。
4. 叫醒机制:
   - 提供多种叫醒源(如外部制止、RTC 闹钟等),用于从低功耗模式叫醒。
5. 电源电压监测:
   - 提供电源电压监测功能(PVD,Programmable Voltage Detector),用于检测电源电压是否低于设定阈值。

PWR 外设的重要寄存器
1. PWR_CR(Power Control Register):
   - 用于设置低功耗模式、电压调治和电源电压监测。
2. PWR_CSR(Power Control/Status Register):
   - 用于查察电源状态(如是否处于低功耗模式)和扫除叫醒标记。
3. PWR_CR2(Power Control Register 2):
   - 用于设置动态电压调治和备份域控制。
4. PWR_CR3(Power Control Register 3):
   - 用于设置叫醒引脚和低功耗模式下的外设运动。
5. PWR_CR4(Power Control Register 4):


 
1修改主频: 通过在system_stm32f10x.c文件中修改主频参数来调解时间
  1. OLED_Init();
  2.         OLED_ShowString (1,1,"sysytemclock:");
  3.         OLED_ShowNum (2,1,SystemCoreClock ,8);
  4.                 while(1)
  5.                 {
  6.     OLED_ShowString (3,1,"ruing");
  7.                     delay_ms (500);
  8.   OLED_ShowString (3,1,"     ");
  9.   delay_ms (500);                       
  10.                        
  11.     }
  12.    
  13. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
  14. /* #define SYSCLK_FREQ_HSE    HSE_VALUE */
  15. #define SYSCLK_FREQ_24MHz  24000000
  16. #else
  17. /* #define SYSCLK_FREQ_HSE    HSE_VALUE */
  18. /* #define SYSCLK_FREQ_24MHz  24000000 */
  19. /*#define SYSCLK_FREQ_36MHz  36000000 */
  20. /* #define SYSCLK_FREQ_48MHz  48000000 */
  21. /* #define SYSCLK_FREQ_56MHz  56000000 */
  22. #define SYSCLK_FREQ_72MHz  72000000
  23. #endif
复制代码
2就寝模式下的利用串口收发数据并叫醒就寝模式:
1初始化USART
2开启继承制止使能
3在主函数whie(1)循环内里继承上位机发送返来的数据
4在OLDE上体现数据,循环体现"runing"
4进入就寝模式后再体现数据,循环体现"runing"
  1. uint32_t srambuff[SIZEOF];
  2. uint16_t  num;
  3. float distance;
  4. int main(void){
  5.     uint8_t  Data;
  6.           Usart_Init();
  7.     OLED_Init();
  8.           OLED_ShowString (1,1,"RXData:");
  9.                 while(1)
  10.                 {
  11.                         uint16_t Datat;
  12.      if(Check_myflag()==1){
  13.                           Data=USART_Return();
  14.                          serval_sendbyte( Data);
  15.                          OLED_ShowNum (1,8, Data,2);
  16.                  }
  17.                         OLED_ShowString (2,1,"ruing");
  18.                          delay_ms(100);
  19.                         OLED_ShowString (2,1,"   ");
  20.                          delay_ms(100);
  21.                         __WFI ();
  22.                          
  23.                  }
  24.                        
  25.     }
  26. #define __enable_fault_irq                __enable_fiq
  27. #define __disable_fault_irq               __disable_fiq
  28. #define __NOP                             __nop
  29. #define __WFI                             __wfi
  30. #define __WFE                             __wfe
  31. #define __SEV                             __sev
  32. #define __ISB()                           __isb(0)
  33. #define __DSB()                           __dsb(0)
  34. #define __DMB()                           __dmb(0)
  35. #define __REV                             __rev
  36. #define __RBIT                            __rbit
  37. #define __LDREXB(ptr)                     ((unsigned char ) __ldrex(ptr))
  38. #define __LDREXH(ptr)                     ((unsigned short) __ldrex(ptr))
  39. #define __LDREXW(ptr)                     ((unsigned int  ) __ldrex(ptr))
  40. #define __STREXB(value, ptr)              __strex(value, ptr)
  41. #define __STREXH(value, ptr)              __strex(value, ptr)
  42. #define __STREXW(value, ptr)              __strex(value, ptr)
  43. uint16_t  GEtDatat;
  44. uint16_t  myflag;
  45. void Usart_Init()
  46. {
  47.         //配置GPIO和USART的时钟
  48.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
  49.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
  50.          //配置关于USART的TX的GPIO结构体
  51.          GPIO_InitTypeDef usartgpio_Initsturt;
  52.          usartgpio_Initsturt.GPIO_Mode =GPIO_Mode_AF_PP ;
  53.          usartgpio_Initsturt .GPIO_Pin =GPIO_Pin_9 ;
  54.          usartgpio_Initsturt .GPIO_Speed =GPIO_Speed_50MHz;
  55.          GPIO_Init(GPIOA,&usartgpio_Initsturt);
  56.           //配置关于USART的RX的GPIO结构体
  57.          usartgpio_Initsturt .GPIO_Mode = GPIO_Mode_IN_FLOATING;
  58.          usartgpio_Initsturt .GPIO_Pin = GPIO_Pin_10 ;
  59.         GPIO_Init(GPIOA,&usartgpio_Initsturt);
  60.          //配置usart的结构体
  61.          USART_InitTypeDef usart_Initsturt;
  62.          usart_Initsturt .USART_BaudRate =9600;
  63.          usart_Initsturt .USART_HardwareFlowControl =USART_HardwareFlowControl_None;
  64.          usart_Initsturt .USART_Mode = USART_Mode_Rx |USART_Mode_Tx  ;
  65.          usart_Initsturt .USART_Parity = USART_Parity_No ;  
  66.          usart_Initsturt .USART_StopBits =USART_StopBits_1;
  67.          usart_Initsturt .USART_WordLength =USART_WordLength_8b ;
  68.          USART_Init(USART1, &usart_Initsturt);
  69.          //USART_ITConfig(USART1, USART_IT_RXNE,ENABLE );//NVIC中断输出使能
  70.    //NVIC_Configuration();//配置NVIC中断使能函数
  71.          USART_Cmd(USART1, ENABLE);//使能USART函数
  72.         USART_ITConfig(USART1,USART_IT_RXNE, ENABLE );
  73. }
  74.    void NVIC_Configuration()
  75.          {
  76.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  77.                  NVIC_InitTypeDef NVIC_INit;
  78.                  NVIC_INit.NVIC_IRQChannel =USART1_IRQn  ;
  79.                  NVIC_INit .NVIC_IRQChannelCmd =ENABLE ;
  80.                  NVIC_INit .NVIC_IRQChannelPreemptionPriority =1;
  81.                  NVIC_INit .NVIC_IRQChannelSubPriority =1;
  82.                  NVIC_Init( &NVIC_INit);//初始化NVIC
  83.          }
  84.          
  85.          void serval_sendbyte(uint8_t Data)
  86.          {
  87.                  USART_SendData( USART1,Data);
  88.                  while(USART_GetITStatus(USART1,USART_IT_TXE)==RESET );
  89.                  
  90.                  
  91.          }uint16_t  USART_Return(void )
  92.         {
  93.                 return  GEtDatat;
  94.                
  95.         }
  96.        
  97.        
  98. uint16_t  Check_myflag()
  99. {
  100.         if( myflag==1)
  101.         {
  102.                 myflag=0;
  103.                 return 1;
  104.         }
  105.           else{
  106.                 return 0;
  107.                 }
  108. }
  109.        
复制代码
3低功耗停机模式下利用外部制止对对射式传感器举行数据收罗并叫醒该模式:

1初始化外部制止以及对应引脚的GPIO
2编写制止服务函数,对对射式传感器举行数据收罗,并返接纳罗的值
3初始化PWR时钟,设置PWR进入低功耗停机模式,
4在主函数内里举行数据收罗体如今OLED屏上并叫醒低功耗模式观察征象
  1. float distance;
  2. int main(void){
  3.     uint8_t  Data;
  4.           Usart_Init();
  5.     OLED_Init();
  6.          exti_sensior_Init();
  7.         RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR, ENABLE);
  8.           OLED_ShowString (1,1,"Count:");
  9.                 while(1)
  10.                 {
  11.                        
  12.        
  13.                
  14.                          OLED_ShowNum (1,8,  Count_Set(),2);
  15.                  
  16.                         OLED_ShowString (2,1,"ruing");
  17.                          delay_ms(100);
  18.                         OLED_ShowString (2,1,"   ");
  19.                          delay_ms(100);
  20.                        
  21.                          PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);
  22.                  }
  23.                        
  24.     }
复制代码
4利用RTC叫醒PWR低功耗待机模式:

  • 初始化 RTC:设置 RTC 时钟源,设置时间和日期,使能 RTC 闹钟功能。
  • 设置 PWR:使能 PWR 和 BKP 外设时钟,设置 RTC 闹钟时间,进入待机模式。
  • RTC 闹钟制止处理处罚:当 RTC 闹钟触发时,叫醒体系。
    1. #include "stm32f10x.h"
    2. // 函数声明
    3. void RTC_Configuration(void);
    4. void NVIC_Configuration(void);
    5. void PWR_Configuration(void);
    6. // 主函数
    7. int main(void)
    8. {
    9.     // 配置NVIC
    10.     NVIC_Configuration();
    11.     // 配置RTC
    12.     RTC_Configuration();
    13.     // 配置PWR
    14.     PWR_Configuration();
    15.     while (1)
    16.     {
    17.         // 进入待机模式
    18.         PWR_EnterSTANDBYMode();
    19.     }
    20. }
    21. // 配置RTC
    22. void RTC_Configuration(void)
    23. {
    24.     NVIC_InitTypeDef NVIC_InitStructure;
    25.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    26.     PWR_BackupAccessCmd(ENABLE);
    27.     // 复位备份区域
    28.     BKP_DeInit();
    29.     // 使能LSE
    30.     RCC_LSEConfig(RCC_LSE_ON);
    31.     while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
    32.     {
    33.     }
    34.     // 选择RTC时钟源
    35.     RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
    36.     RCC_RTCCLKCmd(ENABLE);
    37.     // 等待RTC寄存器同步
    38.     RTC_WaitForSynchro();
    39.     // 等待最近一次对RTC寄存器的写操作完成
    40.     RTC_WaitForLastTask();
    41.     // 设置RTC预分频值
    42.     RTC_SetPrescaler(32767);
    43.     RTC_WaitForLastTask();
    44.     // 配置RTC闹钟中断
    45.     NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
    46.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    47.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    48.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    49.     NVIC_Init(&NVIC_InitStructure);
    50.     // 使能RTC闹钟中断
    51.     RTC_ITConfig(RTC_IT_ALR, ENABLE);
    52.     RTC_WaitForLastTask();
    53.     // 设置RTC闹钟时间(这里设置为10秒后)
    54.     RTC_SetAlarm(RTC_GetCounter() + 10);
    55.     RTC_WaitForLastTask();
    56. }
    57. // 配置NVIC
    58. void NVIC_Configuration(void)
    59. {
    60.     NVIC_InitTypeDef NVIC_InitStructure;
    61.     // 配置PVD中断
    62.     NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
    63.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    64.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    65.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    66.     NVIC_Init(&NVIC_InitStructure);
    67.     // 配置RTC闹钟中断
    68.     NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
    69.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    70.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    71.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    72.     NVIC_Init(&NVIC_InitStructure);
    73. }
    74. // 配置PWR
    75. void PWR_Configuration(void)
    76. {
    77.     // 使能PWR和BKP外设时钟
    78.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    79.     // 允许访问备份区域
    80.     PWR_BackupAccessCmd(ENABLE);
    81. }
    82. // RTC闹钟中断处理函数
    83. void RTCAlarm_IRQHandler(void)
    84. {
    85.     if (RTC_GetITStatus(RTC_IT_ALR) != RESET)
    86.     {
    87.         // 清除RTC闹钟中断标志
    88.         RTC_ClearITPendingBit(RTC_IT_ALR);
    89.         RTC_WaitForLastTask();
    90.         // 清除PWR唤醒标志
    91.         PWR_ClearFlag(PWR_FLAG_WU);
    92.     }
    93. }
    复制代码

  • RTC_Configuration函数

    • 使能 PWR 和 BKP 外设时钟,并答应访问备份地区。
    • 复位备份地区,使能 LSE(低速外部时钟)作为 RTC 时钟源。
    • 设置 RTC 预分频值,使 RTC 时钟频率为 1Hz。
    • 设置 RTC 闹钟制止,设置闹钟时间为当前时间加上 10 秒。
           
  • NVIC_Configuration函数

    • 设置 PVD 和 RTC 闹钟制止的优先级,并使能这两个制止。
           
  • PWR_Configuration函数

    • 使能 PWR 和 BKP 外设时钟,答应访问备份地区。
           
  • RTCAlarm_IRQHandler函数

    • 处理处罚 RTC 闹钟制止,扫除制止标记和 PWR 叫醒标记。
           
  • main函数

    • 调用上述设置函数,然后进入待机模式,期待 RTC 闹钟制止叫醒。
           

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表