|
void HAL_IWDG_Init(IWDG_HandleTypeDef * pst_Iwdg) { /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_BUSY; /* Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers */ /* by writing 0x5555 in KR */ IWDG->KR |= KR_KEY_EWA; /* Write to IWDG registers the IWDG_Prescaler & IWDG_Reload values to work with */ 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); /* check if window option is enabled */ if (((pst_Iwdg->Init.Window) != IWDG_WINDOW_DISABLE) || ((IWDG->WINR) != IWDG_WINDOW_DISABLE)) { /* Wait for register to be updated */ while ((IWDG->SR & (IWDG_FLAG_PVU | IWDG_FLAG_RVU | IWDG_FLAG_WVU)) != 0) { } /* 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; } void HAL_IWDG_Start(IWDG_HandleTypeDef * pst_Iwdg) { /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_BUSY; /* Reload IWDG counter with value defined in the RLR register */ if ((pst_Iwdg->Init.Window) == IWDG_WINDOW_DISABLE) { IWDG->KR |= KR_KEY_RELOAD; } /* Enable the IWDG peripheral */ IWDG->KR |= KR_KEY_ENABLE; /* Wait until PVU, RVU, WVU flag are RESET */ while (0 != ((uint32_t)(IWDG->SR & (IWDG_FLAG_PVU | IWDG_FLAG_RVU | IWDG_FLAG_WVU)))) { } /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_READY; } void HAL_IWDG_Refresh(IWDG_HandleTypeDef * pst_Iwdg) { /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_BUSY; /* Wait until RVU flag is RESET */ while ((IWDG->SR & (IWDG_FLAG_RVU)) == IWDG_FLAG_RVU) { } /* Reload IWDG counter with value defined in the reload register */ IWDG->KR |= KR_KEY_RELOAD; /* Change IWDG peripheral state */ pst_Iwdg->State = HAL_IWDG_STATE_READY; } HAL_IWDG_StateTypeDef HAL_IWDG_GetState(const IWDG_HandleTypeDef * pst_Iwdg) { return pst_Iwdg->State; } void IWDG_Delay(void) { uint32_t u32_stic; u32_stic = GET_SYSTEM_TICK_VALUE(); /*@ignore@*/ do { } while (GET_SYSTEM_TICK_ECLIPSE(u32_stic) < (uint32_t)(IWDG_SYSTICK)); /*@end@*/ } void Iwdg_Refresh(void) { HAL_IWDG_Refresh(&IwdgHandle); } 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) { /* Clear reset flags */ RCC->CSR |= RCC_CSR_RMVF; } /*##-2- Configure & Initialize the IWDG peripheral ######################################*/ /* Set counter reload value to obtain 762ms IWDG TimeOut. Counter Reload Value = LsiFreq*Timeout(s)/prescaler = 40000*700ms/(16*1000) = 1750 (approx) */ IwdgHandle.Init.Prescaler = IWDG_PRESCALER_32; IwdgHandle.Init.Reload = (uint32_t)IWDG_RELOAD_NUMBER(IWDG_RELOAD, IWDG_PRESCALER_32); /* IWDG_RELOAD,16prescaler(40khz) */ IwdgHandle.Init.Window = 0xfff; /* Window = 0xfff*/ /* when window option is enabled, we enable the IWDG immediately */ /* by writing 0xCCCC to the KEY register */ /*##-3- Start the IWDG #####################################################*/ HAL_IWDG_Start(&IwdgHandle); HAL_IWDG_Init(&IwdgHandle); } |
帮顶一下 让更多的人 过来帮你 |
微信公众号
手机版