void WDOG_Init(WDOG_Type *base, const wdog_config_t *config) { assert(config); uint32_t value = 0U; uint32_t primaskValue = 0U; value = WDOG_STCTRLH_WDOGEN(config->enableWdog) | WDOG_STCTRLH_CLKSRC(config->clockSource) | WDOG_STCTRLH_IRQRSTEN(config->enableInterrupt) | WDOG_STCTRLH_WINEN(config->enableWindowMode) | WDOG_STCTRLH_ALLOWUPDATE(config->enableUpdate) | WDOG_STCTRLH_DBGEN(config->workMode.enableDebug) | WDOG_STCTRLH_STOPEN(config->workMode.enableStop) | #if defined(FSL_FEATURE_WDOG_HAS_WAITEN) && FSL_FEATURE_WDOG_HAS_WAITEN WDOG_STCTRLH_WAITEN(config->workMode.enableWait) | #endif /* FSL_FEATURE_WDOG_HAS_WAITEN */ WDOG_STCTRLH_DISTESTWDOG(1U); /* Disable the global interrupts. Otherwise, an interrupt could effectively invalidate the unlock sequence * and the WCT may expire. After the configuration finishes, re-enable the global interrupts. */ primaskValue = DisableGlobalIRQ(); WDOG_Unlock(base); /* Wait one bus clock cycle */ base->RSTCNT = 0U; /* Set configruation */ base->PRESC = WDOG_PRESC_PRESCVAL(config->prescaler); base->WINH = (uint16_t)((config->windowValue >> 16U) & 0xFFFFU); base->WINL = (uint16_t)((config->windowValue) & 0xFFFFU); base->TOVALH = (uint16_t)((config->timeoutValue >> 16U) & 0xFFFFU); base->TOVALL = (uint16_t)((config->timeoutValue) & 0xFFFFU); base->STCTRLH = value; EnableGlobalIRQ(primaskValue); }
void WDOG_Init(WDOG_ConfigPtr pConfig) { uint8_t u8Cs1; uint8_t u8Cs2; uint16_t u16Toval; uint16_t u16Win; u8Cs1 = 0x80; /* default CS1 register value */ u8Cs2 = 0; u16Toval = pConfig->u16TimeOut; u16Win = pConfig->u16WinTime; if(pConfig->sBits.bDisable) { u8Cs1 &= ~WDOG_CS1_EN_MASK; } if(pConfig->sBits.bIntEnable) { u8Cs1 |= WDOG_CS1_INT_MASK; } if(pConfig->sBits.bStopEnable) { u8Cs1 |= WDOG_CS1_STOP_MASK; } if(pConfig->sBits.bDbgEnable) { u8Cs1 |= WDOG_CS1_DBG_MASK; } if(pConfig->sBits.bWaitEnable) { u8Cs1 |= WDOG_CS1_WAIT_MASK; } if(pConfig->sBits.bUpdateEnable) { u8Cs1 |= WDOG_CS1_UPDATE_MASK; } if(pConfig->sBits.bWinEnable) { u8Cs2 |= WDOG_CS2_WIN_MASK; } if(pConfig->sBits.bPrescaler) { u8Cs2 |= WDOG_CS2_PRES_MASK; } u8Cs2 |= (pConfig->sBits.bClkSrc & 0x03); /* write regisers */ WDOG_Unlock(); /* unlock watchdog first */ WDOG->CS2 = u8Cs2; WDOG->TOVAL8B.TOVALL = u16Toval; WDOG->TOVAL8B.TOVALH = u16Toval >> 8; WDOG->WIN8B.WINL = u16Win; WDOG->WIN8B.WINH = u16Win >> 8; WDOG->CS1 = u8Cs1; }
void WDOG_DeInit(void) { WDOG_Unlock(); WDOG->CS2 = WDOG_CS2_DEFAULT_VALUE; WDOG->TOVAL = WDOG_TOVAL_DEFAULT_VALUE; WDOG->WIN = WDOG_WIN_DEFAULT_VALUE; WDOG->CS1 = WDOG_CS1_DEFAULT_VALUE; }
void WDOG_Enable(void) { uint8_t u8Cs1 = WDOG->CS1; u8Cs1 |= WDOG_CS1_EN_MASK; /* First unlock the watchdog so that we can write to registers */ WDOG_Unlock(); WDOG->CS1 = u8Cs1; }
void WDOG_Deinit(WDOG_Type *base) { uint32_t primaskValue = 0U; /* Disable the global interrupts */ primaskValue = DisableGlobalIRQ(); WDOG_Unlock(base); /* Wait one bus clock cycle */ base->RSTCNT = 0U; WDOG_Disable(base); EnableGlobalIRQ(primaskValue); WDOG_ClearResetCount(base); }
void WDOG_Disable(void) { uint8_t u8Cs1 = WDOG->CS1; uint8_t u8Cs2 = WDOG->CS2; uint16_t u16TOVAL = WDOG->TOVAL; uint16_t u16WIN = WDOG->WIN; u8Cs1 &= ~WDOG_CS1_EN_MASK; /* First unlock the watchdog so that we can write to registers */ WDOG_Unlock(); WDOG->CS2 = u8Cs2; WDOG->TOVAL = u16TOVAL; WDOG->WIN = u16WIN; WDOG->CS1 = u8Cs1; }
void WDOG_SetTestModeConfig(WDOG_Type *base, wdog_test_config_t *config) { assert(config); uint32_t value = 0U; uint32_t primaskValue = 0U; value = WDOG_STCTRLH_DISTESTWDOG(0U) | WDOG_STCTRLH_TESTWDOG(1U) | WDOG_STCTRLH_TESTSEL(config->testMode) | WDOG_STCTRLH_BYTESEL(config->testedByte) | WDOG_STCTRLH_IRQRSTEN(0U) | WDOG_STCTRLH_WDOGEN(1U) | WDOG_STCTRLH_ALLOWUPDATE(1U); /* Disable the global interrupts. Otherwise, an interrupt could effectively invalidate the unlock sequence * and the WCT may expire. After the configuration finishes, re-enable the global interrupts. */ primaskValue = DisableGlobalIRQ(); WDOG_Unlock(base); /* Wait one bus clock cycle */ base->RSTCNT = 0U; /* Set configruation */ base->TOVALH = (uint16_t)((config->timeoutValue >> 16U) & 0xFFFFU); base->TOVALL = (uint16_t)((config->timeoutValue) & 0xFFFFU); base->STCTRLH = value; EnableGlobalIRQ(primaskValue); }