添加一些关于midi播放的项目

This commit is contained in:
terryLP
2025-03-24 14:30:56 +08:00
parent e31eb22077
commit 498b4ef13b
699 changed files with 186162 additions and 1 deletions
@@ -0,0 +1,137 @@
/************************************************************************!
* 技术讨论:QQ群 123763203
* 官网 www.navota.com
*
* @file rtc.c
* @brief rtc定时器函数库
* @author Navota
* @date 2018-3-1
***************************************************************************/
#include "common.h"
#include "rtc.h"
/*!
* @brief 存放中断回调入口
*
*/
RTC_CallbackType RTC_Callback[1] = {(RTC_CallbackType)NULL};
void RTC_Isr(void);
/******************************************************************************
* 定义RTC的接口函数
*******************************************************************************/
/*****************************************************************************//*!
*
* @brief 初始化RTC模块
*
* @param[in] pConfig 配置RTC模块的结构体
*
* @return none
*
*****************************************************************************/
void RTC_Init(RTC_ConfigType *pConfig)
{
uint16_t u16Clocksource, u16Prescler;
uint16_t u16ModVal;
u16Clocksource =0;
u16Prescler =0;
u16ModVal =0;
SIM->SCGC |= SIM_SCGC_RTC_MASK;
u16ModVal = pConfig->u16ModuloValue;
RTC_SetModulo(u16ModVal);
if (pConfig->bRTCOut)
{
RTC->SC= RTC_SC_RTCO_MASK;
}
if (pConfig->bInterruptEn)
{
NVIC_EnableIRQ(RTC_IRQn);
RTC_EnableInt();
}
else
{
NVIC_DisableIRQ(RTC_IRQn);
}
if (pConfig->bFlag)
{
RTC_ClrFlags();
}
u16Clocksource = pConfig->bClockSource;
u16Prescler = pConfig->bClockPresaler;
RTC_SetClock(u16Clocksource,u16Prescler );
}
/*****************************************************************************//*!
*
* @brief 设置RTC模块的中断回调函数
*
* @param[in] pfnCallback 回调函数的地址
*
* @return none
*
*****************************************************************************/
void RTC_SetCallback(RTC_CallbackType pfnCallback)
{
RTC_Callback[0] = pfnCallback;
}
/*****************************************************************************//*!
*
* @brief 复位RTC模块
*
* @param none
*
* @return none
*
*****************************************************************************/
void RTC_DeInit(void)
{
NVIC_DisableIRQ(RTC_IRQn);
RTC->MOD = 0;
while(RTC->MOD);
if(RTC_GetFlags())
{
RTC_ClrFlags();
}
RTC->SC = 0;
while(RTC->SC);
SIM->SCGC &= ~SIM_SCGC_RTC_MASK;
}
/*****************************************************************************//*!
*
* @brief RTC中断服务函数
*
* @param none
*
* @return none
*
*****************************************************************************/
void RTC_Isr(void)
{
RTC_ClrFlags(); //清除中断标志位
if (RTC_Callback[0])
{
RTC_Callback[0]();
}
}
@@ -0,0 +1,182 @@
/******************************************************************************
*
* @brief RTC 驱动头文件.
*
******************************************************************************/
#ifndef RTC_H_
#define RTC_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "common.h"
/******************************************************************************
* RTC控制位定义
*
*//*!
* @{
*******************************************************************************/
#define RTC_OUTPUT_ENABLE 1 /*!< 使能RTC输出引脚 */
#define RTC_INTERRUPT_ENABLE 1 /*!< 使能RTC中断 */
#define RTC_CLKSRC_EXTERNAL 0 /*!< 选择外部时钟作为RTC时钟源 */
#define RTC_CLKSRC_1KHZ 1 /*!< 选择LPO时钟作为RTC时钟源 */
#define RTC_CLKSRC_IREF 2 /*!< 选择内部参考时钟ICSIRCLK作为RTC时钟源 */
#define RTC_CLKSRC_BUS 3 /*!< 选择总线时钟作为RTC时钟源 */
#define RTC_CLK_PRESCALER_128 1 /*!< 根据RTCLKS位选择是1还是128分频 */
#define RTC_CLK_PRESCALER_256 2 /*!< 根据RTCLKS位选择是2还是256分频 */
#define RTC_CLK_PRESCALER_512 3 /*!< 根据RTCLKS位选择是4还是512分频 */
#define RTC_CLK_PRESCALER_1024 4 /*!< 根据RTCLKS位选择是8还是1024分频 */
#define RTC_CLK_PRESCALER_2048 5 /*!< 根据RTCLKS位选择是16还是2048分频 */
#define RTC_CLK_PRESCALER_100 6 /*!< 根据RTCLKS位选择是32还是100分频 */
#define RTC_CLK_PRESCALER_1000 7 /*!< 根据RTCLKS位选择是64还是1000分频 */
/*! @} */
/*!
* @brief RTC 回调类型.
*
*/
typedef void (*RTC_CallbackType)(void);
/* RTC 配置结构体体
*/
/*!
* @brief RTC 配置参数.
*
*/
typedef struct
{
uint16_t bReserved : 4; /*!< 保留 */
uint16_t bRTCOut : 1; /*!< 1: 使能RTC输出, 0: 禁止RTC输出 */
uint16_t bReserved1 : 1; /*!< 保留 */
uint16_t bInterruptEn : 1; /*!< 1: 使能RTC中断, 0: RTC 禁止RTC中断 */
uint16_t bFlag : 1; /*!< 1: RTC实时中断标志 */
uint16_t bClockPresaler : 3; /*!< 3: RTC分频系数选择 */
uint16_t bReserved2 : 3; /*!< 保留*/
uint16_t bClockSource : 2; /*!< 2:RTC时钟源选择 */
uint16_t u16ModuloValue ; /*!< 16位RTC模值 */
} RTC_ConfigType, *RTC_ConfigPtr;
/******************************************************************************
******************************************************************************/
/*!
* 内联函数
*/
/*****************************************************************************//*!
*
* @brief 使能RTC中断.
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void RTC_EnableInt(void)
{
RTC->SC |= RTC_SC_RTIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁止RTC中断.
*
* @param none
*
* @return non
*
*****************************************************************************/
__STATIC_INLINE void RTC_DisableInt(void)
{
RTC->SC &= ~RTC_SC_RTIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 设置16位RTC模值.
*
* @param[in] u16Mod_Value 16位模值
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void RTC_SetModulo(uint16_t u16Mod_Value)
{
RTC->MOD = u16Mod_Value;
}
/*****************************************************************************//*!
*
* @brief 设置RTC时钟以及分频系数.
*
* @param[in] u16Clock_Number 选择时钟源
* @param[in] u16Presalcer 分频系数
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void RTC_SetClock(uint16_t u16Clock_Number, uint16_t u16Presalcer)
{
uint32_t u32rtc_sc;
u32rtc_sc = RTC->SC;
u32rtc_sc &= ~(RTC_SC_RTCLKS_MASK | RTC_SC_RTCPS_MASK);
u32rtc_sc |= RTC_SC_RTCLKS(u16Clock_Number) | RTC_SC_RTCPS(u16Presalcer);
RTC->SC = u32rtc_sc;
}
/*****************************************************************************//*!
*
* @brief 获取RTC中断标志位.
*
* @param none
*
* @return RTC中断标志位.
*
*****************************************************************************/
__STATIC_INLINE uint8_t RTC_GetFlags(void)
{
uint8_t bflag;
bflag = RTC->SC & RTC_SC_RTIF_MASK;
return bflag;
}
/*****************************************************************************//*!
*
* @brief 清除RTC中断标志位.
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void RTC_ClrFlags(void)
{
RTC->SC |= RTC_SC_RTIF_MASK;
}
/******************************************************************************
******************************************************************************/
void RTC_Init(RTC_ConfigType *pConfig);
void RTC_SetCallback(RTC_CallbackType pfnCallback);
void RTC_DeInit(void);
#ifdef __cplusplus
}
#endif
#endif /* RTC_H_ */