128 lines
3.4 KiB
C
128 lines
3.4 KiB
C
/*
|
|
******************************************************************************
|
|
* @file driver_pmu_iwdt.c
|
|
* @author FreqChip Firmware Team
|
|
* @version V1.0.0
|
|
* @date 2023
|
|
* @brief pmu iwdt module driver.
|
|
* This file provides firmware functions to manage the
|
|
* PMU Independent watchdog (IWDT) peripheral
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* Copyright (c) 2023 FreqChip.
|
|
* All rights reserved.
|
|
******************************************************************************
|
|
*/
|
|
#include "fr30xx.h"
|
|
|
|
/*********************************************************************
|
|
* @fn iwdt_init
|
|
*
|
|
* @brief init the Watchdog.
|
|
*/
|
|
void iwdt_init(iwdt_Init_t Init)
|
|
{
|
|
/* enable pmu wdt clock */
|
|
ool_write(PMU_REG_CLK_EN, ool_read(PMU_REG_CLK_EN) | PMU_WDT_CLK_EN_BIT);
|
|
|
|
/* Set iwdt_Count and iwdt_Timeout */
|
|
iwdt_Set_Count(Init.iwdt_Count);
|
|
iwdt_Set_Timeout(Init.iwdt_Timeout);
|
|
|
|
/* Set iwdt control */
|
|
ool_write(PMU_REG_WDT_CTRL, Init.iwdt_int_Enable | PMU_WDT_RST_CHIP_BIT);
|
|
|
|
/* iwdt interrupt enable */
|
|
if (Init.iwdt_int_Enable)
|
|
{
|
|
pmu_enable_isr(PMU_WDT_INT_MSK_BIT);
|
|
}
|
|
else
|
|
{
|
|
pmu_disable_isr(PMU_WDT_INT_MSK_BIT);
|
|
}
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn iwdt_Enable
|
|
*
|
|
* @brief Watchdog count Enable.
|
|
*/
|
|
void iwdt_Enable(void)
|
|
{
|
|
/* enable iwdt count */
|
|
ool_write(PMU_REG_WDT_CTRL, ool_read(PMU_REG_WDT_CTRL) | PMU_WDT_EN_BIT);
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn iwdt_Disable
|
|
*
|
|
* @brief Watchdog count Disable.
|
|
*/
|
|
void iwdt_Disable(void)
|
|
{
|
|
/* disable iwdt count */
|
|
ool_write(PMU_REG_WDT_CTRL, ool_read(PMU_REG_WDT_CTRL) & ~PMU_WDT_EN_BIT);
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn iwdt_Refresh
|
|
*
|
|
* @brief Refresh the Watchdog.
|
|
*/
|
|
void iwdt_Refresh(void)
|
|
{
|
|
ool_write(PMU_REG_WDT_CTRL, ool_read(PMU_REG_WDT_CTRL) | PMU_WDT_CLR_BIT);
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn iwdt_Interrupt_Enable
|
|
*
|
|
* @brief Watchdog Interrupt Enable.
|
|
*/
|
|
void iwdt_Interrupt_Enable(void)
|
|
{
|
|
/* enable iwdt interrupt */
|
|
ool_write(PMU_REG_WDT_CTRL, ool_read(PMU_REG_WDT_CTRL) | PMU_WDT_IRQ_EN_BIT);
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn iwdt_Interrupt_Disable
|
|
*
|
|
* @brief Watchdog Interrupt Disable.
|
|
*/
|
|
void iwdt_Interrupt_Disable(void)
|
|
{
|
|
/* enable iwdt interrupt */
|
|
ool_write(PMU_REG_WDT_CTRL, ool_read(PMU_REG_WDT_CTRL) & ~PMU_WDT_IRQ_EN_BIT);
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn iwdt_Set_Count
|
|
*
|
|
* @brief Set watchdog count.
|
|
*
|
|
* @param iwdtCount: watchdog count (0x00000000 ~ 0xFFFFFFFF).
|
|
*/
|
|
void iwdt_Set_Count(uint32_t iwdtCount)
|
|
{
|
|
/* set iwdt Count value */
|
|
ool_write32(PMU_REG_WDT_LEN_0, iwdtCount);
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn iwdt_Set_Timeout
|
|
*
|
|
* @brief Set watchdog Timeout. Timeout trigger the system reset.
|
|
* Attention: Timeout Set to 0 the system will not reset.
|
|
*
|
|
* @param WdtCount: watchdog Timeout value (0x0000 ~ 0xFFFF).
|
|
*/
|
|
void iwdt_Set_Timeout(uint16_t iwdtTimeout)
|
|
{
|
|
/* set iwdt timeout value */
|
|
ool_write16(PMU_REG_WDT_TOUT_COUNTER_0, iwdtTimeout);
|
|
}
|
|
|