|
void* W/ y' D: B+ R% s9 g" |( W HAL_IWDG_Init(IWDG_HandleTypeDef * pst_Iwdg) { /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_BUSY; 8 H2 q; n& \5 Y; G9 p) y /* Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers */ /* 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 /* 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); MODIFY_REG(IWDG->RLR, (uint32_t)IWDG_RLR_RL, pst_Iwdg->Init.Reload); ' 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)) {" 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) { }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 */ MODIFY_REG(IWDG->WINR, (uint32_t)IWDG_WINR_WIN, pst_Iwdg->Init.Window); } /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_READY; }1 [, b' z. O- O6 L void5 }# l4 I* z3 `" ~' H: ~ HAL_IWDG_Start(IWDG_HandleTypeDef * pst_Iwdg) {' N; T, J' \/ q. Z /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_BUSY;9 [0 V" }8 ]+ d2 v7 d /* 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) {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 } /* Enable the IWDG peripheral */ 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 */ 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 } , E( p; M' T8 z) H! [: y /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_READY; }. 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 { /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_BUSY;+ ]4 V+ z3 l1 D ^2 \. Q5 |9 ]6 B /* Wait until RVU flag is RESET */ while ((IWDG->SR & (IWDG_FLAG_RVU)) == IWDG_FLAG_RVU) {) v/ s1 K4 \7 u: F } # 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; 9 v( M0 `- A: r8 R$ F2 ? /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_READY; } ; K( N$ H' H) H, E, x HAL_IWDG_StateTypeDef HAL_IWDG_GetState(const IWDG_HandleTypeDef * pst_Iwdg) { 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 IWDG_Delay(void) { uint32_t u32_stic;) u4 k) L, v, O6 p/ s a u32_stic = GET_SYSTEM_TICK_VALUE();$ M& {0 |, n6 a6 Y, [* [6 L /*@ignore@*/ 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 Iwdg_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 void Iwdg_main(void) { /*##-1- Check if the system has resumed from IWDG reset ####################*/ if ((uint32_t)__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != 0) a; T( p& u2 t- Q$ S { /* Clear reset flags */ RCC->CSR |= RCC_CSR_RMVF; } 5 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. Counter Reload Value = LsiFreq*Timeout(s)/prescaler = 40000*700ms/(16*1000) = 1750 (approx) */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) */ IwdgHandle.Init.Window = 0xfff; /* Window = 0xfff*/% t" |4 y' o, {/ Z5 j( g) m /* when window option is enabled, we enable the IWDG immediately */ /* 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 #####################################################*/ HAL_IWDG_Start(&IwdgHandle); HAL_IWDG_Init(&IwdgHandle);6 I3 u; G8 R1 l7 i( ~# O1 e } |
帮顶一下 让更多的人 过来帮你 |
微信公众号
手机版