添加一些关于midi播放的项目
This commit is contained in:
@@ -0,0 +1,265 @@
|
||||
/****************************************************************************!
|
||||
* 技术讨论: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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
/*! @} */
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* @brief WDG 驱动头文件.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __WDOG_H__
|
||||
#define __WDOG_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "common.h"
|
||||
#include "sim.h"
|
||||
/*****************************************************************************/
|
||||
/******************************************************************************
|
||||
* 定义WDG时钟源
|
||||
*
|
||||
*//*! @WDG时钟源
|
||||
* @{
|
||||
*******************************************************************************/
|
||||
|
||||
#define WDOG_CLK_BUS 0 /*!< 总线时钟 */
|
||||
#define WDOG_CLK_INTERNAL_32KHZ 2 /*!< 内部 32 kHz (ICSIRCLK) */
|
||||
#define WDOG_CLK_INTERNAL_1KHZ 1 /*!< 内部 LPO 1 KHz */
|
||||
#define WDOG_CLK_EXTERNAL 3 /*!< 外部时钟 */
|
||||
/*! @} */
|
||||
|
||||
/* 看门狗时钟源选择 */
|
||||
#define WDOG_CLK (WDOG_CLK_INTERNAL_1KHZ)
|
||||
|
||||
/* 看门狗寄存器默认值设置 */
|
||||
#define WDOG_CS1_DEFAULT_VALUE 0x80
|
||||
#define WDOG_CS2_DEFAULT_VALUE 0x01
|
||||
#define WDOG_TOVAL_DEFAULT_VALUE 0x0400
|
||||
#define WDOG_WIN_DEFAULT_VALUE 0x0000
|
||||
|
||||
|
||||
/*!
|
||||
* @brief 看门狗解锁.
|
||||
*/
|
||||
#define WDOG_Unlock() DisableInterrupts; WDOG->CNT = 0x20C5; WDOG->CNT = 0x28D9; EnableInterrupts //Modify
|
||||
/*! @} */
|
||||
|
||||
/******************************************************************************
|
||||
* define 看门狗配置结构体
|
||||
*
|
||||
*//*! @看门狗配置结构体
|
||||
* @{
|
||||
*******************************************************************************/
|
||||
typedef struct {
|
||||
struct {
|
||||
uint16_t bIntEnable : 1; /*!< 看门狗中断使能 */
|
||||
uint16_t bDisable : 1; /*!< 禁用看门狗 */
|
||||
uint16_t bWaitEnable : 1; /*!< 使能看门狗等待模式 */
|
||||
uint16_t bStopEnable : 1; /*!< 使能看门狗停止模式 */
|
||||
uint16_t bDbgEnable : 1; /*!< 使能看门狗调试模式 */
|
||||
uint16_t bWinEnable : 1; /*!< 使能看门狗窗口模式 */
|
||||
uint16_t bUpdateEnable : 1; /*!< 使能允许看门狗更新 */
|
||||
uint16_t bClkSrc : 2; /*!< 看门狗时钟源选择 */
|
||||
uint16_t bPrescaler : 1; /*!< 预分频系数 */
|
||||
}sBits; /*!< 位域结构体 */
|
||||
uint16_t u16ETMeOut; /*!< 看门狗超时值 */
|
||||
uint16_t u16WinETMe; /*!< 看门狗窗口值 */
|
||||
} WDOG_ConfigType, *WDOG_ConfigPtr; /*!< 看门狗配置结构体类型 */
|
||||
/*! @} */
|
||||
|
||||
/******************************************************************************
|
||||
******************************************************************************/
|
||||
|
||||
/*!
|
||||
* 内联函数
|
||||
*/
|
||||
|
||||
/*****************************************************************************//*!
|
||||
*
|
||||
* @brief 设置看门狗超时值.
|
||||
*
|
||||
* @param[in] u16ETMeOut 超时值.
|
||||
*
|
||||
* @return none
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
__STATIC_INLINE void WDOG_SetETMeOut(uint16_t u16ETMeOut)
|
||||
{
|
||||
WDOG->CNT = 0x20C5;
|
||||
WDOG->CNT = 0x28D9;
|
||||
WDOG->TOVAL8B.TOVALL = u16ETMeOut;
|
||||
WDOG->TOVAL8B.TOVALH = u16ETMeOut >> 8;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************//*!
|
||||
*
|
||||
* @brief 设置看门狗窗口.
|
||||
*
|
||||
* @param[in] u16WinETMe 看门狗窗口值.
|
||||
*
|
||||
* @return none
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
__STATIC_INLINE void WDOG_SetWindow(uint16_t u16WinETMe)
|
||||
{
|
||||
WDOG->CNT = 0x20C5;
|
||||
WDOG->CNT = 0x28D9;
|
||||
WDOG->WIN8B.WINL = u16WinETMe;
|
||||
WDOG->WIN8B.WINH = u16WinETMe >> 8;
|
||||
}
|
||||
|
||||
/*****************************************************************************//*!
|
||||
*
|
||||
* @brief 检查看门狗是否复位.
|
||||
*
|
||||
* @param none.
|
||||
*
|
||||
* @return TRUE 当看门狗复位发生, FALSE 无.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
__STATIC_INLINE uint8_t WDOG_IsReset(void)
|
||||
{
|
||||
if(SIM_GetStatus(SIM_SRSID_WDOG_MASK))
|
||||
{
|
||||
return (TRUE);
|
||||
}
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*! @} */
|
||||
|
||||
|
||||
void WDOG_Init(WDOG_ConfigPtr pConfig);
|
||||
void WDOG_DeInit(void);
|
||||
void WDOG_Disable(void);
|
||||
void WDOG_DisableWDOGEnableUpdate(void);
|
||||
void WDOG_Enable(void);
|
||||
void WDOG_Feed(void);
|
||||
void WDOG_SetETMeOut(uint16_t u16ETMeOut);
|
||||
void WDOG_SetWindow(uint16_t u16WinETMe);
|
||||
void WDOG_EnableUpdate(void);
|
||||
void WDOG_DisableUpdate(void);
|
||||
uint8_t WDOG_IsReset(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************/
|
||||
#endif /* __WDOG_H__ */
|
||||
|
||||
Reference in New Issue
Block a user