GD32 看门狗

1. 看门狗的概念

GD32 看门狗_第1张图片

2. 独立看门狗

 GD32 看门狗_第2张图片

独立看门狗的原理:设定一个重载值。赋值计数器。每来一个脉冲计数值减减。如果计数值减到0。还没有去喂狗就会产生复位。所以在计数值在0~重载值范围必须要喂一次狗。 

在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。

无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。

如果程序异常,就无法正常喂狗,从而系统复位。

3. 窗口看门狗

窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。 WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。

之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。

窗口看门狗是在一个窗口内去喂狗。提前喂狗是无效的。

GD32 看门狗_第3张图片

1. WWDG特征

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

复位条件

- 当递减计数器值小于 0x40 时复位(如果看门狗已激活)  注:0x40根据芯片会有所不同

- 在窗口之外重载递减计数器时复位(如果看门狗已激活)

提前唤醒中断 (EWI) :当递减计数器等于 0x40 时触发(如果已使能且看门狗已激活)

2. WWDG功能

 GD32 看门狗_第4张图片

T[6:0] 就是 WWDG_CR 的低七位, W[6:0] 即是 WWDG->CFR 的低七位。 T[6:0]就是窗口看门狗的计数器,而 W[6:0](由用户定义) 则是窗口看门狗的上窗口,下窗口值是固定的( 0X40 )。 当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。

GD32 看门狗_第5张图片 

STM32F的窗口看门狗中有一个7位的递减计数器T[6:0],它会在出现下述2种情况之一时产生看门狗复位:

当喂狗的时候如果计数器的值大于某一设定数值W[6:0]时,此设定数值在WWDG_CFR寄存器定义。

当计数器的数值从0x40减到0x3F时【T6位跳变到0】

如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以用于喂狗以避免WWDG复位。

GD32 看门狗_第6张图片

4. 独立看门狗与窗口看门狗的比较 

 GD32 看门狗_第7张图片

5. 独立看门狗寄存器介绍

1. 控制寄存器(FWDGT_CTL

GD32 看门狗_第8张图片

 

2. 预分频寄存器(FWDGT_PSC 

设置时钟分频

3. 重装载寄存器(FWDGT_RLD

只用了2的12次方这个寄存器的值不能大于2的12次方

GD32 看门狗_第9张图片

4. 状态寄存器(FWDGT_STAT 

GD32 看门狗_第10张图片

6. 代码实现 

GD32 看门狗_第11张图片

WDG.h

#ifndef _WDG_H
#define _WDG_H

#include "gd32f10x.h"

void fwdg_init(void);      //初始化独立看门狗
void fwdg_reload(void);    //独立看门狗的喂狗函数

#endif

 WDG.c

#include "WDG.h"

//初始化独立看门狗
void fwdg_init(void){
	//开启时钟源(IRC40K),并等待其稳定以供看门狗使用
	rcu_osci_on(RCU_IRC40K); //开启IRC40k 默认就是 IRC40k的时钟
	while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K)); //等待IRC40k稳定下来
	
	fwdgt_write_enable();
  /* 参数1:重载值 参数2:预分频值 */
  /* (40K/64)*1000 = 1.625s 如果在1.625内没有喂狗就会复位 */
  /* 喂狗后就会把重载值重新给计数值又会获得1.625s  */
	fwdgt_config(1000, FWDGT_PSC_DIV64);
	fwdgt_write_disable();
	fwdgt_enable(); //使能看门狗
}

//独立看门狗的喂狗函数
void fwdg_reload(void){
	fwdgt_write_enable();
	fwdgt_counter_reload(); /* 喂狗 */
}

main.c

#include "gd32f10x_eval.h"
#include 
#include "WDG.h"

int main(){
	gd_eval_com_init(EVAL_COM0);
	printf("This is a FWDGT DEMO test.\r\n");
	
	// 对独立看门狗进行初始化
	fwdg_init();

	while(1){
		fwdg_reload(); /* 喂狗 */
	}
}

你可能感兴趣的:(GD32F10X,单片机)