一、了解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();
}
效果
这里园长写的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
(出处: 物联网开发者社区-安信可论坛)