【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介

看门狗从本质上来说也是一个定时器,它是用来监测硬件或软件的故障的;它的工作原理大概就是开启后内部定时器会按照设置的频率更新,在程序运行过程中我们需不断地重装载看门狗,以使它不溢出;如果硬件或软件发生故障没有及时重装载看门狗,就会引发中断或复位。

在GD32中看门狗分为独立看门狗(FWDGT)和窗口看门狗(WWDGT)。

2. 独立看门狗

独立看门狗使用独立的内部时钟,频率为32kHz,因此即使在低功耗模式中它也是能够运行的,适用于需要独立环境且对计时精度要求不高的场合 。它的内部有一个12位****的向下计数的定时器;运行时,当计时器的计数值达到0,独立看门狗会产生一个系统复位。

看门狗的内部还自带一个预分频器,可以对内部时钟再分频,下面列出了不同的分频系数,对应的最小和最大超时时间。

|-------|----------|-------------|
| 预分频系数 | 最小超时(ms) | 最大超时(ms) |
| 1/4 | 0.03125 | 511.90625 |
| 1/8 | 0.03125 | 1023.7812 |
| 1/16 | 0.03125 | 2047.53125 |
| 1/32 | 0.03125 | 4095.03125 |
| 1/64 | 0.03125 | 8190.03125 |
| 1/128 | 0.03125 | 16380.03125 |
| 1/256 | 0.03125 | 32760.03125 |

使用独立看门狗时要注意,当执行完喂狗reload操作之后,如需要立即进入deepsleep / standby模式时,必须通过软件设置,在reload命令及deepsleep / standby模式命令中间插入(3个以上)IRC32K时钟间隔。

3. 窗口看门狗

窗口看门狗使用PCLK分频而来的时钟,它内部是一个7位的向下计数的计数器,同样,运行时计数器的值变为0时,会引发中断或系统复位。

若配置为中断使能,那么计数器的值达到0x40时会触发中断;若想产生复位有以下几种方式,一种是在计数值达到窗口寄存器值之前,更新计数器;另一种是将WWDGT_CTL寄存器的WDGTEN位置1,计数器的值达到0x3F时。

窗口看门狗的超时时间可以使用下面的公式计算:

这里也提供一个表格列出不同分频系数下的最小和最大超时时间。

|-------|----------------------------|----------------------------|
| 预分频系数 | 最小超时时间(us) CNT[6:0]=0x40 | 最大超时时间(ms) CNT[6:0]=0x7F |
| 1/1 | 68.27 | 4.37 |
| 1/2 | 136.54 | 8.74 |
| 1/4 | 273.08 | 17.48 |
| 1/8 | 546.16 | 34.96 |

4. 例程

4.1 独立看门狗

例程中会配置独立看门狗运行,在程序中定期对其正常重装载5次,然后不操作,等待看门狗溢出,引起系统复位。

cpp 复制代码
int main(void)
{
    systick_config();
	debug_init();
	printf("fwdgt demo\r\n");
	/* 看门狗超时时间 = 1 / (32kHz / 32) * 3000 = 3s */
	fwdgt_config(3000, FWDGT_PSC_DIV32);
	fwdgt_enable();
	
    if (RESET != rcu_flag_get(RCU_FLAG_FWDGTRST)) {
        /* clear the FWDGT reset flag */
        rcu_all_reset_flag_clear();
	}

    for (uint8_t i = 0; i < 5; i++) {
		delay_1ms(1000);
		printf("reload fwdgt\r\n");
		fwdgt_counter_reload();
    }
	
	while (1) {
	}
}

初始化非常简单,调用fwdgt_config函数,传入重装载值和分频系数即可,我设置的是32分频,重装载值3000,那么超时时间就是大约3秒。最后调用fwdgt_enable即可开启看门狗,那么需要注意的是看门狗一旦开启就关闭不了了,除非系统复位。

下面的循环会每隔1秒重装载看门狗一次,5次过后就不再操作。

从程序的输出可以看到看门狗的确发生了溢出并导致了系统复位。

4.2 窗口看门狗

这个例程配置窗口看门狗并使能,同样定期重装载5次,然后不操作,使看门狗产生系统复位。

cpp 复制代码
int main(void)
{
    systick_config();
	debug_init();
	printf("wwdgt demo\r\n");

    /* 检查系统是否由WWDGT复位中唤醒 */
    if(RESET != rcu_flag_get(RCU_FLAG_WWDGTRST)) {
        /* 清除复位标志 */
        rcu_all_reset_flag_clear();
    }

    /* 使能WWDGT时钟 */
    rcu_periph_clock_enable(RCU_WWDGT);

	/* 看门狗超时时间 = 1 / (60MHz / 4096 / 8) * (127 - 63) = 34.96ms	*/
	/* 窗口范围 26.22ms-34.96ms */
	wwdgt_config(127, 79, WWDGT_CFG_PSC_DIV8);
	wwdgt_enable();

    for (uint8_t i = 0; i < 5; i++) {
		delay_1ms(28);  // 在窗口范围更新才不会复位
		printf("reload wwdgt\r\n");
		wwdgt_counter_update(127);
    }

	while (1) {
	}
}

因为窗口看门狗使用PCLK时钟,所以使用前需要使能时钟。

接下来初始化调用wwdgt_config即可,传入重装载值、窗口值和预分频系数,因为时钟频率较高、计数器位数小还有它基于窗口的这个特性,可以发现窗口看门狗对重装载的时间要求还是蛮高的,用户必须在窗口范围内重装载才不会引发系统复位。初始化后调用wwdgt_enable可使能窗口看门狗。

下面还是一样,重装载5次,之后等待系统复位。

相关推荐
qq_75568224010 小时前
STM32使用NRF2401进行数据传送
stm32·单片机·嵌入式硬件
FreakStudio16 小时前
开源一款串口舵机驱动扩展板-FreakStudio多米诺系列
单片机·嵌入式·大学生·电子diy
艾格北峰17 小时前
STM32 物联网智能家居 (六) OLED显示设备
arm开发·stm32·单片机·嵌入式硬件·物联网·智能家居
weixin_5358542220 小时前
oppo,汤臣倍健,康冠科技,高途教育25届春招内推
c语言·前端·嵌入式硬件·硬件工程·求职招聘
热爱嵌入式的小许20 小时前
STM32 HAL库&标准库+ESP8266+机智云
stm32·单片机·嵌入式硬件·stm32移植机智云·stm32连接机智云·hal库移植机智云·标准库移植机智云
无际单片机编程21 小时前
面对STM32的庞大体系,如何避免迷失在细节中?
java·stm32·单片机·嵌入式硬件·嵌入式开发
2301_764602231 天前
stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)
stm32·单片机·嵌入式硬件
楼台的春风1 天前
PWM(脉宽调制)技术详解:从基础到应用实践示例
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式
Jack153027682791 天前
芯谷D668:便携式录音机与耳机式盒式录音机的理想音频解决方案
嵌入式硬件·音视频·家庭影院·麦克风阵列处理器·便携式录音机·耳机式盒式录音机
深圳市青牛科技实业有限公司 小芋圆1 天前
芯谷D2761:为扬声器保护而生的音频限幅器
人工智能·科技·单片机·嵌入式硬件·机器人·音视频