打印
[研电赛技术支持]

【GD32F470紫藤派使用手册】第七讲 FWDG-看门狗实验

[复制链接]
4010|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

7.1 实验内容
通过本实验主要学习以下内容:
独立看门狗的原理
独立看门狗功能介绍
实现独立看门狗功能
7.2 实验原理
前面讲到,看门狗的计数值在每一个计数器时钟来的时候减1,那么这个时钟是什么呢,我们来看一下GD32F470的时钟树:
从时钟树可以看到,FWDGT的时钟来源于IRC32K,这是GD32F470的内部时钟,典型的频率值是32KHz。但要注意,这个IRC32K不是直接连到FWDGT计数器的,而是需要经过一个预分频器,这个分频器大小通过FWDGT_PSC进行设定。
预分频寄存器(FWDGT_PSC):
如设定PS[2:0]001b,那么计数器的时钟频率就为32K/8 = 4KHz,即每隔250us计数值减1
7.2.1 独立看门狗(FWDGT)的重装载
说完时钟,我们来说下FWDGT的计数器和重装载。计数器就是按照前面说的,每来一个计数器时钟,计数器减1,而计数器的初始值,来自于重装载寄存器。
重装载寄存器(FWDGT_RLD):
描述中我们可以看出,向FWDGT_CTL写入0xAAAA(即喂狗,详见用户手册FWDGT_CTL寄存器),重装载寄存器中的数值就会自动加载到FWDGT的计数器中。
重装载寄存器(FWDGT_RLD)是一个12位的计数器,这就意味着重装载最大值为65535,再结合上一节的时钟分频,FWDGT设定的最大/最小超时周期见下表:
注意: 当执行完喂狗reload操作之后,如需要立即进入deepsleep / standby模式时,必须通过软件设置,在reload命令及deepsleep / standby模式命令中间插入(3个以上) IRC32K时钟间隔,否则可能导致喂狗不成功。  
7.2.2 独立看门狗的使用注意事项
独立看门狗的时钟源来自于IRC32K,这个内部时钟实际上不是非常的准确,所以在设定看门狗重载值和分配器时需要留有一定的余量,防止应用程序由于IRC32K频率偏差而来不及喂狗,导致不必要的MCU复位。
7.3 硬件设计
本实验我们通过紫藤派开发板LED0的状态来指示MCU复位情况,用LED1来指示喂狗的情况。
7.4 代码解析
driver_wdgt.c中定义了独立看门狗的配置函数drive_fwdgt_config和喂狗函数Feed_fwdgt
C
void drive_fwdgt_config(uint16_t reload_value, uint8_t prescaler_div)
{
        /* 开启内部32K时钟 */
    rcu_osci_on(RCU_IRC32K);
    /* 等待时钟ready */
    while(SUCCESS != rcu_osci_stab_wait(RCU_IRC32K)){
    }
        /*配置看门狗参数*/
    fwdgt_config(reload_value,prescaler_div);
        /*开启看门狗*/
    fwdgt_enable();
}

void Feed_fwdgt(void)
{
        /* 重装载计数器 */
        fwdgt_counter_reload();
}
以下为main函数代码:
C
int main(void)
{
    uint8_t i;
    driver_init();//delay函数初始化
    bsp_led_group_init();//LED初始化
    bsp_led_on(&LED1);//点亮LED0
    delay_ms(2000);        //延时2s
    bsp_led_off(&LED1);//熄灭LED0
    drive_fwdgt_config(625,FWDGT_PSC_DIV64);//独立看门狗配置
    /*闪烁LED1 5次,并每闪烁一次进行喂狗*/
    for(i = 0;i<5;i++)
    {
        delay_ms(500);
        bsp_led_toggle(&LED2);
        Feed_fwdgt();
        printf_log("Feed_fwdgt!/r/n")
    }        
    while (1)
    {
    }
}
本例程main函数首先进行了延时函数初始化,再初始化LED0LED1,并将LED0点亮2s钟后熄灭,然后配置独立看门狗时钟预分频为64分频,重载值为1000,即超时时间为625/32K/64= 1.25s,再每500ms翻转一次LED1,同时进行喂狗,最后进入while(1)循环。
7.5 实验结果
紫藤派开发板上电后,LED0灯亮,2s钟后熄灭,随后LED1闪烁5次,再经过一段时间后LED1灯灭,LED0复亮,周而复始。
本教程由GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网,GD32MCU技术交流群:859440462


使用特权

评论回复
沙发
gouguoccc| | 2024-5-12 11:21 | 只看该作者
终于不用水果派命名了,哈哈。

使用特权

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

本版积分规则

170

主题

190

帖子

10

粉丝