HaaS EDU K1设备资源 之 Watchdog

1、概述

嵌入式系统在受到外界的强干扰的时候或程序出现异常后会出现程序跑飞之后无法恢复的情况,看门狗就是为了在这种情况发生之后对系统进行复位。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)。

从实现方式上来看,看门狗分为两种:硬件看门狗和软件看门狗。硬件看门狗就是使用逻辑电路或者专用的看门狗芯片。软件看门狗则相对复杂一点,一般的实现都是通过一个守护任务,定期的查询喂狗动作,一旦喂狗超时,就会触发重启。

 

2、HAL接口介绍

AliOS Things对于不同底层驱动的wdg操作实现,统一封装成本文所述hal wdg接口。

hal相关头文件位于目录:include/aos/hal。

HaaS1000上hal相关实现位于具体的mcu目录下,如:platform/mcu/haas1000/hal/。

2.1、API列表

hal_wdg_init

初始化指定看门狗

hal_wdg_reload

重载指定看门狗,喂狗

hal_wdg_finalize

关闭指定看门狗

 

2.2、API详情

请参考include/aos/hal/wdg.h

 

2.2.1、相关结数据结构

wdg_dev_t

typedef struct {

    uint8_t      port;   /* wdg port */

    wdg_config_t config; /* wdg config */

    void        *priv;   /* priv data */

} wdg_dev_t;

 

wdg_config_t

typedef struct {

    uint32_t timeout; /* Watchdag timeout ms */

} wdg_config_t;

 

2.2.2、hal_wdg_init

初始化指定看门狗

函数原型

int32_t hal_wdg_init(wdg_dev_t *wdg);

参数

wdg_dev_t *wdg

入参

看门狗设备描述

用户自定义一个wdg_dev_t结构体

返回值

返回成功或失败, 返回0表示看门狗初始化成功,非0表示失败

调用示例

wdg_dev_t wdg1;

/* wdg port set */

wdg1.port = WDG1_PORT_NUM;

/* set reload time to 1000ms */

wdg1.config.timeout = 1000; /* 1000ms */

ret = hal_wdg_init(&wdg1);

 

2.2.3、hal_wdg_reload

重载指定看门狗,喂狗

函数原型

void hal_wdg_reload(wdg_dev_t *wdg);

参数

wdg_dev_t *wdg

入参

看门狗设备描述

使用hal_wdg_init时传入wdg_dev_t结构体

返回值

返回成功或失败, 返回0表示看门狗重载成功,非0表示失败

调用示例

ret = hal_wdg_reload(&wdg1);

 

2.2.4、hal_wdg_finalize

关闭指定看门狗

函数原型

int32_t hal_wdg_finalize(wdg_dev_t *wdg);

参数

wdg_dev_t *wdg

入参

看门狗设备描述

使用hal_wdg_init时传入wdg_dev_t结构体

返回值

返回成功或失败, 返回0表示看门狗关闭成功,非0表示失败

调用示例

ret = hal_wdg_finalize(&wdg1);

 

3、示例介绍

这一节,将学习驱动板载的watchdog如果触发重启的。

 

3.1、硬件实现

本章用到的硬件电路在开发板上默认是已经连接好了的。这里用到的看门狗芯片是ADM706S

默认的看门狗超时周期为1.6s, WDI管脚有电平转换就会重置定时器(喂狗成功,否则就会重启主MCU)。

 

3.2、软件设计

看门狗部分测试代码位于

application/example/edu_demo/mfg_test/watchdog_test.c

驱动代码位于

platform/board/haaseduk1/drivers/watchdog.c

当前代码已经实现了周期性喂狗的操作,发生在触发ticks的时候。

3.2.1、喂狗实现

HaaS EDU K1的喂狗操作发生在ticks打点的时间,文件位于

platform/board/haaseduk1/config/k_config.c

void krhino_tick_hook(void)

{

    static unsigned int idx = 0;

    if((idx % (RHINO_CONFIG_TICKS_PER_SECOND / 2) ) == 0) {

        watchdog_feeddog();

    }

    idx ++;

}

 

3.2.2、喂狗操作

void watchdog_feeddog(void)

{

    if(watchdog_flag == 1) {

        return;

    }

    if(wdg_gpio.port == 0) {

        wdg_gpio.port   = HAL_IOMUX_PIN_P4_5;

        wdg_gpio.config = OUTPUT_PUSH_PULL;

        hal_gpio_init(&wdg_gpio);

    }

    hal_gpio_output_toggle(&wdg_gpio);

}

 

3.3、编译与下载

3.3.1、代码准备

打开edu_demo的产测开关

application/example/edu_demo/Config.in

在该文件中修改编译选项,打开EDK_DEMO_FACTORY_TEST_ENABLIE开关。

config EDK_DEMO_FACTORY_TEST_ENABLIE

    bool "enable factory test function"

    default y

加入Demo到启动代码

application/example/edu_demo/app_entry.c

函数application_start中注释掉menu_init();,添加watchdog_stopfeed();  

      //menu_init();

        watchdog_stopfeed(); //停止喂狗,1.6s触发重启

 

3.3.2、编译

命令行方式进行编译

aos make distclean

aos make edu_demo@haaseduk1 -c config

aos make

 

3.3.3、烧录

  • 命令行方式
aos upload
  • 图形界面方式

详见HaaS EDU K1 快速开始 第4.3.3章节-使用GUI工具烧录部分。

 

开发者技术支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号

更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/

猜你喜欢

转载自blog.csdn.net/HaaSTech/article/details/114646929