当前位置: 首页 > news >正文

stm32之PWR、WDG

目录

  • 1.PWR
    • 1.1 简介
    • 1.2 电源框图
    • 1.3 上电复位和掉电复位
    • 1.4 可编程电压监测器
    • 1.5 低功耗模式
      • 1.5.1 模式选择
      • 1.5.2 睡眠模式
      • 1.5.3 停止模式
      • 1.5.4 待机模式
    • 1.6 实验
      • 1.6.1 修改主频
      • 1.6.2 睡眠模式+串口发送+接收
      • 1.6.3 停止模式+对射式红外传感器计次
      • 1.6.4 待机模式+实时时钟
  • 2.看门狗
    • 2.1 简介
    • 2.2 IWDG
    • 2.2 WWDG
  • 3.实验
    • 3.1 独立看门狗
    • 3.2 窗口看门狗

img

1.PWR

1.1 简介

PWR(Power Control)电源控制

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

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

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

1.2 电源框图

img

STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源,关于电源备份区域手册中的描述如下:
img

至于VDDA和VSSA则是和独立的A/D转换器有关,为了提高转换的精确度,ADC使用一个独立的电源供电,过滤和屏蔽来自印刷电路板上的毛刺干扰。

  • 为了确保输入为低压时获得更好精度,用户可以连接一个独立的外部参考电压ADC到**VREF+VREF-**脚上。在VREF+的电压范围为2.4V~VDDA。 — 100脚和144脚封装
  • 没有VREF+和VREF-引脚,他们在芯片内部与ADC的电源(VDDA)和地(VSSA)相联。 — 64脚或更少脚封装

1.3 上电复位和掉电复位

img

STM32内部有一个完整的上电复位(POR)和掉电复位(PDR)电路,当供电电压达到2V时系统既能正常工作。

当VDD/VDDA低于指定的限位电压VPOR/VPDR时,系统保持为复位状态,而无需外部复位电路。关于上电复位和掉电复位的细节参考数据手册的电气特性部分。

复位后调节器总是使能的。根据应用方式它以3种不同的模式工作。

  • 运转模式:调节器以正常功耗模式提供1.8V电源(内核,内存和外设)。
  • 停止模式:调节器以低功耗模式提供1.8V电源,以保存寄存器和SRAM的内容。
  • 待机模式:调节器停止供电。除了备用电路和备份域外,寄存器和SRAM的内容全部丢失。

1.4 可编程电压监测器

img

功能
PVD 用于监控芯片的供电电压 VDD,通过设定阈值检测电压的变化。当 VDD 降到阈值以下或者回升至阈值以上时,会触发中断,用户可以在中断中实现相应的电源管理策略。

PVD 的关键特性

  • 支持可编程阈值电压(通过寄存器配置)。
  • 提供下降和上升两个方向的电压监测。
  • 可触发中断,用于执行例如保存数据、关闭外设或进入低功耗模式等任务。

配置步骤

  1. 启用 PWR 模块时钟(通过 RCC_APB1PeriphClockCmd 函数)。
  2. 配置 PVD 的阈值电压。
  3. 启用 PVD 中断。
  4. 在中断服务程序中处理电压异常情况。

img

#include "stm32f10x.h"void PVD_Config(void) {// 1. 启用 PWR 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// 2. 配置 PVD 阈值为 2.9VPWR_PVDLevelConfig(PWR_PVDLevel_2V9);// 3. 启用 PVD 功能PWR_PVDCmd(ENABLE);// 4. 配置中断NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line16; // PVD LineEXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}// 中断服务函数
void PVD_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line16) != RESET) {// 用户处理代码,例如保存数据或报警EXTI_ClearITPendingBit(EXTI_Line16); // 清除中断标志}
}

1.5 低功耗模式

img

1.5.1 模式选择

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

img

1.5.2 睡眠模式

适合应用于短暂的任务等待等CPU暂时不需要工作但是外设仍需要运行的场景。

特点

  • CPU 停止工作,但外设时钟继续运行。
  • 功耗较低,同时可以快速恢复工作。
  • 适用于需要短时间挂起的任务。

进入睡眠模式:

  • 通过执行WFI或WFE指令进入睡眠状态。根据Cortex™-M3系统控制寄存器中的SLEEPONEXIT位的值,有两种选项可用于选择睡眠模式进入机制:

    • SLEEP-NOW:如果SLEEPONEXIT位被清除,当WRI或WFE被执行时,微控制器立即进入睡眠模式。
    • SLEEP-ON-EXIT:如果SLEEPONEXIT位被置位,系统从最低优先级的中断处理程序中退出时,微控制器就立即进入睡眠模式。
  • 在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。

退出睡眠模式:

  • 如果执行WFI指令进入睡眠模式,任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒。

  • 如果执行WFE指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。唤醒事件可以通过下述方式产生:

    • 在外设控制寄存器中使能一个中断,而不是在NVIC(嵌套向量中断控制器)中使能,并且在Cortex-M3系统控制寄存器中使能SEVONPEND位。当MCU从WFE中唤醒后,外设的中断挂起位和外设的NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)必须被清除。
    • 配置一个外部或内部的EXIT线为事件模式。当MCU从WFE中唤醒后,因为与事件线对应的挂起位未被设置,不必清除外设的中断挂起位或外设的NVIC中断通道挂起位。
  • 该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。

img

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

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

代码示例:

void Enter_SleepMode(void) {// 配置睡眠模式SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk; // 清除 SLEEPDEEP 位__WFI(); // 进入睡眠模式,等待中断唤醒
}

1.5.3 停止模式

适合长时间不需要外设和 CPU 工作,但需保存数据的场景,例如遥控器的待机状态。

停止模式是在 Cortex-M3 深度睡眠模式(Deep Sleep Mode) 的基础上结合外设时钟控制机制实现的一种低功耗模式。在停止模式下,芯片的主要特性如下:

  • 功耗极低:停止模式大幅降低芯片的功耗,适合中等长度的低功耗待机。

  • 电压调节器可配置

    • 正常模式:内部调节器持续提供标准电压。
    • 低功耗模式(通过设置 PWR_CR 寄存器的 LPDS 位):降低调节器电流消耗,进一步节能。
  • 停止所有时钟

    • 1.8V 供电区域的所有时钟停止。
    • 主振荡器(HSE RC)、内部振荡器(HSI RC)、和 PLL 被禁用。
  • SRAM 和寄存器内容被保留:不影响程序运行状态或数据存储。

  • I/O 状态保持:所有 GPIO 引脚维持在进入停止模式前的状态。

特点

  • CPU 和外设时钟全部停止,仅保留必要的供电模块(如 SRAM、RTC)。
  • 系统功耗大幅降低,恢复需要一定时间。
  • 可通过 EXTI 或 RTC 唤醒。

在进入停止模式前,确保以下任务已经完成:

  1. 闪存编程完成:如果正在写入 Flash 内存,需等待操作结束后才能进入停止模式。
  2. APB 访问结束:正在进行的 APB 总线访问也需完成。

在停止模式中,可以通过独立的控制位启用或禁用以下功能:

  1. 独立看门狗(IWDG)
    • 启用方式:通过写入看门狗键寄存器(IWDG->KR)或硬件设置。
    • 注意:一旦启用看门狗,除非系统复位,否则无法停止。
  1. 实时时钟(RTC)
    • 设置方式:通过 RCC_BDCR 寄存器的 RTCEN 位启用 RTC。
    • RTC 可以用作唤醒源,在停止模式中继续运行。
  1. 低速内部振荡器(LSI RC)
    • 设置方式:通过 RCC_CSR 寄存器的 LSION 位启用。
  1. 低速外部振荡器(LSE)
    • 设置方式:通过 RCC_BDCR 寄存器的 LSEON 位启用。
  1. ADC 和 DAC 功耗
    • ADC:通过设置 ADC_CR2 寄存器的 ADON 位为 0 来关闭 ADC。
    • DAC:通过设置 DAC_CR 寄存器的 ENx 位为 0 来关闭 DAC。
    • 注意:在进入停止模式前必须关闭这两个模块,否则仍然会消耗电流。

进入停止模式:

#include "stm32f10x.h"void Enter_StopMode(void) {// 1. 启用 PWR 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// 2. 配置 PWR_CR 寄存器的低功耗模式PWR->CR |= PWR_CR_LPDS; // 启用低功耗模式// 3. 进入停止模式PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);SystemInit();	//唤醒后,要重新配置时钟}

退出停止模式:

#include "stm32f10x.h"void EXTI0_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line0) != RESET) {// 清除中断标志EXTI_ClearITPendingBit(EXTI_Line0);}
}void Wakeup_Config(void) {// 配置 EXTI0 为唤醒源RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);// 配置 NVICNVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

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

如果在停止模式中启用了低功耗电压调节器(LPDS),唤醒后会有额外的启动延迟。如果保持电压调节器处于正常模式,则启动时间更短,但功耗更高。

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

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

img

1.5.4 待机模式

特点:

  • 极低功耗:关闭电压调节器,断开主供电区域,仅保留备份寄存器和待机电路供电。

  • 数据丢失

    • SRAM 和大部分寄存器内容会丢失。
    • 仅备份寄存器内容保留。
  • 关闭时钟

    • 主振荡器(HSE RC)、内部振荡器(HSI RC)、PLL 和 Cortex-M3 时钟全部断开。
  • I/O 状态

    • 所有 GPIO 引脚处于高阻态(浮空输入),特殊情况除外(如复位引脚和唤醒引脚)。
    • 复位引脚(NRST):始终有效。
    • 防篡改(TAMPER)引脚:在配置为校准或防侵入模式时有效。
    • 唤醒(WKUP)引脚:在被设置为唤醒功能时有效。
  • 调试模式支持:通过 DBGMCU_CR 配置,可以在低功耗模式下进行调试。

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

进入待机模式的步骤:

  • 设置 Cortex-M3 的深睡眠模式

    • 在 Cortex-M3 系统控制寄存器(SCB->SCR)中设置 SLEEPDEEP 位。
  • 设置电源控制寄存器(PWR_CR)

    • 设置 PDDS 位:进入待机模式。
    • 清除 PWR_CSR 寄存器中的 WUF(唤醒标志)位。
  • 执行 WFI/WFE 指令

    • 调用 __WFI()(等待中断)或 __WFE()(等待事件)。
#include "stm32f10x.h"void Enter_StandbyMode(void) {// 启用 PWR 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// 清除唤醒标志位PWR->CSR &= ~PWR_CSR_WUF;// 设置进入待机模式PWR->CR |= PWR_CR_PDDS;// 设置深度睡眠模式SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;// 执行等待中断指令,进入待机模式__WFI();
}

待机模式中的功能选择:

  • 独立看门狗(IWDG)

    • 设置方式:通过写入 IWDG->KR 或硬件启动看门狗。
    • 特点:一旦启动,无法停止,除非系统复位。
  • 实时时钟(RTC)

    • 设置方式:通过 RCC_BDCR 寄存器的 RTCEN 位启用 RTC。
    • RTC 可在待机模式中继续运行,用于唤醒或计时。
  • 低速内部 RC 振荡器(LSI RC)

    • 设置方式:通过 RCC_CSR 寄存器的 LSION 位启用。
  • 低速外部晶振(LSE)

    • 设置方式:通过 RCC_BDCR 寄存器的 LSEON 位启用。

待机模式的唤醒源和唤醒后的特性:

  • WKUP 引脚的上升沿
    外部唤醒引脚触发。
  • RTC 闹钟事件的上升沿
    RTC 可在待机模式中继续运行并触发事件。
  • NRST 引脚的外部复位
    系统复位事件。
  • IWDG 复位
    独立看门狗触发复位。
  1. 复位行为
    • 唤醒后,系统行为等同于复位(如采样启动模式引脚、执行复位向量等)。
    • 唯一例外:PWR_CSR 中的状态位保留,用于指示待机唤醒原因。
  1. 启动延时
    • 唤醒时电压调节器需要启动时间,会引入一定延迟。
#include "stm32f10x.h"void Configure_RTC_Wakeup(void) {// 启用 PWR 和 BKP 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);// 允许访问备份域PWR_BackupAccessCmd(ENABLE);// 启用 LSE 作为 RTC 时钟源RCC_LSEConfig(RCC_LSE_ON);while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);// 配置 RTC 中断RTC_ITConfig(RTC_IT_SEC, ENABLE);// 配置 RTC 唤醒事件EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line17; // RTC 唤醒线EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);// 配置 NVIC 中断NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void RTC_IRQHandler(void) {if (RTC_GetITStatus(RTC_IT_SEC) != RESET) {// 清除中断标志RTC_ClearITPendingBit(RTC_IT_SEC);}
}

1.6 实验

1.6.1 修改主频

📎13-1 修改主频.zip

img

主要是通过对Start文件夹中的system_stm32f10x.c进行修改实现对主频进行修改:

/*!< Uncomment the line corresponding to the desired System clock (SYSCLK)frequency (after reset the HSI is used as SYSCLK source)IMPORTANT NOTE:============== 1. After each device reset the HSI is used as System clock source.2. Please make sure that the selected System clock doesn't exceed your device'smaximum frequency.3. If none of the define below is enabled, the HSI is used as System clocksource.4. The System clock configuration functions provided within this file assume that:- For Low, Medium and High density Value line devices an external 8MHz crystal is used to drive the System clock.- For Low, Medium and High density devices an external 8MHz crystal isused to drive the System clock.- For Connectivity line devices an external 25MHz crystal is used to drivethe System clock.If you are using different crystal you have to adapt those functions accordingly.*/
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */#define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
#define SYSCLK_FREQ_36MHz  36000000
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
/* #define SYSCLK_FREQ_72MHz  72000000 */
#endif

在这里是选择了36MHz的主频,而修改后涉及到使用主频的地方都是需要进行修改的,比如System文件夹中的delay文件中的相关延迟函数Delay_us可能需要做出修改:

img

img


关于文件的只读属性修改:

img

需要注意的是,如果文件出现了钥匙,说明该文件为只读文件,需要设置为可修改:

img

1.6.2 睡眠模式+串口发送+接收

📎13-2 睡眠模式+串口发送+接收.zip

img

User:

  • 📎main.c

Hardware:

  • 📎OLED.c📎OLED.h📎OLED_Font.h📎Serial.c📎Serial.h

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

📎13-3 停止模式+对射式红外传感器计次.zip

img

User:

  • 📎main.c

Hardware:

  • 📎OLED.c📎OLED.h📎OLED_Font.h📎CountSensor.h📎CountSensor.c

唤醒的方式为exit外部中断,注意和上面的串口实验区分,睡眠模式唤醒的方式是NIVC中断,也就是任意的中断。

当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟。按下复位键后可以发现”Running“的打印速度变慢了,是因为退出了停止模式,HSI被选为了系统时钟,为8MHz。而未退出前,也就是程序运行的时候是已经默认调用了SystemInit()函数,这个函数中又调用了SetSysClock()函数,会将系统的时钟频率设置为72MHz(取决于system_stm32f10x.c中所设置的主频,这里默认是为72MHz)。因此时钟频率减少,会发现”Running“显示的速度为未复位前的1/9

所以一般都会在PWR_EnterSTOPMode后面再加一个SystemInit()函数,退出停止模式后恢复原来的主频

1.6.4 待机模式+实时时钟

📎13-4 待机模式+实时时钟.zip

img

User:

  • 📎main.c

Hardware:

  • 📎OLED.c📎OLED.h📎OLED_Font.h

System:

  • 📎MyRTC.c📎MyRTC.h

需要注意的是退出待机模式后代码是重新开始运行的。

2.看门狗

如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG。

2.1 简介

WDG(Watchdog)看门狗

看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性

看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号

STM32内置两个看门狗:

  • 独立看门狗(IWDG):独立工作,对时间精度要求较低
  • 窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用

2.2 IWDG

img

IWDG键寄存器:

  • 键寄存器本质上是控制寄存器,用于控制硬件电路的工作。在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率

  • WDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。

  • 状态寄存器指示预分频值和递减计数器是否正在被更新。

  • img

    • 对于这些值,标准库中已经用相关的宏定义标注了,并且也有相关的函数可以去进行设置,具体的自行去看库函数手册

超时时间:

  • 超时时间:TIWDG = TLSI × PR预分频系数 × (RL + 1)

    • 其中:TLSI = 1 / FLSI
  • img

2.2 WWDG

窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

主要特性:

  • 可编程的自由运行递减计数器

  • 条件复位

    • 当递减计数器T[6:0]的值小于0x40,(若看门狗被启动)则产生复位。
    • 递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位
  • 如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以被用于重装载计数器以避免WWDG复位。

  • 定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位

img

如果看门狗被启动(WWDG_CR寄存器中的WDGA位被置’1’), 并且当7位(T[6:0])递减计数器从0x40翻转到0x3F(T6位清零)时,则产生一个复位。如果软件在计数器值大于窗口寄存器中的数值时重新装载计数器,将产生一个复位。

超时时间:

img

窗口时间:

  • img

3.实验

3.1 独立看门狗

📎14-1 独立看门狗.zip

img

User:

  • 📎main.c

其中:

/*IWDG初始化*/IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);	//独立看门狗写使能IWDG_SetPrescaler(IWDG_Prescaler_16);			//设置预分频为16IWDG_SetReload(2499);							//设置重装值为2499,独立看门狗的超时时间为1000msIWDG_ReloadCounter();							//重装计数器,喂狗IWDG_Enable();									//独立看门狗使能

设置的喂狗时间是1s,计算如下:

  • 40KHz的时钟频率,16分频后就是2500Hz,也就是一个脉冲是0.0004ms
  • 计数一次需要0.0004ms,那么设置计数器重装值为2499,也就是2500次,就会重置计数器,发送复位信号,1s的时间(0.0004 ms✖2500 = 1s)

img

想要计算出1000ms对应的RL,也就是计数次数,套公式去进行计算就行了,需要注意的是要再最短时间和最长时间的范围内才行,比如1000ms对于分频系数为4和8的不匹配。

3.2 窗口看门狗

📎14-2 窗口看门狗.zip

img

User:

  • 📎main.c

img

根据这个框图去进行设置

img

    /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);	//开启WWDG的时钟/*WWDG初始化*/WWDG_SetPrescaler(WWDG_Prescaler_8);			//设置预分频为8WWDG_SetWindowValue(0x40 | 21);					//设置窗口值,窗口时间为30msWWDG_Enable(0x40 | 54);							//使能并第一次喂狗,超时时间为50mswhile (1){Key_GetNum();								//调用阻塞式的按键扫描函数,模拟主循环卡死OLED_ShowString(4, 1, "FEED");				//OLED闪烁FEED字符串Delay_ms(20);								//喂狗间隔为20+20=40msOLED_ShowString(4, 1, "    ");Delay_ms(20);WWDG_SetCounter(0x40 | 54);					//重装计数器,喂狗}

WWDG_Enable使能窗口看门狗的时候,设置WWDG_CR寄存器的计数值为(0x40 | 21),其中40是对T[6]进行设置的,当CR的T[6:0]的值一直减少,直到T[6]的1翻转为0,就发送复位信号,也就是没有在时间内去进行的喂狗

WWDG_SetWindowValue设置的则是看门狗配置寄存器WWDG_CFR,设置的是30ms

也就是说喂狗的时间要在30ms到50ms内,如果超出50ms就看门狗复位。

需要注意:一旦复位,程序就会从从头开始重新执行

相关文章:

stm32之PWR、WDG

目录 1.PWR1.1 简介1.2 电源框图1.3 上电复位和掉电复位1.4 可编程电压监测器1.5 低功耗模式1.5.1 模式选择1.5.2 睡眠模式1.5.3 停止模式1.5.4 待机模式 1.6 实验1.6.1 修改主频1.6.2 睡眠模式串口发送接收1.6.3 停止模式对射式红外传感器计次1.6.4 待机模式实时时钟 2.看门狗…...

分布式任务调度XXL-Job

​ XXL-Job 是一款轻量级、分布式的任务调度平台&#xff0c;其核心设计解决了传统任务调度&#xff08;如Quartz&#xff09;在分布式场景下的‌任务分片‌、‌高可用‌、‌可视化管控‌等痛点。以下从原理、核心架构、应用场景、代码示例及关联中间件展开详解 一、主流任务…...

内存泄漏与OOM崩溃根治方案:JVM与原生内存池差异化排查手册

内存泄漏与OOM崩溃根治方案&#xff1a;JVM与原生内存池差异化排查手册 一、问题描述与快速解决方案 1. 核心问题分类 内存泄漏&#xff08;Memory Leak&#xff09; 现象&#xff1a;应用运行时间越长&#xff0c;内存占用持续攀升&#xff0c;GC回收效率下降&#xff0c;最…...

火山引擎发展初始

火山引擎是字节跳动旗下的云计算服务品牌&#xff0c;其云服务业务的启动和正式商业化时间线如下&#xff1a; 1. **初期探索&#xff08;2020年之前&#xff09;** 字节跳动在早期为支持自身业务&#xff08;如抖音、今日头条等&#xff09;构建了强大的基础设施和技术中…...

使用光标测量,使用 TDR 测量 pH 和 fF

时域反射计 &#xff08;TDR&#xff09; 是一种通常用于测量印刷电路板 &#xff08;PCB&#xff09; 测试试样和电缆阻抗的仪器。TDR 对于测量过孔和元件焊盘的电感和电容、探针尖端电容和电感&#xff0c;甚至寄生电感收发器耦合电容器也非常有用。这也是验证仿真或提取您自…...

mybatisplus 集成逻辑删除

一开始&#xff0c;没去查资料&#xff0c;后面要被AI气死了&#xff0c;先看它的的话 一开始&#xff0c;看ai的描述&#xff0c;我还以为&#xff0c;不需要改数据库&#xff0c;mybatis-puls自动拦截集成就可以实现逻辑删除&#xff0c;c&#xff0c;最后还是要给数据库加一…...

ABAP+旧数据接管的会计年度未确定

导资产主数据时&#xff0c;报错旧数据接管的会计年度未确定 是因为程序里面使用了下列函数AISCO_CALCULATE_FIRST_DAY&#xff0c;输入公司代码&#xff0c;获取会计年度&#xff0c;这个数据是在后台表T093C表中取数的&#xff0c;通过SE16N可以看到后台表数据没有数&#xf…...

KT148A语音芯片发码很难播放_将4脚对地一下再发正常,什么原因?

问题描述如下&#xff1a;您好&#xff0c;遇到一点问题请帮忙支持一下&#xff1a; KT148A 这颗芯片&#xff0c; 我们上电后发码很难触发播放&#xff0c; 但用镊子将4pin PB0对地短接触发一下&#xff0c;再发码就很正常&#xff0c;这是什么原因&#xff1f; 根据现象来看…...

【大模型】DeepResearcher:通用智能体通过强化学习探索优化

DeepResearcher&#xff1a;通过强化学习在真实环境中扩展深度研究 一、引言二、技术原理&#xff08;一&#xff09;强化学习与深度研究代理&#xff08;二&#xff09;认知行为的出现&#xff08;三&#xff09;模型架构 三、实战运行方式&#xff08;一&#xff09;环境搭建…...

SpringBoot 3.X 开发自己的 Spring Boot Starter 和 SpringBoot 2.x 的区别

SpringBoot 2.x 在模块中创建 src/main/resources/META-INF/spring.factories 文件 文件内容如下&#xff1a; org.springframework.boot.autoconfigure.EnableAutoConfiguration\com.xxx.xxx.yourfilejava1,\com.xxx.xxx.yourfilejava2 SpringBoot 3.x 在模块中创建 src/m…...

NY164NY165美光固态闪存NY166NY172

美光NY系列固态闪存深度解析&#xff1a;技术、体验与行业洞察 一、技术架构与核心特性解析 美光NY系列&#xff08;NY164/NY165/NY166/NY172&#xff09;作为面向企业级市场的固态闪存产品&#xff0c;其技术设计聚焦高可靠性与性能优化。从架构上看&#xff0c;该系列可能采…...

Spring Boot中HTTP连接池的配置与优化实践

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、HTTP连接池的核心价值 在微服务架构和分布式系统场景中&#xff0c;HTTP客户端频繁创建/断开连接会产生显著的性能损耗。通过连接池技术可以实现&#x…...

【docker】--镜像管理

文章目录 拉取镜像启动镜像为容器连接容器法一法二 保存镜像加载镜像镜像打标签移除镜像 拉取镜像 docker pull mysql:8.0.42启动镜像为容器 docker run -dp 8080:8080 --name container_mysql8.0.42 -e MYSQL_ROOT_PASSWORD123123123 mysql:8.0.42 连接容器 法一 docker e…...

Logisim实验--华科计算机组成原理(保姆级教程) 头歌-存储系统设计实验(汉字库存储芯片扩展实验、MIPS寄存器文件设计)

汉字库存储芯片扩展实验 电路一&#xff1a; 电路二&#xff1a;电路和译码器设置。 两个电路的分线器设计&#xff1a; 只要把电路正确连接就能提交了&#xff0c;但要看到正确的实验结果就想要进行如下操作&#xff1a; 打开参考电路&#xff0c;我要做的就是将每个存储器内…...

Hapi.js知识框架

一、Hapi.js 基础 1. 核心概念 企业级Node.js框架&#xff1a;由Walmart团队创建&#xff0c;现由社区维护 配置驱动&#xff1a;强调声明式配置而非中间件 插件架构&#xff1a;高度模块化设计 安全优先&#xff1a;内置安全最佳实践 丰富的生态系统&#xff1a;官方维护…...

Baklib知识中台架构与智能引擎实践

知识中台架构设计实践 在数字化转型进程中&#xff0c;Baklib基于企业级知识管理需求&#xff0c;构建了模块化分层架构的知识中台体系。该架构采用数据湖仓融合技术&#xff0c;通过统一元数据管理打通业务系统间的信息壁垒&#xff0c;形成覆盖数据采集、清洗、标注的全链路…...

传输层协议UDP

传输层 负责数据能够从发送端传输接收端 . 再谈端口号 端口号 (Port) 标识了一个主机上进行通信的不同的应用程序 ; 在 TCP/IP 协议中 , 用 " 源 IP", " 源端口号 ", " 目的 IP", " 目的端口号 ", " 协议号 " 这样一…...

在Java中实现Parcelable接口和Serializable接口有什么区别?

在 Java 中&#xff0c;Parcelable 和 Serializable 接口都用于对象的序列化和反序列化&#xff0c;但它们的实现方式、性能和使用场景有很大区别。以下是它们的核心对比&#xff1a; 1. 实现方式 Serializable 是 Java 原生接口&#xff0c;只需声明 implements Serializable…...

MinIO WebUI 页面使用

上传文件到桶&#xff0c;选择Share 如果桶是pulic权限&#xff0c;则可以有以下两种方式访问到该对象文件&#xff1a; http://ip:9001/api/v1/download-shared-object/aHR0cDovLzEyNy4wLjAuMTo5MDAwL3dhcmVob3VzZS9wYWltb24vRmxpbmstTG9nby5wbmc_WC1BbXotQWxnb3JpdGhtPUFXU…...

Python | Dashboard制作

运行环境&#xff1a;jupyter notebook (python 3.12.7) Pyecharts 1.安装pyecharts !pip install pyecharts 验证安装是否成功&#xff1a; from pyecharts import __version__ print("Pyecharts版本:", __version__) # 应显示1.x以上版本 2.运行基础版代码&am…...

视频编辑软件无限音频、视频、图文轨

威力导演APP的特色功能包括无限音频、视频、图文轨&#xff0c;以及上百种二/三维特技转场、音/视频滤镜和多种音视频混编输出。此外&#xff0c;它还支持实时高清HDV格式、模拟信号输出&#xff0c;并具有DV25、DVACM、DV、HDV输入和输出等功能。在视频编辑领域&#xff0c;威…...

HttpSession 的运行原理

HttpSession 的运行原理&#xff08;基于 Java Web&#xff09; HttpSession 是 Java Web 开发中用于在服务器端存储用户会话数据的机制&#xff0c;它的核心作用是跟踪用户状态&#xff08;如登录信息、购物车数据等&#xff09;。 1. HttpSession 的基本概念 会话&#xff0…...

Axure应用交互设计:表格跟随菜单移动效果(超长表单)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!本文如有帮助请订阅 Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:表格跟随菜单移动 主要内容:表格交互设计、动态面板嵌套、拖动时事件、移动动作 应用场景…...

Flannel vxlan模式的优缺点

VXLAN 模式的特点、优缺点 优点 高性能&#xff1a;VXLAN 利用内核态处理封装/解封装&#xff0c;性能优于用户态方案&#xff08;如 UDP&#xff09;&#xff0c;适合大规模集群。网络隔离&#xff1a;通过 VNI&#xff08;VXLAN Network Identifier&#xff0c;24 位&#…...

中电金信参编的国家标准《信息技术 中间件 消息中间件技术要求》正式发布

近日&#xff0c;国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告&#xff08;2025年第10号&#xff09;&#xff0c;GB/T 28168—2025《信息技术 中间件 消息中间件技术要求》国家标准正式发布&#xff0c;并将于2025年11月1日正式实施。中电金信作…...

AcroForm 格式化文本(域)字段

概述 Acrobat提供了两个事件(脚本位置)来处理文本字段格式化:Keystroke(更改)事件和 Format事件。这两个事件可以共同控制输入到字段中的数据的格式以及文本字段中显示数据的外观。本文中涉及的所有脚本以及更多示例都包含在FormattingExamples.pdf文件中。 Keystroke事…...

机器学习——聚类算法练习题

一、 随机创建不同二维数据集作为训练集 &#xff0c;并结合k-means算法将其聚类 &#xff0c;你可以尝试分别聚类不同数量的簇 &#xff0c;并观察聚类 效果&#xff1a; 聚类参数n_cluster传值不同 &#xff0c;得到的聚类结果不同 代码展示&#xff1a; from sklearn.da…...

U-BOOT

使用正点原子已经移植好的U-BOOT编译完成后拷贝到SD卡中烧写到板子上中&#xff0c;将开发板设为SD卡启动模式&#xff0c;上电启动开发板&#xff1b;打开 MobaXterm 终端模拟软件&#xff0c;设置好串口参数连接开发板 USB 调试串口&#xff0c;最后按核心板上的 PS_RST 复位…...

JVM之虚拟机运行

虚拟机运行快速复习 try-catch&#xff1a;catch-异常表栈展开&#xff0c;finally-代码复制异常表兜底 类的生命周期&#xff1a;加载&#xff0c;连接&#xff08;验证&#xff0c;准备&#xff0c;解析&#xff09;&#xff0c;初始化&#xff0c;使用&#xff0c;卸载 类…...

玩转ChatGPT:DeepSeek实战(统一所在地格式)

一、写在前面 前段时间去交流&#xff0c;又被问到一个实际问题&#xff1a; 在组织全区活动时&#xff0c;我们设计了一份签到表&#xff0c;其中包含“所在单位地区”一列&#xff0c;目的是希望按地级市&#xff08;如南宁市、柳州市等&#xff09;对参与者进行分组&#…...

蓝桥杯题库经典题型

1、数列排序&#xff08;数组 排序&#xff09; 问题描述 给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式 第一行为一个整数n。 第二行包含n个整数&#xff0c;为待排序的数&#xff0c;每个整数的绝对值小于10000。 输出格式 输出…...

极限学习机进行电厂相关数据预测

使用极限学习机&#xff08;Extreme Learning Machine, ELM&#xff09;进行电厂相关数据预测的详细步骤和MATLAB代码示例。假设任务是预测电厂发电量或设备状态&#xff08;如温度、压力&#xff09;&#xff0c;代码包含数据预处理、ELM模型构建、训练与预测全过程。 1. 数据…...

【Axure视频教程】中继器表格间批量控制和传值

今天教大家在Axure中制作中继器表格间批量控制和传值的原型模板&#xff0c;效果包括&#xff1a; 选中和取消选中——点击表格中的多选按钮可以选中或取消选中该行内容&#xff1b; 全选和全部取消选中——点击表头左上角的多选按钮可以选中或取消选中表格的所有内容&#xf…...

Axure高级交互设计:文本框循环赋值实现新增、修改和查看

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!本文如有帮助请订阅本专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:文本框循环赋值 主要内容:使用设置文本动作实现文本框、文字标签的读取与赋值 应…...

Springboot之类路径扫描

SpringBoot框架中默认提供的扫描类为&#xff1a;ClassPathBeanDefinitionScanner。 webFlux框架中借助RepositoryComponentProvider扫描符合条件的Repository。 public class ClassPathScanningCandidateComponentProvider{private final List<TypeFilter> includeFilt…...

是 OpenCV 的 CUDA 模块中用于在 GPU 上对图像或矩阵进行转置操作函数cv::cuda::transpose

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::transpose 是 OpenCV 的 CUDA 模块中的一个函数&#xff0c;用于在 GPU 上对图像或矩阵进行转置操作&#xff08;Transpose&#xff0…...

2025B卷 - 华为OD机试七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 推荐刷题方法&#xff1a; 一、适合人群二、本期训练时间三、如何参加四、七日集训第1期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、逻辑分析第3天、逻辑分析第4天第5天第6天第7天 六、集训总结国内直接使用最新o3、o4-mini-high、GP…...

从数据中台到数据飞轮:数字化转型的演进之路

从数据中台到数据飞轮&#xff1a;数字化转型的演进之路 数据中台 数据中台是企业为整合内部和外部数据资源而构建的中介层&#xff0c;实现数据的统一管理、共享和高效利用&#xff0c;目标是打破信息孤岛&#xff0c;提高数据使用效率&#xff0c;支持业务决策和创新 实施成本…...

【Linux网络】HTTPS

HTTPS协议原理 定义 HTTPS 也是一个应用层协议.是在HTTP协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的.这就导致在传输过程中会出现一些被篡改的情况。 加密 加密就是把明文(要传输的信息)进行一系列变换,生成密文. 解密就是把密文再进行一系…...

UE5中制作动态数字Decal

在进行城市道路编辑时&#xff0c;经常需要绘制人行道、交通标志、停车线等路面元素。如果能够使用具有动态修改功能的 Decal&#xff08;贴花&#xff09;&#xff0c;将大大提升编辑效率和灵活性。接下来讲解如何制作。 1.首先准备一张包含所需元素的Texture&#xff0c;这里…...

销量预测评估指标

销量预测评估指标 一、背景 在零售、供应链等场景中&#xff0c;销量预测的准确性直接影响库存管理、成本控制和客户满意度&#xff1a; 预测偏低&#xff1a;可能导致缺货&#xff08;损失销售额和客户信任&#xff09;。预测偏高&#xff1a;导致库存积压&#xff08;增加…...

Unity3d 打包安卓平台(Android apk)报错Gradle build failed解决方法

问题 Unity3d 版本为2022.3.*版本&#xff0c;而且工程内部没有包含比较特殊的插件&#xff0c;安卓模块(module)也是随编辑一起安装&#xff0c;JDK、Android SDK Tools、Android NDK和Gradle都是默认安装。打包设置Project Settings也是默认设置&#xff0c;打包的工程不包含…...

STM32 启动文件分析

一、启动文件的核心作用 STM32启动文件&#xff08;如startup_stm32f10x_hd.s&#xff09;是芯片上电后执行的第一段代码&#xff0c;用汇编语言编写&#xff0c;主要完成以下关键任务&#xff1a; ​初始化堆栈指针&#xff08;SP&#xff09;​​ 设置主堆栈指针&#xff08…...

OSCP备战-Kioptrix4详细教程

目录 配置靶机 目标IP探测 ​编辑端口扫描 139/445端口 Samba 80端口获取shell 绕过lshell 方法一 ​编辑 方法二 ​编辑提权 内核漏洞 mysql udf提权 配置靶机 使用vm新建虚拟机&#xff0c;选择vmdk文件打开。 目标IP探测 arp-scan -l 得出目标IP&#xff1a;19…...

清华大学开源软件镜像站地址

清华大学开源软件镜像站&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/...

java基础-package关键字、MVC、import关键字

1.package关键字&#xff1a; &#xff08;1&#xff09;为了更好管理类&#xff0c;提供包的概念 &#xff08;2&#xff09;声明类或接口所属的包&#xff0c;声明在源文件首行 &#xff08;3&#xff09;包&#xff0c;属于标识符&#xff0c;用小写字母表示 &#xff0…...

uniapp(vue3)动态计算swiper高度封装自定义hook

// useCalculateSwiperHeight.ts import { ref, onMounted } from vue;export function useCalculateSwiperHeight(headerSelector: string .header-search, tabsWrapperSelector: string .u-tabs .u-tabs__wrapper) {const swiperHeight ref<number>(0);// 封装uni.g…...

Java SpringMVC 和 MyBatis 整合项目的事务管理配置详解

目录 一、事务管理的基本概念二、在 SpringMVC 和 MyBatis 整合项目中配置事务管理1. 配置数据源2. 配置事务管理器3. 使用事务注解4. 配置 MyBatis 的事务支持5. 测试事务管理三、总结在企业级应用开发中,事务管理是确保数据一致性和完整性的重要机制。特别是在整合了 Spring…...

C++的历史与发展

目录 一、C 的诞生与早期发展 &#xff08;一&#xff09;C 语言的兴起与局限 &#xff08;二&#xff09;C 的雏形&#xff1a;C with Classes &#xff08;三&#xff09;C 命名与早期特性丰富 二、C 的主要发展历程 &#xff08;一&#xff09;1985 年&#xff1a;经典…...

亚马逊云科技:引领数字时代的云服务先锋

在数字经济浪潮席卷全球的当下&#xff0c;企业和个人面临着数据爆炸、业务快速迭代等诸多挑战&#xff0c;亟需强大且灵活的云计算能力助力发展。亚马逊云科技凭借多年深耕与创新&#xff0c;成为数字时代的云服务先锋&#xff0c;为用户打造全方位、高质量的云计算解决方案。…...