266 lines
6.3 KiB
C
266 lines
6.3 KiB
C
/****************************************************************************!
|
||
* 技术讨论:QQ群 123763203
|
||
* 官网 :www.navota.com
|
||
*
|
||
* @file wdg.c
|
||
* @brief wdg定时器函数库
|
||
* @author Navota
|
||
* @date 2018-3-1
|
||
*******************************************************************************/
|
||
#include "common.h"
|
||
#include "wdog.h"
|
||
|
||
/******************************************************************************
|
||
*******************************************************************************/
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 禁用看门狗定时器
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
|
||
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;
|
||
|
||
/* 首先要解锁unlock看门狗,才可以往寄存器写数据 */
|
||
WDOG_Unlock();
|
||
WDOG->CS2 = u8Cs2;
|
||
WDOG->TOVAL = u16TOVAL;
|
||
WDOG->WIN = u16WIN;
|
||
WDOG->CS1 = u8Cs1;
|
||
}
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 禁用看门狗但允许其重新配置.
|
||
*
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void WDOG_DisableWDOGEnableUpdate(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;
|
||
u8Cs1 |= WDOG_CS1_UPDATE_MASK;
|
||
|
||
|
||
WDOG_Unlock(); //Modify
|
||
WDOG->CS2 = u8Cs2;
|
||
WDOG->TOVAL = u16TOVAL;
|
||
WDOG->WIN = u16WIN;
|
||
WDOG->CS1 = u8Cs1;
|
||
}
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 使能看门狗定时器.
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void WDOG_Enable(void)
|
||
{
|
||
uint8_t u8Cs1 = WDOG->CS1;
|
||
|
||
u8Cs1 |= WDOG_CS1_EN_MASK;
|
||
|
||
/* 首先要解锁unlock看门狗,才可以往寄存器写数据 */
|
||
WDOG_Unlock();
|
||
WDOG->CS1 = u8Cs1;
|
||
}
|
||
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 初始化看门狗.
|
||
*
|
||
* @param[in] pConfig 配置看门狗的结构体.
|
||
*
|
||
* @return none
|
||
*
|
||
* @warning make sure that WDOG is not initialized after reset or WDOG update is enabled
|
||
* after reset by calling WDOG_EnableUpdate / WDOG_DisableWDOGEnableUpdate.
|
||
*
|
||
* @see WDOG_EnableUpdate, WDOG_DisableWDOGEnableUpdate
|
||
*
|
||
*************************************************************************/
|
||
void WDOG_Init(WDOG_ConfigPtr pConfig)
|
||
{
|
||
uint8_t u8Cs1;
|
||
uint8_t u8Cs2;
|
||
uint16_t u16Toval;
|
||
uint16_t u16Win;
|
||
|
||
u8Cs1 = 0x80; /* CS1寄存器的默认值 */
|
||
u8Cs2 = 0;
|
||
u16Toval = pConfig->u16ETMeOut;
|
||
u16Win = pConfig->u16WinETMe;
|
||
|
||
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);
|
||
|
||
/* 首先要解锁unlock看门狗,才可以往寄存器写数据 */
|
||
WDOG_Unlock();
|
||
WDOG->CS2 = u8Cs2;
|
||
|
||
WDOG->TOVAL8B.TOVALL = u16Toval;
|
||
WDOG->TOVAL8B.TOVALH = u16Toval >> 8;
|
||
|
||
WDOG->WIN8B.WINL = u16Win;
|
||
WDOG->WIN8B.WINH = u16Win >> 8;
|
||
|
||
WDOG->CS1 = u8Cs1;
|
||
}
|
||
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 复位看门狗.
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
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;
|
||
}
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 喂狗-刷新看门狗.
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void WDOG_Feed(void)
|
||
{
|
||
//在喂狗期间,总中断需要关闭
|
||
DisableInterrupts;
|
||
WDOG->CNT = 0x02A6;//喂狗的两条指令,必须跟随在128个总线时钟周期内执行
|
||
WDOG->CNT = 0x80B4;
|
||
EnableInterrupts;
|
||
}
|
||
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 使能更新看门狗.
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void WDOG_EnableUpdate(void)
|
||
{
|
||
uint8_t u8Cs1 = WDOG->CS1;
|
||
uint8_t u8Cs2 = WDOG->CS2;
|
||
uint16_t u16TOVAL = WDOG->TOVAL;
|
||
uint16_t u16WIN = WDOG->WIN;
|
||
|
||
u8Cs1 |= WDOG_CS1_UPDATE_MASK;
|
||
|
||
/* 首先要解锁unlock看门狗,才可以往寄存器写数据 */
|
||
WDOG_Unlock();
|
||
WDOG->CS2 = u8Cs2;
|
||
WDOG->TOVAL = u16TOVAL;
|
||
WDOG->WIN = u16WIN;
|
||
WDOG->CS1 = u8Cs1;
|
||
}
|
||
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 禁用更新看门狗.
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void WDOG_DisableUpdate(void)
|
||
{
|
||
uint8_t u8Cs1 = WDOG->CS1;
|
||
uint8_t u8Cs2 = WDOG->CS2;
|
||
uint16_t u16TOVAL = WDOG->TOVAL;
|
||
uint16_t u16WIN = WDOG->WIN;
|
||
|
||
u8Cs1 &= ~WDOG_CS1_UPDATE_MASK;
|
||
|
||
/* 首先要解锁unlock看门狗,才可以往寄存器写数据 */
|
||
WDOG_Unlock();
|
||
WDOG->CS2 = u8Cs2;
|
||
WDOG->TOVAL = u16TOVAL;
|
||
WDOG->WIN = u16WIN;
|
||
WDOG->CS1 = u8Cs1;
|
||
|
||
}
|
||
|
||
|
||
/********************************************************************/
|
||
|
||
/*! @} */
|
||
|
||
|
||
|
||
|