【Ai-WB2入门篇】看门狗使用

[复制链接]
查看2075 | 回复7 | 2024-8-30 15:11:34 | 显示全部楼层 |阅读模式
看门狗 (Watchdog),又叫看门狗定时器(Watchdog Timer),是一种硬件的计时设备,当系统的主程序发生某些错误时,导致未及时清除看门狗计时器的计时值,这时看门狗计时器就会对系统发出复位信号,使系统从悬停状态恢复到正常运作状态。
本文将详细介绍如何使用Ai-WB2的看门狗定时器模块。
一:看门狗定时器(WDG)介绍
BL602芯片内有一组看门狗计数器,不可预知的软件或硬件行为有可能导致应用程序工作失常,看门狗定时器可以帮助系统从中恢复,如果当前阶段超过预定时间,但没有喂狗或关闭看门狗定时器,可依设定触发中断或系统复位。其功能框图如下:
1.png
Watchdog定时器时钟有3种选择:
      · Fclk-系统主时钟
      · 32K-32K时钟
      · Xtal-外部晶振
每个计数器有各自的8-bit分频器,可通过APB将选择到的时钟进行1-256的分频, 具体来说设定为0时表示不分频,设定为1时进行2分频以此类推, 最大分频系数为256,计数器将以分频后的时钟作为计数周期单位,每经过一个计数周期进行上数一的动作。
看门狗定时器工作原理
Watchdoa定时器包含一个计数器和一个比较器,计数器从0开始累加计数,如果计数器被复位(喂狗),则从0再次开始向上计数,当计数器的值与比较器相等的时候, 可以产生一个比较中断信号或者系统复位信号,用户可以根据需要选择使用其中一个,看门狗计数器会在每个计数周期单位上加1,软件可以在任何时间点通过APB将看门狗计数器归零。下面以比较器的值为6,Watchdog的工作时序如下图所示:
2.png
看门狗定时器报警流程
每个计数器可设定一组比较值,当软件因为系统错误,来不及将看门狗计数器归零,导致看门狗计数器超过比较值时,便会触发看门狗报警,报警方式有两种,第一种是通过中断通知软件进行必要的处置,第二种是进入系统看门狗复位, 看门狗复位被触发时,会通知系统复位控制器,并做好系统复位前准备,当一切就绪后进入系统勘门狗复位,值得注意的是,软件可通过APB读取WSR 寄存器得知是否曾经发生看门狗系统复位。
3.png
二:看门狗定时器驱动API介绍
WDG的HOSAL层驱动API在文件 components/platform/hosal/include/hosal_wdg.h。常用API函数如下:
· int hosal_wdg_init(hosal_wdg_dev_t*wdg):初始化看门狗定时器。参数说明如下:
      · wdg:看门狗定时器设备对象。其定义如下:
  1.   typedef struct {
  2.       uint8_t       port;   /**< wdg 端口 */
  3.       hosal_wdg_config_t  config; /**< wdg 配置 */
  4.       void         *priv;   /**< 用户自定义数据 */
  5.   } hosal_wdg_dev_t;
复制代码
hosal_wdg_config_t的定义如下:

  1. typedef struct {
  2.     uint32_t timeout; /*!<看门狗定时器超时,以毫秒为单位*/
  3. } hosal_wdg_config_t;
复制代码
      · 返回值:成功时返回0;否则返回非零值
· void hosal_wdg_reload(hosal_wdg_dev_t *wdg):看门狗定时器重载,即喂狗。参数说明如下:
      · wdg:看门狗定时器设备对象
      · 返回值:无
· int hosal_wdg_finalize(hosal_wdg_dev_t *wdg):看门狗定时器销毁,释放相关资源。参数说明如下:
      · wdg:看门狗定时器设备对象
      · 返回值:成功时返回0;否则返回非零值
三:看门狗定时器使用实例
示例代码如下:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <FreeRTOS.h>
  4. #include <task.h>
  5. #include <stdio.h>
  6. #include <stdbool.h>
  7. #include <hosal_wdg.h>
  8. #include <blog.h>
  9. #include "bl602_dma.h"

  10. #define TAG "wdg_demo"

  11. hosal_wdg_dev_t wdg;

  12. void wdg_init(void){
  13.     /* wdg 端口设置 */
  14.     wdg.port = 0;
  15.     /* 最大超时时间 65532/16 ms */
  16.     wdg.config.timeout = 3000;
  17.     /* 初始化WDG */
  18.     hosal_wdg_init(&wdg);
  19. }

  20. void wdg_task(void){
  21.     printf("wdg task start...\r\n");
  22.     while(true){
  23.         // 喂狗
  24.         hosal_wdg_reload(&wdg);
  25.         printf("feed wdg\r\n");
  26.         vTaskDelay(2000);
  27.     }
  28. }

  29. void counter_task(void){
  30.     size_t counter = 0;
  31.     printf("counter task start...\r\n");
  32.     while(true){
  33.         printf("counter task:counter = %d\r\n",counter++);
  34.         vTaskDelay(500);
  35.     }
  36. }

  37. void main(void) {
  38.     wdg_init();
  39.     xTaskCreate(counter_task, "counter_task", 1024, NULL, 15, NULL);
  40.     xTaskCreate(wdg_task, "wdg_task", 1024, NULL, 15, NULL);
  41. }
复制代码
4.png
4.png

本帖被以下淘专辑推荐:

用心做好保姆工作
回复

使用道具 举报

bzhou830 | 2024-8-30 15:21:35 | 显示全部楼层
选择去发光,而不是被照亮
回复

使用道具 举报

WildboarG | 2024-8-30 17:25:06 | 显示全部楼层
看懂啦,这就去喂狗哥!
回复 支持 反对

使用道具 举报

爱笑 | 2024-8-30 18:00:51 | 显示全部楼层
WildboarG 发表于 2024-8-30 17:25
看懂啦,这就去喂狗哥!

哈哈哈
用心做好保姆工作
回复 支持 反对

使用道具 举报

iiv | 2024-8-31 11:38:14 | 显示全部楼层
看懂啦,这就去喂狗哥
回复 支持 反对

使用道具 举报

bzhou830 | 2024-9-2 13:34:28 | 显示全部楼层
看懂啦,这就去喂狗哥
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

djy876 | 2024-9-9 13:50:53 | 显示全部楼层
学习打卡,看懂看不懂都要去喂狗哥
回复 支持 反对

使用道具 举报

干簧管 | 2024-10-12 19:22:15 | 显示全部楼层
第二种是进入系统看门狗复位, 看门狗复位被触发时,会通知系统复位控制器,并做好系统复位前准备,当一切就绪后进入系统看门狗复位,值得注意的是,软件可通过APB读取WSR 寄存器得知是否曾经发生看门狗系统复位。
-----------
针对系统已经无法响应中断了,重启后读取状态寄存器做判断,很好的维测手段啊,要是整个dump功能出来就完美了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则