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

2019-7-11 21:22 [复制链接] 17 994

1金钱
我的选用stm32f1的芯片,在使用看门狗设备时用官方的 rt_device_find("iwg") 查找不到设备,后来打开驱动文件,将设备名称改成"wdt"就好了。
7 W7 R! Y0 L# C4 W7 J但是在调用初始化接口 rt_device_init(wdg_dev)时会导致系统重启!请问这可能是什么原因造成的2 u! |. Z. m8 v3 I0 M# j6 P
$ w5 D& f$ q! S" _! k
% q  n5 ~) Z; n1 ^9 G" Z6 ^

使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-7-12 08:24:13 | 显示全部楼层
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
; Q* l1 A; I& `& J" i1 S还有你用到的是那个 bsp?
使用道具 举报 回复
发表于 2019-7-12 08:44:43 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:24$ \1 i9 m# T  m/ _* I
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
, r& a: M! H& q& F; {/ u还有你用到的是那个 bsp? ...

9 H+ n+ F% w  W* @  Y+ e4 w: t你是不是用了iwdg_sample.c这个测试的。7 e& c9 ~. z3 [' R
如果是这个就一定会出错,驱动里面的看门狗超时时间是秒为单位,sample里是毫秒为单位。$ x' V/ ]" ^- R6 }/ m
测试的时候会提示设置数值过大,然后系统重启。
6 |$ E. h; R! k. |- F* G5 z6 n# D" v9 T
5 l" X& d5 ^8 Y& e如果你是上述问题,那么你只需把timeout 改到 0-32之间就可以了。! R: C5 W3 n+ O: R! X$ k8 Z
; ~3 n2 D' \% r, Q: Q6 S: N
这个问题昨天已经反馈给RTT了,据说已经修复,你可以看下这里是否更新https://github.com/RT-Thread-pac ... aster/iwdg_sample.c
使用道具 举报 回复
发表于 2019-7-12 09:34:54 | 显示全部楼层
本帖最后由 乐于 于 2019-7-12 09:38 编辑
( X$ u) \- ]2 {1 u, \' d8 D- G* I6 W
0 M& ?6 ^+ e' m$ Q# q5 Q) U3 {6 q  ^' @
使用道具 举报 回复
发表于 2019-7-12 09:35:45 | 显示全部楼层
本帖最后由 乐于 于 2019-7-12 09:38 编辑
8 z  i+ n) K4 m3 X# g! g, s
1 @* H2 T$ r% D) @) p2 h+ g
6 }6 z' E7 A+ T1 C: S/ j
使用道具 举报 回复
发表于 2019-7-12 09:39:17 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:24$ L, {% L4 u* w7 `& q! ^
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
2 u& G% }5 V3 B# P3 a还有你用到的是那个 bsp? ...

& V. }8 S' E+ u3 ]; M3 u) V: t" z/*
, Y; b& g, m; E# X * Copyright (c) 2006-2018, RT-Thread Development Team# s7 z7 K' d+ c" s
*! n, W/ f0 @, S& E8 q0 Y* p) w
* SPDX-License-Identifier: Apache-2.0# O% V" W; e. P
*6 C6 D4 C8 B( N$ P# m4 I
* Change Logs:
1 ]6 c6 V, y1 N. M( M8 N * Date           Author       Notes
: T& G, i6 B. _' l; K5 o0 ` * 2018-09-25     misonyo      first edition." G6 H7 M  f  @
*/
$ a5 V0 m( P0 K: U6 N% s/*) Z; X5 {/ ^; \: r; @* G4 n# N; G
* 程序清单:这是一个独立看门狗设备使用例程
4 _3 Z& y* q% u$ L! ^; ?, P" `5 G * 例程导出了 iwdg_sample 命令到控制终端
$ F) _. W  i# y * 命令调用格式:iwdg_sample iwg
% a  r- A# |# I( z; S * 命令解释:命令第二个参数是要使用的看门狗设备名称,为空则使用例程默认的看门狗设备。" s6 g$ ]) u/ J
* 程序功能:程序通过设备名称查找看门狗设备,然后初始化设备并设置看门狗设备溢出时间。
% g' e7 Y5 }) ?0 P" n. h/ b3 k *           然后设置空闲线程回调函数,在回调函数里会喂狗。& Q: @, K" m* ^5 ]8 |
*/8 E: ^# m* y" W+ v/ e- @) q4 x
, ]$ Q9 U# A. p0 {1 C( h
#include <rtthread.h>; _! `- K! M( t
#include <rtdevice.h>: k) R; }( }6 Y7 f4 [% j
. w- F. \5 H/ z' l( ^6 K6 c
#define IWDG_DEVICE_NAME    "wdt"    /* 看门狗设备名称 *// Z9 L' K8 m$ L: t
5 C& A- q! y+ O) t& F4 ~
static rt_device_t wdg_dev;         /* 看门狗设备句柄 */+ S- F/ V6 |, q: n/ {' \$ J& G8 \0 T

7 n+ N8 s% V* I' \2 N$ c& w+ q; d' xstatic void idle_hook(void)' r& s# `) h$ Z, r' |
{
* o- ?: a$ [; j1 p0 E- W2 i% ^    /* 在空闲线程的回调函数里喂狗 */9 g( d7 u& d" I/ i2 @& D' t( s
    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);: l5 @  ^7 u% N! T
    rt_kprintf("feed the dog!\n ");, F( t6 E1 x' |& }9 x
}% v/ K6 r8 q7 D3 _5 T7 d3 w/ q8 k
$ y# `; p5 h9 o' Z! m0 \2 A
static int iwdg_sample(int argc, char *argv[])
9 a4 g" I% O- Y- g4 i{$ ~0 n, h  L% f
    rt_err_t ret = RT_EOK;
/ i; e- H! h5 y& U+ L    rt_uint32_t timeout = 10;    /* 溢出时间 */
% |. H3 S' C/ o" I  k    char device_name[RT_NAME_MAX];- k" C5 f& w( k2 C- Y2 W7 k* l

. i( L( ]# L" n* K, x+ @    /* 判断命令行参数是否给定了设备名称 */
9 H/ s+ A2 i0 Q# p- ]6 ~& Y3 I    if (argc == 2)% L& n+ h5 c* C- X
    {! \/ d- U! m$ f3 G8 {+ i
        rt_strncpy(device_name, argv[1], RT_NAME_MAX);9 p6 N5 ^) ?6 f) {4 [
    }. {/ z, e% O4 c  ?) y% P
    else
7 b6 z0 @/ }- Y- {6 b5 J    {
# @/ I$ v6 c: n        rt_strncpy(device_name, IWDG_DEVICE_NAME, RT_NAME_MAX);# Z6 D" a, T1 e
    }
+ N% {; Z$ Y; T$ z& J& E1 q    /* 根据设备名称查找看门狗设备,获取设备句柄 */3 R6 G# M5 ~! r7 N+ B& k2 u, B# f
    wdg_dev = rt_device_find(device_name);
' }" {' {7 I8 g- g9 A2 ^/ B! A" K    if (!wdg_dev)
3 a8 N) e$ @; n5 W' {7 P    {
6 W* H$ A! J5 n9 f  ~, |        rt_kprintf("find %s failed!\n", device_name);
( B( P# ]5 q* j  F9 G        return RT_ERROR;
5 c8 e" z7 P. {    }! z( ^+ S; C/ X; o8 [+ ~3 l; F6 e
        else
% F0 U/ b. b% g% c4 v1 r5 D        {: w3 K% p  {: m. p2 P% Q! Y* s
                rt_kprintf("find %s succeed!\n", device_name);
- c  V5 a- L4 Q' \% @& [) L2 L        }0 ]# r' |6 z2 v; \; q
    /* 初始化设备 */
/ t3 \2 v5 b! i/ m5 `8 U. B6 T/ M    ret = rt_device_init(wdg_dev);
* X. E+ P& t+ t* k1 X- L+ e    if (ret != RT_EOK)
# _8 _5 I: k3 D    {
7 O' o; z5 j5 e) q9 Z2 I        rt_kprintf("initialize %s failed!\n", device_name);: `' `; {4 Q# K) h$ y
        return RT_ERROR;
2 F5 R, ~2 {0 V4 |, F3 W    }1 p4 t- p5 d7 C% V) g# h- p8 U
        else
% E0 y# _8 B+ O9 I        {3 Q0 @. ?9 a$ F; m6 C
                rt_kprintf("initialize %s succeed!\n", device_name);
1 B3 ?( w6 Z; `7 |7 V' q8 a        }
5 _" \- }8 I* I1 u( S1 a    /* 设置看门狗溢出时间 */
0 a  F% P& M; q' Z2 T9 F    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);* z- [# o( B% M8 _. p' C
    if (ret != RT_EOK), l! e! `& v" ~6 q& e8 d5 u
    {
4 U' C0 k2 J" t; U  p        rt_kprintf("set %s timeout failed!\n", device_name);
% \6 A0 q4 e+ \, R( [        return RT_ERROR;
# C. ~; E* ?- t# u; m$ n    }
3 K" _- M8 W/ x' N8 e& Y* F        else" w/ T; `3 F# G
        {1 L, n4 w& w' ?3 f2 l- G7 |
                rt_kprintf("set %s timeout succeed!\n", device_name);
  e" U( Q8 ^; h6 z        }
4 n! t) R7 i; N, M, E- P, f    /* 设置空闲线程回调函数 */3 R! }' r+ q0 X9 N, T, ^5 U
    rt_thread_idle_sethook(idle_hook);% x; g  @, s2 D: G

4 Q% n2 m6 G. e/ j* w    return ret;
2 ?, m. \, W4 k: |}( M2 J4 S+ _2 L4 S3 A1 X
/* 导出到 msh 命令列表中 */
3 O3 C/ I! f2 [* B2 r7 dMSH_CMD_EXPORT(iwdg_sample, iwdg sample);3 E7 y. b. u1 O1 j, M
使用道具 举报 回复
发表于 2019-7-12 09:41:32 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:24
* D- J0 _0 Y* T6 V2 J, a一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
  K) ~' T8 {% O- J: l4 Z还有你用到的是那个 bsp? ...
# a: ?8 M- p0 \4 F
执行初始化函数就会失败,我不太确定我得设备名称"wdt"是不是对的,官方例程是"iwd"
使用道具 举报 回复
发表于 2019-7-12 09:43:05 | 显示全部楼层
whj467467222 发表于 2019-7-12 08:44/ M: P, X; p/ D' @
你是不是用了iwdg_sample.c这个测试的。
0 H0 g  W# |' x1 q9 y如果是这个就一定会出错,驱动里面的看门狗超时时间是秒为单位, ...

: C! [( Z5 q# j" t; p, H4 Y( W没有更新啊。。。
使用道具 举报 回复
发表于 2019-7-12 09:54:13 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:24
, u1 o% i/ g# p/ v5 F一调用就重启?把你的看门狗应用代码 完整的贴出来看看?# G& h$ o! c5 f
还有你用到的是那个 bsp? ...
3 I" H0 D* m+ ~& H* U2 c
bsp根据官方模板自己制作的,
使用道具 举报 回复
发表于 2019-7-12 10:14:56 | 显示全部楼层
乐于 发表于 2019-7-12 09:39" Z  `, E! q+ i5 _  D% {# ?
/*
+ H* t0 i& U$ s9 L' {$ q' [ * Copyright (c) 2006-2018, RT-Thread Development Team
4 m7 z$ B6 ^3 p3 k/ W" Y *
1 b# s9 ^8 P" l9 X
就是这个文件,我昨天已经反馈过了。, H2 L( U, T: `! a) B) j) e& g
这个文件有两处错误; s5 p7 u0 E* A$ N
1,修改名字“iwg”为“wdt”
5 C- w+ J" H* J2,修改timeout 为1.就可以了。
使用道具 举报 回复
发表于 2019-7-12 10:15:30 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:24* F% U" W; l. X" }; b' c% O3 L
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?& w2 o! O0 _4 p
还有你用到的是那个 bsp? ...

# q8 i3 c" ~6 P, ~4 j昨天下午我们才讨论的这个问题,晚上就被人家测试出来了
使用道具 举报 回复
发表于 2019-7-12 11:12:23 | 显示全部楼层
乐于 发表于 2019-7-12 09:41
" U4 W/ ]: T& j" d* _  w执行初始化函数就会失败,我不太确定我得设备名称"wdt"是不是对的,官方例程是"iwd" ...
' j7 l5 P. L" c; y; e
可以输入 MSH 命令: list_device 查看下是否存在看门狗设备。如果存在 就接着输入 命令: iwdg_sample xxx (xxx 表示看门狗设备名称)
- N3 o! y( B+ a1 h2 h1 V& P
使用道具 举报 回复
发表于 2019-7-12 14:16:24 | 显示全部楼层
来一颗糖 发表于 2019-7-12 11:122 g' f! ^; \+ x# q: K% y
可以输入 MSH 命令: list_device 查看下是否存在看门狗设备。如果存在 就接着输入 命令: iwdg_sample xx ...
: v# j# c$ ?* V5 a& o/ J
确实是例程有问题
使用道具 举报 回复
发表于 2019-9-11 10:00:12 | 显示全部楼层
乐于 发表于 2019-7-12 14:16
; }2 p6 S+ p: l* _1 U确实是例程有问题

6 r4 {* ~2 @* |2 F那现在怎么使用这个看门狗呢? 是调节溢出时间吗?
使用道具 举报 回复
发表于 2019-9-11 12:00:56 | 显示全部楼层
jamguo 发表于 2019-9-11 10:00$ y3 b- J+ |, H$ h8 Z, m
那现在怎么使用这个看门狗呢? 是调节溢出时间吗?
, a% e5 o+ Y' ?9 x
记得在 CubeMX 里面配置 IWDG,然后 BSP_USING_WDT
) H# n) A& s( v
- v- r5 \4 K& {5 \* u还有例程里面没有启动看门狗5 u6 j' P+ q# L# w1 x. f2 Q
) l) x7 C8 _  S% O
  1. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, (0));
复制代码
使用道具 举报 回复
发表于 2019-9-11 15:51:01 | 显示全部楼层
wuhanstudio 发表于 2019-9-11 12:00, R$ O9 p- {2 ^( k5 m* e$ J; S
记得在 CubeMX 里面配置 IWDG,然后 BSP_USING_WDT
6 Q7 M6 ~! M% K4 _4 I& \
( G9 x9 c; A& C/ J! z. W8 e还有例程里面没有启动看门狗

& P; e4 h. j; i$ {7 Q话说  这个。。。。
* M0 \/ N3 `1 O9 e( x: v! Q. W# |$ \
static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
" `3 T5 J; y1 l$ ?  F0 G{
9 r2 K( ]; A. t2 S0 E    switch (cmd)
( D- @4 r" g0 J2 ^    {5 u" y! _: z3 t% u4 W! z- m
        /* feed the watchdog */6 _& u5 M. ~4 y  f
    case RT_DEVICE_CTRL_WDT_KEEPALIVE:
0 k; @; l% n* p) \4 }& F        HAL_IWDG_Refresh(&hiwdg);$ A$ o( |8 i7 i
        break;
4 k4 J% u+ a' a6 y) D        /* set watchdog timeout */
' H1 q% f1 X( }    case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:* |- F5 _' C& u$ [* p
        hiwdg.Init.Reload = *((rt_uint32_t*)arg);# ]  l  V) v, j5 ]8 H
        if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
2 u/ w$ r9 X$ ]- d2 j1 p+ N        {
& ?5 G) e6 m5 H: A            LOG_E("wdg set timeout failed.");
/ G* A- I+ q% Z            return -RT_ERROR;( ]8 {$ r+ e' j( G2 F* ~' D
        }% C- Y0 F  [, K: D$ H
        break;
* E& e' T0 j4 [" e0 o0 R! r* P    default:5 M; k5 E3 W6 i2 }
        return -RT_ERROR;% \& Q0 c/ B9 @5 C$ [
    }' k" B: Y+ c8 B
    return RT_EOK;6 _* R1 N/ }- k; O
}. ?. v7 Y5 \$ j+ n7 g, z3 z

3 R* n2 i$ X& Q/ w) T/ n2 f) m# ?' r
只有设置时间和初始化功能啊/////
; Y+ L3 Q! J7 S% s5 `! i; q. ^9 v. n1 ~2 h. @% }+ K7 L7 ~1 L0 E

/ `2 y$ j; z: O4 A* F文档里0 {$ M% f/ t/ K
/ U, E5 s+ B0 K
$ r, ^) J6 j1 v- @. h
#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) /* 停止看门狗 */
, w9 w, u) j& F+ k$ ^. `6 ^) ]$ V0 _5 F1 P7 U4 M
: I5 A) ^' l  l( _4 b' B, P0 D
这些是干嘛的/////
使用道具 举报 回复
发表于 2019-9-12 16:04:34 | 显示全部楼层
本帖最后由 wuhanstudio 于 2019-9-12 16:15 编辑
# }6 v' b  q# x, O4 ]0 U9 l
jamguo 发表于 2019-9-11 15:51
% K2 `. G% R5 A3 x9 W+ k话说  这个。。。。! J. `( q" \. n  C: l& ?* J' l
% U; [1 Q' t; S
static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
- o( b3 @! J9 ~! ?" g" e' \+ a( C; n1 G
我以为写驱动的小伙伴要出来背锅了,看样子是你源码版本有点老了,更新一下吧
使用道具 举报 回复
发表于 2019-9-16 09:38:50 | 显示全部楼层
wuhanstudio 发表于 2019-9-12 16:04" ?3 ]& a' W1 V  V0 C4 ]
我以为写驱动的小伙伴要出来背锅了,看样子是你源码版本有点老了,更新一下吧 ...

+ d2 T! Q9 ?, P5 ]& b) |4.01版本的。。。。我加了其他功能在里边了,不过没有停止看门狗的这个功能,记得是独立看门狗打开停不了吧。。。现在可以了 ,是这个驱动设定时间的问题 它以前只有溢出时间,没有加分频系数在里边,所以你设定多少都是有一个最大值的,把分屏系数加进去就好了
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表