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

[复制链接]
查看45 | 回复3 | 前天 17:53 | 显示全部楼层 |阅读模式

一、了解Ai-M61 的 看门狗

时钟源定义

Ai-M61看门狗的时钟来源有以下五种选择:

• BCLK--总线时钟 • 32K--32K 时钟 • 1K--1K 时钟(32K 的分频) • XTAL--外部晶振 • GPIO--外部 GPIO

#define WDG_CLKSRC_BCLK 0
#define WDG_CLKSRC_32K  1
#define WDG_CLKSRC_1K   2
#define WDG_CLKSRC_XTAL 3
#define WDG_CLKSRC_GPIO 4

这些宏定义了看门狗定时器的时钟源选项,不同的时钟源可以提供不同的定时精度和稳定性。

看门狗模式定义

可以选择在超时后触发中断或复位系统

#define WDG_MODE_INTERRUPT 0
#define WDG_MODE_RESET     1

二、结构体与函数接口

struct bflb_wdg_config_s

说明:这个结构体用于配置看门狗定时器的参数。包括时钟源、时钟分频值、比较值和工作模式

/**
 * @brief WDG configuration structure
 *
 * @param clock_source      Wdg clock source, use BFLB_SYSTEM_* definition
 * @param clock_div         Wdg clock divison value, from 0 to 255
 * @param comp_val          Wdg compare value
 * @param mode              Wdg reset/interrupt mode
 */
struct bflb_wdg_config_s {
    uint8_t clock_source;
    uint8_t clock_div;
    uint16_t comp_val;
    uint8_t mode;
};
parameter description
clock_source 时钟源选择
clock_div 分频值
comp_val 比较值
mode 工作模式

bflb_wdg_init

说明:初始化看门狗定时器

/**
 * @brief Initialize watchdog.
 *
 * @param [in] dev device handle
 * @param [in] config pointer to save watchdog config
 */
void bflb_wdg_init(struct bflb_device_s *dev, const struct bflb_wdg_config_s *config);
parameter description
dev 设备句柄
config 配置项

bflb_wdg_start

说明:启动看门狗定时器

/**
 * @brief Start watchdog.
 *
 * @param [in] dev device handle
 */
void bflb_wdg_start(struct bflb_device_s *dev);
parameter description
dev 设备句柄

bflb_wdg_stop

说明:停止看门狗定时器

/**
 * @brief Stop watchdog.
 *
 * @param [in] dev device handle
 */
void bflb_wdg_stop(struct bflb_device_s *dev);
parameter description
dev 设备句柄

bflb_wdg_set_countervalue

说明: 设置看门狗计数器值。

/**
 * @brief Set watchdog counter value.
 *
 * @param [in] dev device handle
 * @param [in] counter value
 */
void bflb_wdg_set_countervalue(struct bflb_device_s *dev, uint16_t value);
parameter description
dev 设备句柄
value 计数器值

bflb_wdg_get_countervalue

说明: 获取看门狗计数器值。

/**
 * @brief Get watchdog counter value.
 *
 * @param [in] dev device handle
 * @return counter value
 */
uint16_t bflb_wdg_get_countervalue(struct bflb_device_s *dev);
parameter description
dev 设备句柄
return 计数值

bflb_wdg_reset_countervalue

说明:重置计数值

/**
 * @brief Reset watchdog counter value.
 *
 * @param [in] dev device handle
 */
void bflb_wdg_reset_countervalue(struct bflb_device_s *dev);
parameter description
dev 设备句柄

bflb_wdg_compint_clear

说明:清除比较中断状态

/**
 * @brief Clear watchdog compare interrupt status.
 *
 * @param [in] dev device handle
 */
void bflb_wdg_compint_clear(struct bflb_device_s *dev);
parameter description
dev 设备句柄

三、看门狗的两种工作方式

一、看门狗定时器时钟源的选择以及分频

以选择 WDG_CLKSRC_32K 这个外部晶振的时钟源来举例,频率为 32MHz,而分频系数,也就是结构体中的 clock_div,这里系数可选 0~255,选择 31,时钟计数=时钟频率/(分频系数 +1)。也就是 32Mhz/(31+1),也就是 1Mhz,而周期与频率互为倒数,也就是 1us 一个计数。这样分频的话就是一微秒计数 +1。

二、中断

在看门狗定时器的计数器计数过程中,一旦计数器的值与三个比较器中的某比较值一致,该比较器的比较标志就会置位,并可以产生相应的比较中断。

四、简单示例

#include "bflb_wdg.h"
#include "bflb_mtimer.h"
#include "board.h"
#include "bflb_gpio.h"

struct bflb_device_s *wdg;
static volatile uint8_t wdg_int_arrived = 0;

void wdg_isr(int irq, void *arg)
{
    bflb_wdg_compint_clear(wdg);
    wdg_int_arrived = 1;
    printf("Error! wdg_isr. \r\n");
}


void wdg_task(void *arg)
{
    struct bflb_wdg_config_s wdg_cfg;
    wdg_cfg.clock_source = WDG_CLKSRC_32K;
    wdg_cfg.clock_div = 31;
    wdg_cfg.comp_val = 2000;
    wdg_cfg.mode = WDG_MODE_INTERRUPT; // 中断模式

    wdg = bflb_device_get_by_name("watchdog");
    bflb_wdg_init(wdg, &wdg_cfg);
    bflb_irq_attach(wdg->irq_num, wdg_isr, wdg);
    bflb_irq_enable(wdg->irq_num);

    wdg_int_arrived = 0;
    bflb_wdg_start(wdg);

    int i = 0;
    while (1) {
        bflb_wdg_reset_countervalue(wdg);
        bflb_mtimer_delay_ms(10);
        uint16_t value = bflb_wdg_get_countervalue(wdg);
        printf("重置狗. %d\r\n", value);
        if(i>15){
            i = 0;
            bflb_mtimer_delay_ms(2500);
        //           LOG_E("超时狗 \r\n");
        }else{
            bflb_mtimer_delay_ms(1000);
        //         LOG_E("不超时 \r\n");
        }

        i++;
        value = bflb_wdg_get_countervalue(wdg);
        printf("延迟. %d\r\n", value);
    }
}

int main(void)
{
    board_init();
    xTaskCreate(wdg_task, "wdg_task", 1024, NULL, 2, NULL);
    vTaskStartScheduler();
}

效果

捕获.JPG

这里园长写的Ai-WB2看门狗使用

【Ai-WB2入门篇】看门狗使用 https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=45189&fromuid=16612 (出处: 物联网开发者社区-安信可论坛)

干簧管

看门狗的分类及其作用 https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=43663&fromuid=16612 (出处: 物联网开发者社区-安信可论坛)

回复

使用道具 举报

大猫的鱼 | 前天 22:55 | 显示全部楼层
回复

使用道具 举报

爱笑 | 昨天 08:37 | 显示全部楼层
太棒了!
用心做好保姆工作
回复

使用道具 举报

WT_0213 | 昨天 09:01 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则