current_v/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_iwdt.c

157 lines
5.0 KiB
C
Raw Normal View History

2025-12-31 08:21:43 +08:00
/**
****************************************************************************************************
* @file fm33lg0xx_fl_iwdt.c
* @author FMSH Application Team
* @brief Src file of IWDT FL Module
****************************************************************************************************
* @attention
*
* Copyright (c) [2021] [Fudan Microelectronics]
* THIS SOFTWARE is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*
****************************************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "fm33lg0xx_fl.h"
/** @addtogroup FM33LG0XX_FL_Driver
* @{
*/
/** @addtogroup IWDT
* @{
*/
#ifdef FL_IWDT_DRIVER_ENABLED
/* Private macros ------------------------------------------------------------*/
/** @addtogroup IWDT_FL_Private_Macros
* @{
*/
#define IS_IWDT_INSTANCE(INTANCE) ((INTANCE) == IWDT)
#define IS_FL_IWDT_WINDOWSVEL(__VALUE__) ((__VALUE__) < 0xFFF)
#define IS_FL_IWDT_OVERFLOWPERIOD(__VALUE__) (((__VALUE__) == FL_IWDT_PERIOD_125MS)||\
((__VALUE__) == FL_IWDT_PERIOD_250MS)||\
((__VALUE__) == FL_IWDT_PERIOD_500MS)||\
((__VALUE__) == FL_IWDT_PERIOD_1000MS)||\
((__VALUE__) == FL_IWDT_PERIOD_2000MS)||\
((__VALUE__) == FL_IWDT_PERIOD_4000MS)||\
((__VALUE__) == FL_IWDT_PERIOD_8000MS)||\
((__VALUE__) == FL_IWDT_PERIOD_16000MS))
/**
* @}
*/
/* Exported functions --------------------------------------------------------*/
/** @addtogroup IWDT_FL_EF_Init
* @{
*/
/**
* @brief IWDT外设
*
* @note IWDT开启后不可以关闭
*
* @param IWDTx
*
* @retval FL_ErrorStatus枚举值
* -FL_PASS
* -FL_FAIL
*/
FL_ErrorStatus FL_IWDT_DeInit(IWDT_Type *IWDTx)
{
assert_param(IS_IWDT_INSTANCE(IWDTx));
return FL_PASS;
}
/**
* @brief IWDT_InitStruct .
*
* @note IWTD使能后将无法关闭
*
* @param IWDTx
* @param IWDT_InitStruct @ref FL_IWDT_InitTypeDef结构体IWDT外设的配置信息
*
* @retval ErrorStatus枚举值
* -FL_PASS
* -FL_FAIL
*/
FL_ErrorStatus FL_IWDT_Init(IWDT_Type *IWDTx, FL_IWDT_InitTypeDef *IWDT_InitStruct)
{
uint32_t i = 0;
FL_ErrorStatus status = FL_PASS;
uint32_t iwdtCounter = 0;
/* 入口参数检查 */
assert_param(IS_IWDT_INSTANCE(IWDTx));
assert_param(IS_FL_IWDT_WINDOWSVEL(IWDT_InitStruct->iwdtWindows));
assert_param(IS_FL_IWDT_OVERFLOWPERIOD(IWDT_InitStruct->overflowPeriod));
/* 开启总线时钟 */
FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_IWDT);
/* 启动看门狗 */
FL_IWDT_ReloadCounter(IWDTx);
/* 配置独立看门狗溢出周期 */
FL_IWDT_SetPeriod(IWDTx, IWDT_InitStruct->overflowPeriod);
iwdtCounter = FL_IWDT_ReadCounter(IWDTx);
/* 窗口功能延时 */
if(IWDT_InitStruct->iwdtWindows != 0)
{
if(iwdtCounter == 0)
{
while((FL_IWDT_ReadCounter(IWDTx) != 1) && (i++ < 500))
{
}
}
else
{
while((FL_IWDT_ReadCounter(IWDTx) != 0) && (i++ < 500))
{
}
}
}
/* 配置独立看门狗清狗窗口*/
FL_IWDT_WriteWindow(IWDTx, IWDT_InitStruct->iwdtWindows);
return status;
}
/**
* @brief IWDT_InitStruct
*
* @param IWDT_InitStruct @ref FL_IWDT_InitTypeDef
*
* @retval None
*/
void FL_IWDT_StructInit(FL_IWDT_InitTypeDef *IWDT_InitStruct)
{
/* 默认不使用窗口 */
IWDT_InitStruct->iwdtWindows = 0;
/*最长溢出时间*/
IWDT_InitStruct->overflowPeriod = FL_IWDT_PERIOD_500MS;
}
/**
* @}
*/
#endif /* FL_IWDT_DRIVER_ENABLED */
/**
* @}
*/
/**
* @}
*/
/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/