通过分析瑞萨已适配的看门狗驱动,我们可以得到以下信息:
1. 需要使用fsp生成一个名为g_wdt_ctrl的全局变量,用于维护看门狗所需配置
2. 看门狗时间不可动态设置,只能在fsp中默认设置
配置过程
配置代码
在emu中运行menuconfig,打开看门狗配置
运行scons --target=mdk5,把dac部分导入工程
配置看门狗
打开新生成的keil工程后运行RASC,增加看门狗相关配置
生成代码配置
修改代码
因为驱动对接上层的设备名称就叫wdt,因此我就直接使用rtt官网上的测试脚本做测试了,但是需要做以下修改:
1. 由于驱动使用fsp设置的超时时间,因此上层设置超时时间时会向上层报错,需要屏蔽上层设置超时时间的代码。
2. 测试程序默认看门狗正常工作,增加了不断喂狗的动作,反而不能判断看门狗是否工作,因此将喂狗回调去掉。
具体代码如下:
#define WDT_DEVICE_NAME "wdt" /* 看门狗设备名称 */ static rt_device_t wdg_dev; /* 看门狗设备句柄 */ static int wdt_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; char device_name[RT_NAME_MAX]; /* 判断命令行参数是否给定了设备名称 */ if (argc == 2) { rt_strncpy(device_name, argv[1], RT_NAME_MAX); } else { rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX); } /* 根据设备名称查找看门狗设备,获取设备句柄 */ wdg_dev = rt_device_find(device_name); if (!wdg_dev) { rt_kprintf("find %s failed!\n", device_name); return RT_ERROR; } /* 初始化设备 */ rt_device_init(wdg_dev); /* 启动看门狗 */ ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL); if (ret != RT_EOK) { rt_kprintf("start %s failed!\n", device_name); return -RT_ERROR; } return ret; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(wdt_sample, wdt sample);
编译固件
结果验证
\ | / - RT - Thread Operating System / | \ 5.2.0 build Feb 9 2025 22:38:00 2006 - 2024 Copyright by RT-Thread team Hello RT-Thread! msh > msh > msh > msh >wd wdt_sample msh >wdt_sample msh > \ | / - RT - Thread Operating System / | \ 5.2.0 build Feb 9 2025 22:38:00 2006 - 2024 Copyright by RT-Thread team Hello RT-Thread! msh >
其实这个位置使用动态图或者录视频的方式更加直观,具体效果为,运行wdt_sample后约2s,从打印上看,芯片重启,此时看门狗起作用。