GD32H7 FWDG独立看门狗
这个demo给得比较复杂,我直接找了几个函数替代了它原来的长篇大论。一个初始化,一个喂狗。一些函数里的值可以直接复制demo。这样的话,两秒后不喂狗会复位。
void FWDGT_Init(void)
{
rcu_periph_clock_enable(KEY_CLK);
rcu_periph_clock_enable(RCU_SYSCFG);
fwdgt_config(2 * 500, FWDGT_PSC_DIV64);
fwdgt_write_disable();
fwdgt_enable();
}
void task_fwdgt_reload(void)
{
/* uncock fwdgt write protect*/
fwdgt_write_enable();
/* feed fwdgt */
fwdgt_counter_reload();
}
函数调用
int main(void)
{
//其它的初始化函数。
FWDGT_Init();
while(1) {
TaskLoop();
task_fwdgt_reload();
}
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_38038158/article/details/144911518
GD32H7的FWDG独立看门狗为系统提供了可靠的异常监测与恢复机制 FWDG本质上是一个12位的递减计数器。当计数器的值从某个设定的起始值一直减到0时,系统就会产生一个复位信号
它由内部专门的40KHz低速时钟驱动,这个时钟是独立的,即使主时钟发生故障,FWDG也能正常工作
通过向键值寄存器写入特定的值来控制FWDG的工作状态,如写入0xCCCC可启动独立看门狗,此时计数器开始从其复位值0xFFF递减计数;写入0xAAAA可实现“喂狗”操作,即重装载计数器的值,避免产生看门狗复位
通过合理设置重装载寄存器的值,可以调整看门狗的超时时间
内部看门狗和外部看门狗哪个更可靠些?假设mcu进入异常状态,卡死了,看门狗还能正常工作么? 预分频寄存器用于设置看门狗时钟的分频系数,不同的分频系数会影响计数器的计数速度和超时时
FWDG的时钟源是内部32KHz的IRC32K时钟。 FWDG的时钟源需要经过一个预分频器,分频因子可以通过相关寄存器进行设置。预分频后的时钟频率决定了看门狗的计数速度。 由于内部RC振荡器时钟的频率可能会因温度和工作条件而漂移,因此在实际应用中需要考虑这种频率变化对看门狗超时时间的影响。 一旦设置了预分频系数和重装载值,并且启用了看门狗,就不能再改变这些参数。因此,在调用启动命令前要确保所有必要的配置已经完成。 通过预分频寄存器(FWDG_PSC)设置计数器的时钟分频系数,从而调整计数器的计数频率。 这个时钟源独立于系统时钟,保证了看门狗在系统时钟异常时仍能正常工作。 FWDG独立看门狗包含一个计数器,该计数器在每个时钟周期递减。计数器的初始值可以通过重装载寄存器(Reload Register)来设置。 在应用程序中定期执行“喂狗”操作,即向IWDG的键寄存器写入0xAAAA,以防止系统被复位。喂狗的时间间隔必须短于设定的超时时间。 可以通过配置预分频系数和重装载计数值来调整看门狗的超时时间。 在程序的关键路径上确保及时喂狗是非常重要的,以避免不必要的系统复位。 FWDG独立看门狗是GD32H7系列微控制器的一个重要特性,它为系统提供了一种安全机制,以确保在软件出现异常时能够自动恢复。 FWDG有一个12位的计数器,计数器的初始值来自重装载寄存器(FWDGT_RLD)。
计数器在每个计数器时钟到来时减1,当计数器减到0时,会触发系统复位。
通过向FWDGT_CTL寄存器写入0xAAAA,可以重装载计数器的值,即“喂狗”。