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

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

1金钱
我的选用stm32f1的芯片,在使用看门狗设备时用官方的 rt_device_find("iwg") 查找不到设备,后来打开驱动文件,将设备名称改成"wdt"就好了。
' |+ X& P* j5 g但是在调用初始化接口 rt_device_init(wdg_dev)时会导致系统重启!请问这可能是什么原因造成的5 @, s( W% b. D0 C
# P( O2 x+ {2 E
+ {- Z; N3 n% o, X9 n/ m

使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-7-12 08:24:13 | 显示全部楼层
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
9 e5 l' _  e8 q- Y还有你用到的是那个 bsp?
使用道具 举报 回复
发表于 2019-7-12 08:44:43 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:24
* A/ F1 [! w9 S0 B一调用就重启?把你的看门狗应用代码 完整的贴出来看看?: Z/ ~) m) p, C4 H& V
还有你用到的是那个 bsp? ...
7 z& H  ?- I/ n' {! P# D- h
你是不是用了iwdg_sample.c这个测试的。
" s1 O9 b6 T; j: N+ N, v+ s7 T如果是这个就一定会出错,驱动里面的看门狗超时时间是秒为单位,sample里是毫秒为单位。
) E$ M* n5 d2 |7 q: w测试的时候会提示设置数值过大,然后系统重启。
) I; Q  k% E( w9 P1 H( a& y) j2 ~- k5 D, r
如果你是上述问题,那么你只需把timeout 改到 0-32之间就可以了。
; s  j, H9 r' \2 j3 |( D' U! P
6 ]8 B* ]1 r& f这个问题昨天已经反馈给RTT了,据说已经修复,你可以看下这里是否更新https://github.com/RT-Thread-pac ... aster/iwdg_sample.c
使用道具 举报 回复
发表于 2019-7-12 09:34:54 | 显示全部楼层
本帖最后由 乐于 于 2019-7-12 09:38 编辑 7 E9 `& Z# B1 `" J4 z

( d& ]9 R- M5 Z2 y, M2 Y* s1 K: m2 j4 t" t! V% l* Q6 w+ T
使用道具 举报 回复
发表于 2019-7-12 09:35:45 | 显示全部楼层
本帖最后由 乐于 于 2019-7-12 09:38 编辑
1 d8 p+ o4 q  \, ?0 g% e1 w3 I  Z+ {0 ]$ ^& w$ u% v; `- f$ l4 W
8 N, O) i$ C! J- c' b  _3 x( T
使用道具 举报 回复
发表于 2019-7-12 09:39:17 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:24
, i. A$ \8 y! @# Z/ j3 B$ I0 A0 D: a一调用就重启?把你的看门狗应用代码 完整的贴出来看看?
3 a  }- A' N6 c5 E' t还有你用到的是那个 bsp? ...

+ S! i3 Z+ D: r6 ^; a, t/*
5 A  l+ D; b; y$ Q0 s * Copyright (c) 2006-2018, RT-Thread Development Team
( p5 K7 _' X) Q  l& K *% ^# U0 ?. M; a* h' E/ I
* SPDX-License-Identifier: Apache-2.0
4 Z# ]% B5 C- N" ]+ A& V# V *; T- d& t$ p4 u( L0 ^. z9 [) b0 P1 r! S
* Change Logs:
# w) K8 l3 i  \/ X8 k * Date           Author       Notes  y' X4 r4 W7 P' k+ s+ B* ?$ l: O
* 2018-09-25     misonyo      first edition.) ^: l/ k- H/ p; G" _9 H1 t; p
*/
: a, i1 ~. U' V, G# N2 ?$ g2 T/*. a: A$ O4 e2 f0 x1 J
* 程序清单:这是一个独立看门狗设备使用例程% D5 n; I4 Z- X$ D" O& Z4 Z
* 例程导出了 iwdg_sample 命令到控制终端) L7 f7 L7 b- ~
* 命令调用格式:iwdg_sample iwg
. c  u1 q0 F5 m5 K7 P/ f) I- y * 命令解释:命令第二个参数是要使用的看门狗设备名称,为空则使用例程默认的看门狗设备。7 c9 y+ ^: P6 _& s. t* b
* 程序功能:程序通过设备名称查找看门狗设备,然后初始化设备并设置看门狗设备溢出时间。
0 N/ k+ \  m: L# y, g *           然后设置空闲线程回调函数,在回调函数里会喂狗。1 Y/ C9 x. y6 k& H) Z% b/ c6 t
*/$ _4 A6 R5 ~$ M1 ^8 k; F
9 j& p# N2 F+ D
#include <rtthread.h>& x2 j$ M* I$ r" T
#include <rtdevice.h>
) ~9 \% g: C) v9 L5 ^$ L0 [6 R. J* t' o# @/ D
#define IWDG_DEVICE_NAME    "wdt"    /* 看门狗设备名称 */. d* w1 [$ h, f# P, S6 v, j

' e9 B) j" G  L" A3 Istatic rt_device_t wdg_dev;         /* 看门狗设备句柄 */
) v$ M3 \, f/ X0 W& k1 d$ J6 n# [! R2 A: }; T2 v
static void idle_hook(void)  p3 O$ H% f- d5 c  d$ ~* A
{& s# a7 s9 O0 T
    /* 在空闲线程的回调函数里喂狗 */4 I' a7 s7 V/ K9 t
    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);# A8 t7 h3 B1 `( W* L: k4 j7 k( k, X
    rt_kprintf("feed the dog!\n ");
" u2 ^% x7 l( c3 F: P}
4 \- Y7 i5 N8 w1 o5 q* }$ t5 Q7 z% x: j
static int iwdg_sample(int argc, char *argv[])
& @& i' ]. L, q8 |9 {. Z1 i" t{: |5 A4 ~9 c) }) j6 f  `
    rt_err_t ret = RT_EOK;% |9 J5 K' ^6 `( {
    rt_uint32_t timeout = 10;    /* 溢出时间 */6 m. }4 W# B5 d; u' @7 h0 }
    char device_name[RT_NAME_MAX];( l) T6 F5 |& j  f- X
4 }( E8 D' m6 m& `8 E; f6 e/ v
    /* 判断命令行参数是否给定了设备名称 */
9 v) s# U' ~7 [0 I    if (argc == 2)# B( }; B8 V+ {. o
    {: E+ Z% v0 ]1 P
        rt_strncpy(device_name, argv[1], RT_NAME_MAX);
9 c6 q( K+ v% g5 s* n* v$ S' g    }4 X1 _6 a0 b1 ^" a' M
    else
4 a$ K" U* i: f4 i- [9 K    {" b" t$ c+ j8 X* D' m  ?
        rt_strncpy(device_name, IWDG_DEVICE_NAME, RT_NAME_MAX);
7 M( u4 o- F7 w- K- j    }
5 Z7 l; d" w7 `6 O4 W) M4 j/ w    /* 根据设备名称查找看门狗设备,获取设备句柄 */; V' `, T: r" V4 P
    wdg_dev = rt_device_find(device_name);
& @0 U4 k( S7 T    if (!wdg_dev)
  f  A# w9 r% F0 p. O) @0 k. c    {
* [% k  i: m, @1 o8 z7 k        rt_kprintf("find %s failed!\n", device_name);! d: O, W% y! u: ?
        return RT_ERROR;/ Z* I/ s, W, J: b) a
    }! k* b0 b( A7 K4 Q4 i' r, S0 |
        else5 `8 h' Y: p$ O% ]' l
        {2 ~* E8 w& u1 g' W$ _) U  r$ t2 w
                rt_kprintf("find %s succeed!\n", device_name);7 @, C1 O5 P, I5 ^6 c: \
        }* Z; _0 y2 e2 E; U" F/ }( e
    /* 初始化设备 */
9 W& c/ v& n0 S  c7 i5 u    ret = rt_device_init(wdg_dev);. J0 }/ g# u/ l% x  r5 @
    if (ret != RT_EOK)( z9 x# ^# `1 F7 a* b: r
    {
" Z* Q: ]' N* T( ]* E  S        rt_kprintf("initialize %s failed!\n", device_name);/ S% A) H% O# ?+ M8 V
        return RT_ERROR;
( V5 V# R3 ]5 s! k3 E; X% {% d    }
9 C* u; m% }; l$ ?" ~. k2 L        else
! G- A2 G, P7 @9 U8 K        {, Q3 h5 N' Z5 O  O/ M% |
                rt_kprintf("initialize %s succeed!\n", device_name);
! Y4 z( b) f6 g9 o# G% d9 d        }
3 I% l+ {, i- ^+ e+ \1 C* v7 j    /* 设置看门狗溢出时间 */# ]' G3 h+ c0 g/ e. q4 o4 n
    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);  C# Q% w3 d# s: s
    if (ret != RT_EOK)
. B$ U. u# T. U# r9 u( m    {
- W! g- ?' H( v8 d" _        rt_kprintf("set %s timeout failed!\n", device_name);; H4 a0 S: k0 V- m) I- A
        return RT_ERROR;
4 N9 E3 K+ B2 S3 u' s    }/ B/ e+ N/ u: Q% O9 o+ E, O
        else
" ]0 L7 Z; g4 i$ M; W4 J. @        {6 k* B7 l$ S  d$ o" K  T
                rt_kprintf("set %s timeout succeed!\n", device_name);  b" }2 \  L2 N: B1 m, L
        }" z/ H/ S  x# H8 [# [
    /* 设置空闲线程回调函数 */
: Z/ d5 j0 k1 ~2 m    rt_thread_idle_sethook(idle_hook);
. r4 n. t% z( }% E1 f7 E
' z6 t. l: b/ o) G. C% N* B    return ret;
& _7 V9 a; f+ U$ m* L! Y' p}; D2 f9 Q" v8 X8 y
/* 导出到 msh 命令列表中 */' v% D* D$ k8 h( ~% O( B
MSH_CMD_EXPORT(iwdg_sample, iwdg sample);) t7 w/ w% |; F- x; n7 _( S* D
使用道具 举报 回复
发表于 2019-7-12 09:41:32 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:246 S: U* i) v/ G" ?7 s0 i
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?7 t& [/ d# c+ e2 h  U4 y
还有你用到的是那个 bsp? ...

: S+ ]4 o$ l0 V, D! r执行初始化函数就会失败,我不太确定我得设备名称"wdt"是不是对的,官方例程是"iwd"
使用道具 举报 回复
发表于 2019-7-12 09:43:05 | 显示全部楼层
whj467467222 发表于 2019-7-12 08:449 [/ X0 |' ^! b) I
你是不是用了iwdg_sample.c这个测试的。
' P1 |4 Y) s4 D5 T如果是这个就一定会出错,驱动里面的看门狗超时时间是秒为单位, ...

* U7 h* q# {% Q) v没有更新啊。。。
使用道具 举报 回复
发表于 2019-7-12 09:54:13 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:24
0 t0 H- t% I/ v" w8 Y+ e一调用就重启?把你的看门狗应用代码 完整的贴出来看看?) y' G4 L9 Q2 t8 M: S
还有你用到的是那个 bsp? ...
9 }$ _! S$ P6 j. M8 B5 o0 U
bsp根据官方模板自己制作的,
使用道具 举报 回复
发表于 2019-7-12 10:14:56 | 显示全部楼层
乐于 发表于 2019-7-12 09:39
/ v, [: O5 Q8 K( g/*
9 P: g7 ^& L% d * Copyright (c) 2006-2018, RT-Thread Development Team
1 m' ?5 J3 N, f$ ?( S  o! P( ]8 m *

( L5 z# @/ d- O, a( r* {就是这个文件,我昨天已经反馈过了。
8 t! d, Z6 S( J1 J0 G这个文件有两处错误8 G* {0 X9 |5 k: C# Z
1,修改名字“iwg”为“wdt”
5 {' G8 m( b) P0 i, l3 L8 y/ v9 S9 k2,修改timeout 为1.就可以了。
使用道具 举报 回复
发表于 2019-7-12 10:15:30 | 显示全部楼层
来一颗糖 发表于 2019-7-12 08:245 t. ?$ z+ ~! ]8 L% U$ A
一调用就重启?把你的看门狗应用代码 完整的贴出来看看?' n. b: E, A* I3 h) b7 K) r1 e. r
还有你用到的是那个 bsp? ...
8 D9 y2 \" t0 J; o
昨天下午我们才讨论的这个问题,晚上就被人家测试出来了
使用道具 举报 回复
发表于 2019-7-12 11:12:23 | 显示全部楼层
乐于 发表于 2019-7-12 09:41
+ a% w% t7 I4 m执行初始化函数就会失败,我不太确定我得设备名称"wdt"是不是对的,官方例程是"iwd" ...

% y$ e% h& k1 g* ~6 I" u可以输入 MSH 命令: list_device 查看下是否存在看门狗设备。如果存在 就接着输入 命令: iwdg_sample xxx (xxx 表示看门狗设备名称)8 [$ j1 e! w5 i) j7 @5 h( Q5 X
使用道具 举报 回复
发表于 2019-7-12 14:16:24 | 显示全部楼层
来一颗糖 发表于 2019-7-12 11:12+ l" ~2 z4 r3 ~, e2 v0 B
可以输入 MSH 命令: list_device 查看下是否存在看门狗设备。如果存在 就接着输入 命令: iwdg_sample xx ...

( q0 Z- ]" Q, y8 f6 K# r确实是例程有问题
使用道具 举报 回复
发表于 2019-9-11 10:00:12 | 显示全部楼层
乐于 发表于 2019-7-12 14:16
- D0 a9 H( b( M9 r6 R& [4 C* v确实是例程有问题
, W# F. r6 d' B
那现在怎么使用这个看门狗呢? 是调节溢出时间吗?
使用道具 举报 回复
发表于 2019-9-11 12:00:56 | 显示全部楼层
jamguo 发表于 2019-9-11 10:00$ x) r, O" K' `2 C8 l- P  w
那现在怎么使用这个看门狗呢? 是调节溢出时间吗?
3 |2 X& B: `2 l+ O& G0 B& z% @
记得在 CubeMX 里面配置 IWDG,然后 BSP_USING_WDT7 d. @$ |, f3 `7 A, E( r
; c% h7 Q& [% w' q) J* p
还有例程里面没有启动看门狗3 Q/ z+ x+ q) G

0 ^/ G+ O. y/ t- f& G7 X- X; D
  1. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, (0));
复制代码
使用道具 举报 回复
发表于 2019-9-11 15:51:01 | 显示全部楼层
wuhanstudio 发表于 2019-9-11 12:003 b! \$ N3 i2 |" J8 j9 h) P. k4 L
记得在 CubeMX 里面配置 IWDG,然后 BSP_USING_WDT6 q5 \8 T% c6 P9 h+ \
$ r, k0 u$ V3 h- _) y- H, a( h
还有例程里面没有启动看门狗

9 i# V( c* ?$ d0 t; Z" h0 ~, q话说  这个。。。。
  Y; z& i+ T# h1 T# X* ?4 h9 O5 b- g) X- ^1 c
static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)0 C& T4 p# e, D
{
' Z7 [& h3 m& g1 v    switch (cmd)/ A' ?. E( Z  m" @
    {
7 E7 |0 ]9 ]* b5 ?. m) q+ i) ~        /* feed the watchdog */
# z: O+ h4 j+ V( c    case RT_DEVICE_CTRL_WDT_KEEPALIVE:/ N* v3 A: `0 d7 t) B) ]% R% q: i
        HAL_IWDG_Refresh(&hiwdg);
; l7 y% ?+ n4 S8 _, G9 H        break;4 B3 Q: K1 C$ D+ m" ~+ d* {& q
        /* set watchdog timeout */
  D1 m0 k5 t" F  ~& {' b    case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
& O8 `2 o2 K7 y& \( ]6 |- X        hiwdg.Init.Reload = *((rt_uint32_t*)arg);7 ?8 r4 @$ C  ?/ o
        if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
! R$ w8 m% z0 Y& x3 j        {
/ |$ s3 V  c- f1 A            LOG_E("wdg set timeout failed.");& V: e0 M5 |" h
            return -RT_ERROR;5 Y" o* ]- ?6 e8 t$ M
        }
, Q- Z6 \+ Y) P- d        break;
: C9 o5 c0 n. D. o    default:
# F$ m3 S0 ?* o, k* C- h7 l% Q        return -RT_ERROR;/ s* _) u" x% w4 s% B+ ]% p) J
    }; N- z& [. H1 |% p8 f
    return RT_EOK;& o4 K% z& C( S$ B
}
8 n" Z6 q2 b6 m- \, \* E% H6 ^2 D6 a9 G( J, U! B- Q

; Y0 f) h1 z- z只有设置时间和初始化功能啊/////: p5 w; d. [2 Z6 r" ^, |
. Z7 A9 Y1 z' @2 X% U  X

0 K' N1 M, }. t0 f/ J文档里3 s8 e% g0 Q9 n

: K# o/ b* T' r4 [6 d; O! d1 a( E/ g
#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) /* 停止看门狗 */
: q7 f6 K9 f  f' q
+ r8 P( H) k% K
. g- p  o5 I0 u3 t这些是干嘛的/////
使用道具 举报 回复
发表于 2019-9-12 16:04:34 | 显示全部楼层
本帖最后由 wuhanstudio 于 2019-9-12 16:15 编辑 " G6 u% |, `9 |: {1 g
jamguo 发表于 2019-9-11 15:517 q" ]- n  a9 o8 v3 G
话说  这个。。。。
+ s: _/ @$ e/ a! A9 `' ^7 }* ?
2 A' L0 _; O) q$ lstatic rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
8 f, S2 x  l% }' X& F; B
我以为写驱动的小伙伴要出来背锅了,看样子是你源码版本有点老了,更新一下吧
使用道具 举报 回复
发表于 2019-9-16 09:38:50 | 显示全部楼层
wuhanstudio 发表于 2019-9-12 16:04( p5 a* t1 A6 I2 G5 d/ a
我以为写驱动的小伙伴要出来背锅了,看样子是你源码版本有点老了,更新一下吧 ...
7 E: y% C6 ^4 n# [$ j% \
4.01版本的。。。。我加了其他功能在里边了,不过没有停止看门狗的这个功能,记得是独立看门狗打开停不了吧。。。现在可以了 ,是这个驱动设定时间的问题 它以前只有溢出时间,没有加分频系数在里边,所以你设定多少都是有一个最大值的,把分屏系数加进去就好了
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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