Watch Dog Timer
该示例通过 GPIO 中断触发喂狗操作重启看门狗定时器。
当GPIO检测到下降沿输入时,进入GPIO中断并触发喂狗操作。
若在定时时间内未进行喂狗操作,看门狗定时器将重启IC。
环境需求
该示例支持以下开发套件:
Hardware Platforms |
Board Name |
---|---|
RTL87x2G HDK |
RTL87x2G EVB |
更多信息请参考快速入门。
配置选项
该示例可配置的宏如下:
USE_WDT_SELECT
:选择使用WDT或AON_WDT。
硬件连线
连接P4_0和外部输入信号。
编译和下载
该示例的工程路径如下:
Project file: samples\peripheral\wdt\wdt\proj\rtl87x2g\mdk
Project file: samples\peripheral\wdt\wdt\proj\rtl87x2g\gcc
请按照以下步骤操作构建并运行该示例:
打开工程文件。
按照 快速入门 中 编译APP Image 给出的步骤构建目标文件。
编译成功后,在路径
mdk\bin
或gcc\bin
下会生成 app binapp_MP_xxx.bin
文件。按下复位按键,开始运行。
测试验证
当EVB启动后,在Debug Analyzer工具内观察如下log。
Start wdt test!
看门狗定时时间为10s。若在10s内控制外部输入信号从高电平变为低电平,则触发GPIO中断并进行喂狗操作,打印log。
[APP] !**[app] app_handle_io_msg: feeding dog, restart wdg timer.
若在10s内没有进行喂狗操作,则IC会自动重启。
代码介绍
该章节分为以下几个部分:
源码路径
工程路径:
sdk\samples\peripheral\wdt\wdt\proj
源码路径:
sdk\samples\peripheral\wdt\wdt\src
该工程的工程文件代码结构如下:
└── Project: wdt
└── secure_only_app
└── Device includes startup code
├── startup_rtl.c
└── system_rtl.c
├── CMSIS includes CMSIS header files
├── CMSE Library Non-secure callable lib
├── Lib includes all binary symbol files that user application is built on
└── rtl87x2g_io.lib
├── Peripheral includes all peripheral drivers and module code used by the application
├── rtl_rcc.c
├── rtl_pinmux.c
├── rtl_nvic.c
└── rtl_gpio.c
└── APP includes the ble_peripheral user application implementation
├── main_ns.c
├── app.c
├── app_task.c
├── io_gpio.c
└── io_wdt.c
初始化
初始化流程包括了 board_gpio_init
, driver_gpio_init
和 driver_wdt_init
。
board_gpio_init
和 driver_gpio_init
具体详见 GPIO Input Interrupt 中的 GPIO初始化 。
driver_wdt_init
包含了对watch dog外设的初始化。
执行
WDT_Start()
函数,开启看门狗定时,设置定时时间为10 seconds,超时未喂狗时EVB RESET_ALL。
WDT_Start(10000, RESET_ALL);
功能实现
主函数中执行
os_sched_start
,开启任务调度。在app_main_task
中,创建消息队列,执行driver_init
,对GPIO和WDT外设进行初始化。
...
os_msg_queue_create(&io_queue_handle, "io queue", MAX_NUMBER_OF_IO_MESSAGE, sizeof(uint32_t));
os_msg_queue_create(&evt_queue_handle, "evt queue", MAX_NUMBER_OF_EVENT_MESSAGE, sizeof(uint32_t));
driver_init();
...
当P4_0检测到外部有下降沿信号输入时,进入中断服务处理函数
GPIO_Pin_Handler
。关闭GPIO中断,屏蔽GPIO中断。
定义消息类型为IO_MSG_TYPE_GPIO,执行
app_send_msg_to_apptask
,发送消息至消息队列。退出中断函数时清除中断标志位、取消屏蔽和重新使能中断。
/* Mask and disable interrupt */
GPIO_INTConfig(GPIO_PORT, GPIO_PIN, DISABLE);
GPIO_MaskINTConfig(GPIO_PORT, GPIO_PIN, ENABLE);
uint32_t send_val = IO_MSG_TYPE_GPIO;
if (false == app_send_msg_to_apptask(&send_val))
{
APP_PRINT_ERROR0("[io_gpio] GPIO_Input_Handler: Send int_gpio_msg failed!");
//Add user code here!
GPIO_ClearINTPendingBit(GPIO_PORT, GPIO_PIN);
return;
}
/* Clear int flag, unmask and enable interrupt */
GPIO_ClearINTPendingBit(GPIO_PORT, GPIO_PIN);
GPIO_MaskINTConfig(GPIO_PORT, GPIO_PIN, DISABLE);
GPIO_INTConfig(GPIO_PORT, GPIO_PIN, ENABLE);
在
app_main_task
中,循环执行os_msg_recv
接收消息。接收到APP发来的消息后,执行app_handle_io_msg
对消息进行处理,执行wdt_feed
进行喂狗操作。