你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l053 WDT 驱动及使用

[复制链接]
stary666 发布时间:2015-4-8 13:47
void* W/ y' D: B+ R% s9 g" |( W
HAL_IWDG_Init(IWDG_HandleTypeDef * pst_Iwdg)
4 X7 O0 l, ?5 C{
9 L8 g" K7 y6 B3 e5 U( {6 e6 {    /* Change IWDG peripheral state */
9 X$ w" k, r, J' k! ]    pst_Iwdg->State = HAL_IWDG_STATE_BUSY;
7 A1 B) ^$ w5 R9 R" y8 H2 q; n& \5 Y; G9 p) y
    /* Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers */
# q5 x1 y( w. L$ @    /* by writing 0x5555 in KR */' h% ~2 u' w( |* Z) I2 e& g5 G1 e/ B
    IWDG->KR |= KR_KEY_EWA;+ r% K) O" N9 ?( L+ a! k

8 m% y$ r: B3 V/ e, r( R    /* Write to IWDG registers the IWDG_Prescaler & IWDG_Reload values to work with */0 \& a# }/ n, b  n9 `
    MODIFY_REG(IWDG->PR, (uint32_t)IWDG_PR_PR, pst_Iwdg->Init.Prescaler);
% j# g- e1 @1 n$ Y. ~* R    MODIFY_REG(IWDG->RLR, (uint32_t)IWDG_RLR_RL, pst_Iwdg->Init.Reload);
. D" n8 H$ a  o# S2 z2 n  B  b' b6 |: {2 J4 E1 D
    /* check if window option is enabled */# p0 @* U8 r4 x% K
    if (((pst_Iwdg->Init.Window) != IWDG_WINDOW_DISABLE) || ((IWDG->WINR) != IWDG_WINDOW_DISABLE))
4 ]2 {5 D, `/ `+ t4 y    {" a) r$ X, F# d9 b6 ?' k. I  l
        /* Wait for register to be updated */3 z* T+ `8 V4 Q0 [% g" b
        while ((IWDG->SR & (IWDG_FLAG_PVU | IWDG_FLAG_RVU | IWDG_FLAG_WVU)) != 0)
" f) l; `$ b( X# C5 L* S' @        {
8 V- E4 a6 K+ B* G# t2 B: L! W        }2 X% ?7 ~: b5 z3 Q. A0 I4 J
; f2 B. |' w4 t+ _2 M: |
        /* Write to IWDG WINR the IWDG_Window value to compare with */
7 i3 t5 u+ ~1 c' M4 G8 r        MODIFY_REG(IWDG->WINR, (uint32_t)IWDG_WINR_WIN, pst_Iwdg->Init.Window);
6 X( Z/ w+ i! [7 `1 Y" O    }
5 U# \2 G4 n* C! k# w) ?& {
( @4 ^4 K7 Y. R8 g& ]7 L+ o    /* Change IWDG peripheral state */
4 i( Y' n1 Q5 r) X  d' ^% ~    pst_Iwdg->State = HAL_IWDG_STATE_READY;
# F% a$ Q9 L* y0 K! W}1 [, b' z. O- O6 L

+ f% Q  r$ L2 g2 L1 Vvoid5 }# l4 I* z3 `" ~' H: ~
HAL_IWDG_Start(IWDG_HandleTypeDef * pst_Iwdg)
; ]4 h+ g$ x8 |7 ~# t2 ~+ {{' N; T, J' \/ q. Z
    /* Change IWDG peripheral state */
0 [% k+ B3 G" ?% E7 O& Z) Y  }    pst_Iwdg->State = HAL_IWDG_STATE_BUSY;9 [0 V" }8 ]+ d2 v7 d

3 V1 R9 K  r. U" a# F+ Z* n0 o    /* Reload IWDG counter with value defined in the RLR register */" ?% Y" w# _, {6 s/ V6 E8 B8 S: R2 O
    if ((pst_Iwdg->Init.Window) == IWDG_WINDOW_DISABLE)
, e4 M+ ?6 u% W" T# n. _6 A! Y9 K    {0 d& w( m2 A, V. m6 `( I% [7 R# g
        IWDG->KR |= KR_KEY_RELOAD;3 ?' T7 e6 P! y) C; L# X' f. Z6 N# E
    }
. H7 I0 A( E% L7 X5 q8 Y
. }( m1 v5 @# Y% I9 r( d    /* Enable the IWDG peripheral */
) s' o* @7 b5 y9 e! X, ]' U    IWDG->KR |= KR_KEY_ENABLE;  A8 `0 G- N8 c. }$ B( c$ l
0 Z  a& O% v. i  ?* q
    /* Wait until PVU, RVU, WVU flag are RESET */
+ N" ?% ]! s1 z( J; E5 v    while (0 != ((uint32_t)(IWDG->SR & (IWDG_FLAG_PVU | IWDG_FLAG_RVU | IWDG_FLAG_WVU))))0 h& F- d5 o( @+ S7 u9 R
    {3 P6 j3 O! \- c! o$ r5 Z. b1 o- T
    }
* P( c# W8 ]- b2 }, E( p; M' T8 z) H! [: y
    /* Change IWDG peripheral state */
$ S0 N& K) r6 o4 L7 i& Z    pst_Iwdg->State = HAL_IWDG_STATE_READY;
( c* j- M0 D1 ~0 F" k2 S}. P, q; ?; X5 Y' \0 f
% D+ h6 l8 [$ `* G1 b& b
void# c# h* j( W& l2 J$ z% N# C7 I
HAL_IWDG_Refresh(IWDG_HandleTypeDef * pst_Iwdg)1 A: b. f' @- t7 M5 a
{
. y! m8 h" n% }6 @1 l5 j4 _    /* Change IWDG peripheral state */
7 g# K+ z9 w! u    pst_Iwdg->State = HAL_IWDG_STATE_BUSY;+ ]4 V+ z3 l1 D  ^2 \. Q5 |9 ]6 B

! x5 }- G. w" J3 j. O$ u    /* Wait until RVU flag is RESET */
1 i% R% S, ?& x0 d( V$ [9 F    while ((IWDG->SR & (IWDG_FLAG_RVU)) == IWDG_FLAG_RVU)
0 _5 ~! E, c8 R) N! K) l4 I2 \    {) v/ s1 K4 \7 u: F
    }
0 Z5 G; j  v" [9 s/ \# p3 L; n4 ^- O0 _6 V2 l
    /* Reload IWDG counter with value defined in the reload register */6 _1 n' M* v! u; b# ~
    IWDG->KR       |= KR_KEY_RELOAD;
7 u! k& j8 B! M- o9 v( M0 `- A: r8 R$ F2 ?
    /* Change IWDG peripheral state */
2 Z; A1 ~" K+ @' w    pst_Iwdg->State = HAL_IWDG_STATE_READY;
7 o! S/ O7 b  }}
" m$ e8 x8 U5 U4 n# n; K( N$ H' H) H, E, x
HAL_IWDG_StateTypeDef
$ G) V! ~5 I  J$ Q2 GHAL_IWDG_GetState(const IWDG_HandleTypeDef * pst_Iwdg)
5 R9 t3 C; U2 q5 M+ T9 r{
) ?0 I) y( J; s. t    return pst_Iwdg->State;2 [3 \4 @5 u" \: A# u) r1 L2 v
}0 R4 R+ A' q* F& T; v
) u9 _% W5 Z) A' v1 o# M* o
void
7 M8 \- Z5 w) y8 q2 SIWDG_Delay(void)
2 s+ ~' m  L: u{
# Q5 t: J$ V$ D% t- c& H    uint32_t u32_stic;) u4 k) L, v, O6 p/ s  a

. C! L  t, R$ J+ X7 b) U  K1 r! ]+ y7 R    u32_stic = GET_SYSTEM_TICK_VALUE();$ M& {0 |, n6 a6 Y, [* [6 L

( i4 h7 K' c6 g: P; l& H4 Q    /*@ignore@*/
1 J9 l% ~1 L* L    do0 c) X* _, H! J" k- T
    {5 g0 k) S8 r; b3 P" x
    } while (GET_SYSTEM_TICK_ECLIPSE(u32_stic) < (uint32_t)(IWDG_SYSTICK));3 {0 y) F4 p5 S  w* b: O
3 s" r1 \+ [3 ?
    /*@end@*/, I9 l, b; g9 n# w9 S8 Q. |
}, m6 s) h& T3 `
8 |5 s  l% |9 i
void
* F- Q& r- N% @7 ZIwdg_Refresh(void)6 y/ G. b  p( H& G. Q
{! r' n  m! y1 @! S6 s) W
    HAL_IWDG_Refresh(&IwdgHandle);: g% p; r' ]7 \0 Z$ V+ b
}: v, x7 X2 s; O3 D; J; f

6 G0 G2 ^' X& D8 m( ^7 i6 a# Ivoid
# A% N- v4 X  [4 V% e+ r/ N$ |, g  X1 JIwdg_main(void)
) H9 r% v/ q, R{
# {. `  T$ w% m: Q: G3 X    /*##-1- Check if the system has resumed from IWDG reset ####################*/
0 q! G. |; D$ y    if ((uint32_t)__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != 0)  a; T( p& u2 t- Q$ S
    {
) \+ c1 S0 i9 o# g7 U4 k3 A- V        /* Clear reset flags */
# R* X0 W/ q" R' o" j* x4 p        RCC->CSR |= RCC_CSR_RMVF;
. D- b9 c" c5 N; b    }
, {2 I) k# A3 C5 I5 a* {# R. \6 ?, u4 [& J
    /*##-2- Configure & Initialize the IWDG peripheral ######################################*/: u( T5 Y. Y, E/ N
    /* Set counter reload value to obtain 762ms IWDG TimeOut.
% X* [. X; r( F/ w8 O0 N     Counter Reload Value = LsiFreq*Timeout(s)/prescaler
; C' ~4 |. P% \0 s" B- S8 N/ }                          = 40000*700ms/(16*1000)
. C! c7 v+ x% D5 e                          = 1750 (approx)
1 j" F4 i0 {9 C9 }" N) f; W. o    */1 o. l/ g" ?( Z% X, ]3 T
    IwdgHandle.Init.Prescaler = IWDG_PRESCALER_32;# N: c- C- O+ p3 T
    IwdgHandle.Init.Reload    = (uint32_t)IWDG_RELOAD_NUMBER(IWDG_RELOAD, IWDG_PRESCALER_32); /* IWDG_RELOAD,16prescaler(40khz) */
) ~8 m9 H6 H) H    IwdgHandle.Init.Window    = 0xfff;                                                        /* Window =  0xfff*/% t" |4 y' o, {/ Z5 j( g) m

$ R& f% [6 u! f    /* when window option is enabled, we enable the IWDG immediately */
2 F1 k6 |1 W5 l0 G  k& i# J0 y    /* by writing 0xCCCC to the KEY register */8 u. ^5 L" I' n& @( x: u+ V
! P& g  z( Z& _, D# H! f
    /*##-3- Start the IWDG #####################################################*/
" f0 u5 k% `2 h5 @: U% z    HAL_IWDG_Start(&IwdgHandle);
& y0 j1 R+ I! h    HAL_IWDG_Init(&IwdgHandle);6 I3 u; G8 R1 l7 i( ~# O1 e
}
赞 收藏 评论1 发布时间:2015-4-8 13:47

举报

1个回答
肖久 回答时间:2015-4-8 20:42:30
帮顶一下 让更多的人 过来帮你
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版