目录
1.PWR
1.1 简介
PWR(Power Control)电源控制
PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能
可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务
低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间 — 重点介绍
1.2 电源框图
STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源,关于电源备份区域手册中的描述如下:
至于VDDA和VSSA则是和独立的A/D转换器有关,为了提高转换的精确度,ADC使用一个独立的电源供电,过滤和屏蔽来自印刷电路板上的毛刺干扰。
- 为了确保输入为低压时获得更好精度,用户可以连接一个独立的外部参考电压ADC到**VREF+和VREF-**脚上。在VREF+的电压范围为2.4V~VDDA。 — 100脚和144脚封装
- 没有VREF+和VREF-引脚,他们在芯片内部与ADC的电源(VDDA)和地(VSSA)相联。 — 64脚或更少脚封装
1.3 上电复位和掉电复位
STM32内部有一个完整的上电复位(POR)和掉电复位(PDR)电路,当供电电压达到2V时系统既能正常工作。
当VDD/VDDA低于指定的限位电压VPOR/VPDR时,系统保持为复位状态,而无需外部复位电路。关于上电复位和掉电复位的细节参考数据手册的电气特性部分。
复位后调节器总是使能的。根据应用方式它以3种不同的模式工作。
- 运转模式:调节器以正常功耗模式提供1.8V电源(内核,内存和外设)。
- 停止模式:调节器以低功耗模式提供1.8V电源,以保存寄存器和SRAM的内容。
- 待机模式:调节器停止供电。除了备用电路和备份域外,寄存器和SRAM的内容全部丢失。
1.4 可编程电压监测器
功能:
PVD 用于监控芯片的供电电压 VDD
,通过设定阈值检测电压的变化。当 VDD
降到阈值以下或者回升至阈值以上时,会触发中断,用户可以在中断中实现相应的电源管理策略。
PVD 的关键特性:
- 支持可编程阈值电压(通过寄存器配置)。
- 提供下降和上升两个方向的电压监测。
- 可触发中断,用于执行例如保存数据、关闭外设或进入低功耗模式等任务。
配置步骤:
- 启用 PWR 模块时钟(通过
RCC_APB1PeriphClockCmd
函数)。 - 配置 PVD 的阈值电压。
- 启用 PVD 中断。
- 在中断服务程序中处理电压异常情况。
#include "stm32f10x.h"
void PVD_Config(void) {
// 1. 启用 PWR 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
// 2. 配置 PVD 阈值为 2.9V
PWR_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 Line
EXTI_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 低功耗模式
1.5.1 模式选择
执行WFI(Wait For Interrupt)或者WFE(Wait For Event)指令后,STM32进入低功耗模式
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中断通道挂起位。
该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。
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 唤醒。
在进入停止模式前,确保以下任务已经完成:
- 闪存编程完成:如果正在写入 Flash 内存,需等待操作结束后才能进入停止模式。
- APB 访问结束:正在进行的 APB 总线访问也需完成。
在停止模式中,可以通过独立的控制位启用或禁用以下功能:
- 独立看门狗(IWDG):
-
- 启用方式:通过写入看门狗键寄存器(IWDG->KR)或硬件设置。
- 注意:一旦启用看门狗,除非系统复位,否则无法停止。
- 实时时钟(RTC):
-
- 设置方式:通过
RCC_BDCR
寄存器的RTCEN
位启用 RTC。 - RTC 可以用作唤醒源,在停止模式中继续运行。
- 设置方式:通过
- 低速内部振荡器(LSI RC):
-
- 设置方式:通过
RCC_CSR
寄存器的LSION
位启用。
- 设置方式:通过
- 低速外部振荡器(LSE):
-
- 设置方式:通过
RCC_BDCR
寄存器的LSEON
位启用。
- 设置方式:通过
- ADC 和 DAC 功耗:
-
- ADC:通过设置
ADC_CR2
寄存器的ADON
位为0
来关闭 ADC。 - DAC:通过设置
DAC_CR
寄存器的ENx
位为0
来关闭 DAC。 - 注意:在进入停止模式前必须关闭这两个模块,否则仍然会消耗电流。
- ADC:通过设置
进入停止模式:
#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);
// 配置 NVIC
NVIC_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事件唤醒
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
位。
- 在 Cortex-M3 系统控制寄存器(
设置电源控制寄存器(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 复位:
独立看门狗触发复位。
- 复位行为:
-
- 唤醒后,系统行为等同于复位(如采样启动模式引脚、执行复位向量等)。
- 唯一例外:
PWR_CSR
中的状态位保留,用于指示待机唤醒原因。
- 启动延时:
-
- 唤醒时电压调节器需要启动时间,会引入一定延迟。
#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 修改主频
主要是通过对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's
maximum frequency.
3. If none of the define below is enabled, the HSI is used as System clock
source.
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 is
used to drive the System clock.
- For Connectivity line devices an external 25MHz crystal is used to drive
the 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
可能需要做出修改:
关于文件的只读属性修改:
需要注意的是,如果文件出现了钥匙,说明该文件为只读文件,需要设置为可修改:
1.6.2 睡眠模式+串口发送+接收
User:
Hardware:
1.6.3 停止模式+对射式红外传感器计次
User:
Hardware:
唤醒的方式为exit外部中断,注意和上面的串口实验区分,睡眠模式唤醒的方式是NIVC中断,也就是任意的中断。
当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟。按下复位键后可以发现”Running“的打印速度变慢了,是因为退出了停止模式,HSI被选为了系统时钟,为8MHz。而未退出前,也就是程序运行的时候是已经默认调用了SystemInit()
函数,这个函数中又调用了SetSysClock()
函数,会将系统的时钟频率设置为72MHz(取决于system_stm32f10x.c中所设置的主频,这里默认是为72MHz)。因此时钟频率减少,会发现”Running“显示的速度为未复位前的1/9
所以一般都会在PWR_EnterSTOPMode
后面再加一个SystemInit()
函数,退出停止模式后恢复原来的主频
1.6.4 待机模式+实时时钟
User:
Hardware:
System:
需要注意的是退出待机模式后代码是重新开始运行的。
2.看门狗
如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG。
2.1 简介
WDG(Watchdog)看门狗
看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
STM32内置两个看门狗:
- 独立看门狗(IWDG):独立工作,对时间精度要求较低
- 窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用
2.2 IWDG
IWDG键寄存器:
键寄存器本质上是控制寄存器,用于控制硬件电路的工作。在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
WDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。
状态寄存器指示预分频值和递减计数器是否正在被更新。
-
- 对于这些值,标准库中已经用相关的宏定义标注了,并且也有相关的函数可以去进行设置,具体的自行去看库函数手册
超时时间:
超时时间:TIWDG = TLSI × PR预分频系数 × (RL + 1)
-
- 其中:TLSI = 1 / FLSI
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复位
如果看门狗被启动(WWDG_CR寄存器中的WDGA位被置’1’), 并且当7位(T[6:0])递减计数器从0x40翻转到0x3F(T6位清零)时,则产生一个复位。如果软件在计数器值大于窗口寄存器中的数值时重新装载计数器,将产生一个复位。
超时时间:
窗口时间:
3.实验
3.1 独立看门狗
User:
其中:
/*IWDG初始化*/
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //独立看门狗写使能
IWDG_SetPrescaler(IWDG_Prescaler_16); //设置预分频为16
IWDG_SetReload(2499); //设置重装值为2499,独立看门狗的超时时间为1000ms
IWDG_ReloadCounter(); //重装计数器,喂狗
IWDG_Enable(); //独立看门狗使能
设置的喂狗时间是1s,计算如下:
- 40KHz的时钟频率,16分频后就是2500Hz,也就是一个脉冲是0.0004ms
- 计数一次需要0.0004ms,那么设置计数器重装值为2499,也就是2500次,就会重置计数器,发送复位信号,1s的时间(0.0004 ms✖2500 = 1s)
想要计算出1000ms对应的RL,也就是计数次数,套公式去进行计算就行了,需要注意的是要再最短时间和最长时间的范围内才行,比如1000ms对于分频系数为4和8的不匹配。
3.2 窗口看门狗
User:
根据这个框图去进行设置
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); //开启WWDG的时钟
/*WWDG初始化*/
WWDG_SetPrescaler(WWDG_Prescaler_8); //设置预分频为8
WWDG_SetWindowValue(0x40 | 21); //设置窗口值,窗口时间为30ms
WWDG_Enable(0x40 | 54); //使能并第一次喂狗,超时时间为50ms
while (1)
{
Key_GetNum(); //调用阻塞式的按键扫描函数,模拟主循环卡死
OLED_ShowString(4, 1, "FEED"); //OLED闪烁FEED字符串
Delay_ms(20); //喂狗间隔为20+20=40ms
OLED_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就看门狗复位。
需要注意:一旦复位,程序就会从从头开始重新执行