公司建设网站流程,好听顺口的公司名字,亚马逊关键词优化软件,抖音代运营服务内容及合作套餐嵌入式_GD32独立看门狗配置与注意事项 文章目录 嵌入式_GD32独立看门狗配置与注意事项前言一、什么是独立看门狗定时器#xff08;FWDGT#xff09;二、独立看门狗定时器原理三、独立看门狗定时器配置过程与注意事项总结 前言
使用GD3单片机时#xff0c;为了提供了更高的安…嵌入式_GD32独立看门狗配置与注意事项 文章目录 嵌入式_GD32独立看门狗配置与注意事项前言一、什么是独立看门狗定时器FWDGT二、独立看门狗定时器原理三、独立看门狗定时器配置过程与注意事项总结 前言
使用GD3单片机时为了提供了更高的安全性、时间的精确性和使用的灵活性。独立看门狗定时器可用来检测和解决由软件错误引起的故障在此简单记录一下GD32独立看门狗的配置过程和注意事项。
注本项目基于GD32F103CBT6硬件平台看门狗使用时钟源为40kHzIRC40K 使用标准库GD32F10x_Firmware_Library_V1.0.0提示此库坑多、慎用
一、什么是独立看门狗定时器FWDGT
独立看门狗定时器FWDGT 有独立的时钟源IRC40K 。 即使主时钟失效 FWDGT依然能保持正常工作状态适用于需要独立环境且对计时精度要求不高的场合。当内部向下计数器的计数值达到0独立看门狗会产生一个系统复位。使能独立看门狗的寄存器写保护功能可以避免寄存器的值被意外的配置篡改主要特征如下
■ 自由运行的12位向下计数器 ■ 使能看门狗定时器当向下计数器的值达到0时产生系统复位 ■ 独立时钟源独立看门狗定时器在主时钟故障例如待机和深度睡眠模式下 时仍能工作 ■ 独立看门狗定时器硬件控制位用来控制是否在上电时自动启动独立看门狗定时器 ■ 可以配置独立看门狗定时器在调试模式下选择停止还是继续工作
二、独立看门狗定时器原理 1.向控制寄存器FWDGT_CTL 中写0xCCCC可开启独立看门狗定时器计数器开始向下计数。当计数器记到0x000产生一次系统位。2.在任何时候向FWDGT_CTL中写0xAAAA都可以重装载计数器重装载值来源于重装载寄存器FWDGT_RLD 寄存器。软件可以在计数器计数值达到0x000之前可以通过重装载计数器来阻止看门狗定时器产生系统复位。 3.如果在选项字节中打开了“硬件看门狗定时器”功能那么在上电的时候看门狗定时器就被自动打开。 4.为了避免系统复位软件应该在计数器达到0x000之前重装载计数器。 5.预分频寄存器FWDGT_PSC 和FWDGT_RLD寄存器都有写保护功能。在写数据到这些寄存器之前需要写0x5555到FWDGT_CTL中。写其他任何值到FWDGT_CTL中将会再次启动对这些寄存器的写保护。 6.当FWDGT_PSC或者FWDGT_RLD更新时 FWDGT_STAT寄存器的相应状态位会被置1。 7.如果在DBG控制寄存器0DBG_CTL0 中的FWDGT_HOLD位被清0即使Cortex®-M3内核停止调试模式下 独立看门狗定时器依然工作。如果FWDGT_HOLD位被置1独立看门狗定时器将在调试模式下停止工作
注1关于状态寄存器的RUD和PUD位说明
注2因为重装载寄存器的宽度只有12位所以最大数值为4095按照看门狗使用时钟源为40kHzIRC40K来计算 复位时间T_out Prer * Rlr/ 40 ms Prer 为下图预分频系数的倒数 Rlr为重装载计数器的的装载值
三、独立看门狗定时器配置过程与注意事项
根据程序运行时间来估计一个看门狗复位时间例如我们需要配置一个复位周期时间为200ms的独立看门狗步骤如下 1.计算配置预分频系数为32重装载值为250 200ms 32*250/40 2.需要写0x5555到FWDGT_CTL中解除解除FWDGT_PSC寄存器和FWDGT_RLD寄存器的写保护 3.等待等待FWDGT_STAT寄存器的PUD位被置0可进行设置预分频系数. 4.等待等待FWDGT_STAT寄存器的RUD位被置0可进行设置重装载数值. 5.重装载计数器 6.开启独立看门狗 7.检查是否设置了指定独立看门狗的RCC标志如果被置起选择清除 8.200ms内喂狗
代码如下示例
/************************************************************************功能块说明宏定义***********************************************************************/
#define FWDG_WRITEACCESS_ENABLE (0x5555U)
#define FWDG_WRITEACCESS_DISABLE (0x0000U)
#define FWDG_KEY_RELOAD (0xCCCCU)
#define FWDG_KEY_ENABLE (0xAAAAU)#define FWDG_INIT_TIMEOUT (800u)
#define FWDG_TIMEOUT_200MS (500u)/************************************************************************功能块说明看门狗初始化***********************************************************************/
void FWDG_Init(void)
{uint16_t FWDG_Counter 0;TypeState Flag_Status;/*解除FWDGT_PSC寄存器和FWDGT_RLD寄存器的写保护*/IWDG_Write_Enable(FWDG_WRITEACCESS_ENABLE);/*等待FWDGT_STAT寄存器的PUD位被置0*/do{Flag_Status IWDG_GetBitState(IWDG_BIT_PUD);FWDG_Counter;}while((FWDG_Counter FWDG_INIT_TIMEOUT) (RESET ! Flag_Status));if(Flag_Status ! RESET){/*INIT Fail*/}else{/*32分频最小计数时间0.8ms*/IWDG_SetPrescaler(IWDG_PRESCALER_32);}FWDG_Counter 0;/*等待FWDGT_STAT寄存器的RUD位被置0*/do{Flag_Status IWDG_GetBitState(IWDG_BIT_RUD);FWDG_Counter;}while((FWDG_Counter FWDG_INIT_TIMEOUT) (RESET ! Flag_Status));if(Flag_Status ! RESET){/*INIT Fail*/}else{/*设置装载值250*/IWDG_SetReloadValue(FWDG_TIMEOUT_200MS);}/*重装载计数器*/IWDG_ReloadCounter();/*开启独立看门狗*/IWDG_Enable();/*Check if the system has resumed from IWDG reset */if (RCC_GetBitState(RCC_FLAG_IWDGRST) ! RESET){RCC_ClearBitState();}
}/*喂狗函数*/
void FWDG_FeedWdg(void)
{IWDG_ReloadCounter();
} 总结
1.看门狗是把双刃剑使用与不适用需要根据程序的实际情况来确定如果要依靠频繁使用看门狗复位来修正程序那一定不是件好事。 2.调试过程最好提前关闭看门狗否则会有意想不到的bug…