/**************************************************************************//** * @file pan_hal_wwdt.c * @version V0.0.0 * $Revision: 1 $ * $Date: 23/09/10 $ * @brief Panchip series WWDT (Windowed Watchdog Timer) HAL source file. * @note * Copyright (C) 2023 Panchip Technology Corp. All rights reserved. *****************************************************************************/ #include "pan_hal.h" WWDT_CallbackFunc wwdt_callback[1]; void HAL_WWDT_Init(WWDT_Init_Opt *wwdt){ // Unlock Regs SYS_UnlockReg(); CLK_APB1PeriphClockCmd(CLK_APB1Periph_WWDT, ENABLE); // Select Clock Source CLK_SetWwdtClkSrc(wwdt->ClockSource); // Delay some nops before Re-lock Regs SYS_delay_10nop(1); // Enable WWDT, disable Int WWDT_Open(wwdt->Prescaler, wwdt->CmpValue, FALSE); // Re-Lock Regs SYS_LockReg(); } void HAL_WWDT_DeInit(void){ SYS_UnlockReg(); WWDT_Close(); CLK_APB1PeriphClockCmd(CLK_APB1Periph_WWDT, DISABLE); SYS_LockReg(); } void HAL_WWDT_Feed(WWDT_Init_Opt *wwdt){ WWDT_ReloadCounter(); } void HAL_WWDT_Init_INT(WWDT_Interrupt_Opt *wwdt){ wwdt_callback[0] = wwdt->CallbackFunc; SYS_UnlockReg(); WWDT->CTL |= WWDT_CTL_INTEN_Msk; // Enable NVIC WWDT IRQ NVIC_EnableIRQ(WWDT_IRQn); SYS_LockReg(); } void HAL_WWDT_DeInit_INT(void){ wwdt_callback[0] = NULL; WWDT->CTL &= ~WWDT_CTL_INTEN_Msk; // Disable NVIC WWDT IRQ, thus WWDT will stop reloading counter NVIC_DisableIRQ(WWDT_IRQn); } __WEAK void WWDT_IRQHandlerOverlay(void) { // Clear Timeout Int Flag WWDT_ClearIntFlag(); if (wwdt_callback[0] != NULL) wwdt_callback[0](); } void WWDT_IRQHandler(void) { PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_WWDT_IRQ, 1); WWDT_IRQHandlerOverlay(); PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_WWDT_IRQ, 0); }