看门狗设备初始化接口的问题

发布于 2019-07-11 21:22:13
我的选用stm32f1的芯片,在使用看门狗设备时用官方的 rt_device_find("iwg") 查找不到设备,后来打开驱动文件,将设备名称改成"wdt"就好了。
但是在调用初始化接口 rt_device_init(wdg_dev)时会导致系统重启!请问这可能是什么原因造成的


查看更多

关注者
0
被浏览
1.3k
17 个回答
来一颗糖
来一颗糖 2019-07-12
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
还有你用到的是那个 bsp?
whj467467222
whj467467222 2019-07-12
来一颗糖 发表于 2019-7-12 08:24
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
还有你用到的是那个 bsp? ...


你是不是用了iwdg_sample.c这个测试的。
如果是这个就一定会出错,驱动里面的看门狗超时时间是秒为单位,sample里是毫秒为单位。
测试的时候会提示设置数值过大,然后系统重启。

如果你是上述问题,那么你只需把timeout 改到 0-32之间就可以了。

这个问题昨天已经反馈给RTT了,据说已经修复,你可以看下这里是否更新https://github.com/RT-Thread-packages/peripheral-sample/blob/master/iwdg_sample.c
乐于
乐于 2019-07-12
    本帖最后由 乐于 于 2019-7-12 09:38 编辑



乐于
乐于 2019-07-12
    本帖最后由 乐于 于 2019-7-12 09:38 编辑



乐于
乐于 2019-07-12
来一颗糖 发表于 2019-7-12 08:24
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
还有你用到的是那个 bsp? ...


/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-09-25 misonyo first edition.
*/
/*
* 程序清单:这是一个独立看门狗设备使用例程
* 例程导出了 iwdg_sample 命令到控制终端
* 命令调用格式:iwdg_sample iwg
* 命令解释:命令第二个参数是要使用的看门狗设备名称,为空则使用例程默认的看门狗设备。
* 程序功能:程序通过设备名称查找看门狗设备,然后初始化设备并设置看门狗设备溢出时间。
* 然后设置空闲线程回调函数,在回调函数里会喂狗。
*/

#include
#include

#define IWDG_DEVICE_NAME "wdt" /* 看门狗设备名称 */

static rt_device_t wdg_dev; /* 看门狗设备句柄 */

static void idle_hook(void)
{
/* 在空闲线程的回调函数里喂狗 */
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
rt_kprintf("feed the dog!\n ");
}

static int iwdg_sample(int argc, char *argv[])
{
rt_err_t ret = RT_EOK;
rt_uint32_t timeout = 10; /* 溢出时间 */
char device_name[RT_NAME_MAX];

/* 判断命令行参数是否给定了设备名称 */
if (argc == 2)
{
rt_strncpy(device_name, argv[1], RT_NAME_MAX);
}
else
{
rt_strncpy(device_name, IWDG_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;
}
else
{
rt_kprintf("find %s succeed!\n", device_name);
}
/* 初始化设备 */
ret = rt_device_init(wdg_dev);
if (ret != RT_EOK)
{
rt_kprintf("initialize %s failed!\n", device_name);
return RT_ERROR;
}
else
{
rt_kprintf("initialize %s succeed!\n", device_name);
}
/* 设置看门狗溢出时间 */
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
if (ret != RT_EOK)
{
rt_kprintf("set %s timeout failed!\n", device_name);
return RT_ERROR;
}
else
{
rt_kprintf("set %s timeout succeed!\n", device_name);
}
/* 设置空闲线程回调函数 */
rt_thread_idle_sethook(idle_hook);

return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(iwdg_sample, iwdg sample);
乐于
乐于 2019-07-12
来一颗糖 发表于 2019-7-12 08:24
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
还有你用到的是那个 bsp? ...


执行初始化函数就会失败,我不太确定我得设备名称"wdt"是不是对的,官方例程是"iwd"
乐于
乐于 2019-07-12
whj467467222 发表于 2019-7-12 08:44
你是不是用了iwdg_sample.c这个测试的。
如果是这个就一定会出错,驱动里面的看门狗超时时间是秒为单位, ...


没有更新啊。。。
乐于
乐于 2019-07-12
来一颗糖 发表于 2019-7-12 08:24
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
还有你用到的是那个 bsp? ...


bsp根据官方模板自己制作的,
whj467467222
whj467467222 2019-07-12
乐于 发表于 2019-7-12 09:39
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*


就是这个文件,我昨天已经反馈过了。
这个文件有两处错误
1,修改名字“iwg”为“wdt”
2,修改timeout 为1.就可以了。
whj467467222
whj467467222 2019-07-12
来一颗糖 发表于 2019-7-12 08:24
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
还有你用到的是那个 bsp? ...


昨天下午我们才讨论的这个问题,晚上就被人家测试出来了:lol
来一颗糖
来一颗糖 2019-07-12
乐于 发表于 2019-7-12 09:41
执行初始化函数就会失败,我不太确定我得设备名称"wdt"是不是对的,官方例程是"iwd" ...

可以输入 MSH 命令: list_device 查看下是否存在看门狗设备。如果存在 就接着输入 命令: iwdg_sample xxx (xxx 表示看门狗设备名称)
乐于
乐于 2019-07-12
来一颗糖 发表于 2019-7-12 11:12
可以输入 MSH 命令: list_device 查看下是否存在看门狗设备。如果存在 就接着输入 命令: iwdg_sample xx ...


确实是例程有问题
jamguo
jamguo 2019-09-11
乐于 发表于 2019-7-12 14:16
确实是例程有问题


那现在怎么使用这个看门狗呢? 是调节溢出时间吗?
wuhanstudio
wuhanstudio 2019-09-11
jamguo 发表于 2019-9-11 10:00
那现在怎么使用这个看门狗呢? 是调节溢出时间吗?

记得在 CubeMX 里面配置 IWDG,然后 BSP_USING_WDT

还有例程里面没有启动看门狗

rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, (0));
jamguo
jamguo 2019-09-11
wuhanstudio 发表于 2019-9-11 12:00
记得在 CubeMX 里面配置 IWDG,然后 BSP_USING_WDT

还有例程里面没有启动看门狗


话说 这个。。。。

static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
{
switch (cmd)
{
/* feed the watchdog */
case RT_DEVICE_CTRL_WDT_KEEPALIVE:
HAL_IWDG_Refresh(&hiwdg);
break;
/* set watchdog timeout */
case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
hiwdg.Init.Reload = *((rt_uint32_t*)arg);
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
LOG_E("wdg set timeout failed.");
return -RT_ERROR;
}
break;
default:
return -RT_ERROR;
}
return RT_EOK;
}


只有设置时间和初始化功能啊/////


文档里


#define RT_DEVICE_CTRL_WDT_GET_TIMEOUT (1) /* 获取溢出时间 */#define RT_DEVICE_CTRL_WDT_SET_TIMEOUT (2) /* 设置溢出时间 */#define RT_DEVICE_CTRL_WDT_GET_TIMELEFT (3) /* 获取剩余时间 */#define RT_DEVICE_CTRL_WDT_KEEPALIVE (4) /* 喂狗 */#define RT_DEVICE_CTRL_WDT_START (5) /* 启动看门狗 */#define RT_DEVICE_CTRL_WDT_STOP (6) /* 停止看门狗 */


这些是干嘛的/////
wuhanstudio
wuhanstudio 2019-09-12
    本帖最后由 wuhanstudio 于 2019-9-12 16:15 编辑


jamguo 发表于 2019-9-11 15:51
话说 这个。。。。

static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)

我以为写驱动的小伙伴要出来背锅了,看样子是你源码版本有点老了,更新一下吧
jamguo
jamguo 2019-09-16
wuhanstudio 发表于 2019-9-12 16:04
我以为写驱动的小伙伴要出来背锅了,看样子是你源码版本有点老了,更新一下吧 ...


4.01版本的。。。。我加了其他功能在里边了,不过没有停止看门狗的这个功能,记得是独立看门狗打开停不了吧。。。现在可以了 ,是这个驱动设定时间的问题 它以前只有溢出时间,没有加分频系数在里边,所以你设定多少都是有一个最大值的,把分屏系数加进去就好了

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友