打印
[研电赛技术支持]

GD32F450---独立看门狗

[复制链接]
869|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-1-21 14:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一:简介

        看门狗(Watchdog)是一种计算机硬件或软件的监控机制,主要作用是监测系统的运行状态,并在系统出现异常或故障时采取相应措施,以保证系统的稳定性和可靠性。

        具体来说,看门狗的工作原理是,在系统运行以后启动看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。硬件看门狗是利用定时器来监控主程序的运行,在主程序的运行过程中,要在定时时间到之前对定时器进行复位,如果出现死循环,或者说PC指针不能回来,这时看门狗就会介入,采取相应的措施保证系统的稳定性和可靠性。

        以下介绍的是GD32F4的独立看门狗定时器的使用:

1.独立时钟源:        独立看门狗定时器(FWDGT )有独立时钟源( IRC32K )。即使主时钟失效, FWDGT 依然能
保持正常工作状态,适用于需要独立环境且对计时精度要求不高的场合。
2. 独立看门狗定时器带有一个 8 级预分频器,可以对输入时钟(IRC32K),进行预分频,降低时钟频率,延长最大允许喂狗时间。

3. 12位向下定时器:         独立运行的12位向下计数器,当内部向下计数器的计数值达到0 ,独立看门狗会产生一个系统复位。

一:库函数接口

1.看门狗读写保护

/* enable write access to FWDGT_PSC and FWDGT_RLD */
void fwdgt_write_enable(void);
/* disable write access to FWDGT_PSC and FWDGT_RLD */
void fwdgt_write_disable(void);
2.看门狗使能

/* start the free watchdog timer counter */
void fwdgt_enable(void);
3.独立看么狗参数配置

        1)时钟预分频

/* configure the free watchdog timer counter prescaler value */
ErrStatus fwdgt_prescaler_value_config(uint16_t prescaler_value);
        2)重装值设置

/* configure the free watchdog timer counter reload value */
ErrStatus fwdgt_reload_value_config(uint16_t reload_value);
        等效总接口:

/* configure counter reload value, and prescaler divider value */
ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div);
4.喂狗,重装看门狗定时器

/* get flag state of FWDGT */
FlagStatus fwdgt_flag_get(uint16_t flag);
5.标志位查询

/* get flag state of FWDGT */
FlagStatus fwdgt_flag_get(uint16_t flag);
二:应用示例

1.初始化

void model_fwdgt_Init(void (*callback_function)(void))
{
  uint16_t timeout_t=0xFFFFU;
  /* enable IRC32K */
  rcu_osci_on(RCU_IRC32K);
       
  /* wait till IRC32K is ready */
  while(SUCCESS != rcu_osci_stab_wait(RCU_IRC32K))
  {
    if(timeout_t > 0)
    {
      timeout_t--;
    }
    else
    {
      callback_function();
      break;
    }                  
  }
  /* confiure FWDGT counter clock: 32KHz(IRC32K) / 64 = 0.5 KHz */
  fwdgt_config(500,FWDGT_PSC_DIV64);
       
  fwdgt_write_disable();
  /* After 1S to generate a reset */
  fwdgt_enable();
}

2.重装喂狗函数

void model_fwdgt_reload(void)
{
        /* uncock fwdgt write protect*/
        fwdgt_write_enable();
        /* feed fwdgt */
        fwdgt_counter_reload();       
}
3.人为溢出

        /* 某种条件触发 */
        if(something)
        {
                /* 重新配置看门狗计数值 */
                fwdgt_write_enable();                               
                /* configure FWDGT counter clock: 40KHz(IRC40K) / 64 = 0.625 KHz */
                fwdgt_config(5,FWDGT_PSC_DIV64);                                //t = (1/0.625)x(5) = 8ms                               
                fwdgt_counter_reload();                       
                fwdgt_enable();
        }
程序应用:

int main(void)
{       
        FWDGT_Init();
       
        while(1)
        {
                task_fwdgt_reload();
        }
}
————————————————
版权声明:本文为CSDN博主「嵌入式小宁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_53592457/article/details/133939347

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1931

主题

15611

帖子

11

粉丝