• GD32 看门狗


    1. 看门狗的概念

    2. 独立看门狗

     

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

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

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

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

    3. 窗口看门狗

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

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

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

    1. WWDG特征

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

    复位条件

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

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

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

    2. WWDG功能

     

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

     

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

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

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

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

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

     

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

    1. 控制寄存器(FWDGT_CTL

     

    2. 预分频寄存器(FWDGT_PSC 

    设置时钟分频

    3. 重装载寄存器(FWDGT_RLD

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

    4. 状态寄存器(FWDGT_STAT 

    6. 代码实现 

    WDG.h

    1. #ifndef _WDG_H
    2. #define _WDG_H
    3. #include "gd32f10x.h"
    4. void fwdg_init(void); //初始化独立看门狗
    5. void fwdg_reload(void); //独立看门狗的喂狗函数
    6. #endif

     WDG.c

    1. #include "WDG.h"
    2. //初始化独立看门狗
    3. void fwdg_init(void){
    4. //开启时钟源(IRC40K),并等待其稳定以供看门狗使用
    5. rcu_osci_on(RCU_IRC40K); //开启IRC40k 默认就是 IRC40k的时钟
    6. while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K)); //等待IRC40k稳定下来
    7. fwdgt_write_enable();
    8. /* 参数1:重载值 参数2:预分频值 */
    9. /* (40K/64)*1000 = 1.625s 如果在1.625内没有喂狗就会复位 */
    10. /* 喂狗后就会把重载值重新给计数值又会获得1.625s */
    11. fwdgt_config(1000, FWDGT_PSC_DIV64);
    12. fwdgt_write_disable();
    13. fwdgt_enable(); //使能看门狗
    14. }
    15. //独立看门狗的喂狗函数
    16. void fwdg_reload(void){
    17. fwdgt_write_enable();
    18. fwdgt_counter_reload(); /* 喂狗 */
    19. }

    main.c

    1. #include "gd32f10x_eval.h"
    2. #include
    3. #include "WDG.h"
    4. int main(){
    5. gd_eval_com_init(EVAL_COM0);
    6. printf("This is a FWDGT DEMO test.\r\n");
    7. // 对独立看门狗进行初始化
    8. fwdg_init();
    9. while(1){
    10. fwdg_reload(); /* 喂狗 */
    11. }
    12. }

  • 相关阅读:
    【每天学习一点新知识】跟咩咩一起学“宽字节注入”
    使用Android辅助功能AccessibilityService实现微信自动聊天【外挂插件】
    华为认证HCIP是什么?有什么用?
    java计算机毕业设计高校防疫物资管理系统MyBatis+系统+LW文档+源码+调试部署
    大数据营销促进消费品牌增长,消费品投资回归常识思维
    Matlab:Matlab编程语言学习之如何读取外部文件(如xlsx、txt等文件)案例应用之详细攻略
    TIM_CCxChannelCmd函数无法关闭互补通道输出
    vue中 axios get请求,使用formData传递参数给后台
    Flink系列文档-(YY08)-Flink核心概念
    【LeetCode75】第五十五题 寻找峰值
  • 原文地址:https://blog.csdn.net/qq_41328470/article/details/133470571