添加一些关于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,83 @@
/*****************************************************************************!
* 技术讨论:QQ群 123763203
* 官网 www.navota.com
*
* @file pmc.c
* @brief 电源管理模块(PMC)函数库
* @author Navota
* @date 2018-3-1
*****************************************************************************/
#include "common.h"
#include "pmc.h"
/*****************************************************************************//*!
*
* @brief PMC模块初始化函数
*
* @param[in] pPMC_Config PMC 配置结构体.
* @param[in] pPMC PMC
*
* @return none.
*
*****************************************************************************/
void PMC_Init(PMC_Type *pPMC, PMC_ConfigType *pPMC_Config)
{
pPMC->SPMSC1 = pPMC_Config->sCtrlstatus.byte;
pPMC->SPMSC2 = pPMC_Config->sDetectVoltSelect.byte;
if(pPMC_Config->sCtrlstatus.bits.bLvwIrqEn)
NVIC_EnableIRQ(LVD_LVW_IRQn);
}
/*****************************************************************************//*!
*
* @brief 复位PMC模块.
*
* @param[in] pPMC PMC
*
* @return none.
*
*****************************************************************************/
void PMC_DeInit(PMC_Type *pPMC)
{
pPMC->SPMSC1 = 0x1C;
pPMC->SPMSC2 = 0;
}
/*****************************************************************************//*!
*
* @brief MCU工作模式选择函数
*
* @param[in] u8PmcMode 选择MCU工作模式.
* @param[in] pPMC PMC
*
* @return none.
*
*****************************************************************************/
void PMC_SetMode(PMC_Type *pPMC,uint8_t u8PmcMode)
{
switch(u8PmcMode & 0x3)
{
case PmcModeRun:
break;
case PmcModeWait: //等待模式
wait();
break;
case PmcModeStop4:
/* 停止模式下,使能低压检测*/
pPMC->SPMSC1 |= (PMC_SPMSC1_LVDE_MASK | PMC_SPMSC1_LVDSE_MASK);
stop();
break;
case PmcModeStop3:
/* 在停止模式下,禁用低压检测*/
pPMC->SPMSC1 &= ~(PMC_SPMSC1_LVDE_MASK | PMC_SPMSC1_LVDRE_MASK | PMC_SPMSC1_LVDSE_MASK);
stop();
break;
default:
break;
}
}
@@ -0,0 +1,298 @@
/******************************************************************************
*
* @brief PMC 驱动头文件.
*
******************************************************************************/
#ifndef PMC_H_
#define PMC_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "common.h"
/******************************************************************************
* PCM系统(MCU工作模式)模式定义
*
*******************************************************************************/
#define PmcModeRun 0 /*!< 运行模式 */
#define PmcModeWait 1 /*!< 等到模式 */
#define PmcModeStop4 2 /*!< 停止模式4 */
#define PmcModeStop3 3 /*!< 停止模式3 */
/******************************************************************************
* PMC 低压检测和低压报警电压定义
*
*******************************************************************************/
#define PmcLVDTrip_Low 0 /*!< LVD 低电平调变点 */
#define PmcLVDTrip_High 1 /*!< LVD 高电平调变点 */
#define PmcLVWTrip_Low 0 /*!< LVW 低电平跳变点 */
#define PmcLVWTrip_Mid1 1 /*!< LVW 中间电平1跳变点 */
#define PmcLVWTrip_Mid2 2 /*!< LVW 中间电平2跳变点*/
#define PmcLVWTrip_High 3 /*!< LVW 高电平跳变点*/
/******************************************************************************
* PMC 控制结构体
*******************************************************************************/
/*!
* @brief PMC控制结构体类型
*
*/
typedef union
{
uint8_t byte; /*!< 联合体的类型-字节*/
struct
{
uint8_t bBandgapEn :1; /*!< 使能带隙缓冲区 */
uint8_t bBandgapDrv :1; /*!< 选择带隙驱动*/
uint8_t bLvdEn :1; /*!< 使能低压检测*/
uint8_t bLvdStopEn :1; /*!< 低压检测在停止模式下使能*/
uint8_t bLvdRstEn :1; /*!< 使能低压检测复位 */
uint8_t bLvwIrqEn :1; /*!< 使能低压报警中断 */
uint8_t bLvwAck :1; /*!< 低压报警应答 */
uint8_t bLvwFlag :1; /*!< 低压报警标志 */
}bits; /*!< 联合体类型-位 */
}PMC_Ctrl1Type, *PMC_Ctrl1Ptr; /*!< PMC 控制寄存器1结构体 */
/******************************************************************************
* PMC 控制-- 低压选择.
*******************************************************************************/
/*!
* @brief PMC 控制-- 电压类型选择.
*
*/
typedef union
{
uint8_t byte; /*!< 联合体类型-字节 */
struct
{
uint8_t :4; /*!< none */
uint8_t bLVWV :2; /*!< 低压报警电压选择 */
uint8_t bLVDV :1; /*!< 低压复位电压选择 */
uint8_t :1; /*!< none */
}bits; /*!< 结构体类型——位 */
}PMC_Ctrl2Type, *PMC_Ctrl2Ptr; /*!< PMC 控制寄存器2结构体*/
/******************************************************************************
* PMC 配置结构体
*******************************************************************************/
typedef struct
{
PMC_Ctrl1Type sCtrlstatus; /*!< PMC 控制和状态 */
PMC_Ctrl2Type sDetectVoltSelect; /*!< 低压报警电压和低压复位电压选择*/
}PMC_ConfigType, *PMC_ConfigPtr; /*!< PMC 配置结构体 */
/*****************************************************************************//*!
*
* @brief 在停止模式下使能低压检测.
*
* @param[in] pPMC 指向PMC模块
*
* @return none.
*
* @see PMC_DisableLVDInStopMode.
*
*****************************************************************************/
__STATIC_INLINE void PMC_EnableLVDInStopMode(PMC_Type *pPMC)
{
pPMC->SPMSC1 |= PMC_SPMSC1_LVDSE_MASK;
}
/*****************************************************************************//*!
*
* @brief 在停止模式下禁用低压检测
*
* @param[in] pPMC 指向PMC模块
*
* @return none.
*
* @see PMC_EnableLVDInStopMode.
*
*****************************************************************************/
__STATIC_INLINE void PMC_DisableLVDInStopMode(PMC_Type *pPMC)
{
pPMC->SPMSC1 &= ~PMC_SPMSC1_LVDSE_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能低压检测复位 注: 复位后该字段仅可写一次
*
* @param[in] pPMC 指向PMC模块.
*
* @return none.
*
* @see PMC_DisableLVDRst.
*
*****************************************************************************/
__STATIC_INLINE void PMC_EnableLVDRst(PMC_Type *pPMC)
{
pPMC->SPMSC1 |= PMC_SPMSC1_LVDRE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用低压检测复位 注: 复位后该字段仅可写一次
*
* @param[in] pPMC 指向PMC模块
*
* @return none.
*
* @see PMC_EnableLVDRst.
*
*****************************************************************************/
__STATIC_INLINE void PMC_DisableLVDRst(PMC_Type *pPMC)
{
pPMC->SPMSC1 &= ~PMC_SPMSC1_LVDRE_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能低压检测, 注: 复位后该字段仅可写一次
*
* @param[in] pPMC 指向PMC模块
*
* @return none.
*
* @see PMC_DisableLVD.
*
*****************************************************************************/
__STATIC_INLINE void PMC_EnableLVD(PMC_Type *pPMC)
{
pPMC->SPMSC1 |= PMC_SPMSC1_LVDE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用低压检测, 注: 复位后该字段仅可写一次
*
* @param[in] pPMC 指向PMC模块
*
* @return none.
*
* @see PMC_EnableLVD.
*
*****************************************************************************/
__STATIC_INLINE void PMC_DisableLVD(PMC_Type *pPMC)
{
pPMC->SPMSC1 &= ~PMC_SPMSC1_LVDE_MASK;
}
/*****************************************************************************//*!
*
* @brief 设置低压检测跳变点,
*
* @param[in] pPMC 指向PMC模块
* @param[in] Trippoint 电压检测跳变点选择,1-高电平跳变 0-低电平跳变
*
* @return none.
*
* @see PMC_SetLVWTripVolt.
*
*****************************************************************************/
__STATIC_INLINE void PMC_SetLVDTripVolt(PMC_Type *pPMC, uint8_t Trippoint)
{
if(Trippoint)
pPMC->SPMSC2 |= PMC_SPMSC2_LVDV_MASK;
else
pPMC->SPMSC2 &= ~PMC_SPMSC2_LVDV_MASK;
}
/*****************************************************************************//*!
*
* @brief 选择电压报警跳变点电压
*
* @param[in] pPMC 指向PMC模块
* @param[in] Trippoint 低压报警跳变点电压 0 低电平跳变 1 中间电平1跳变
* 2 中间电平2跳变 3 高电平跳变
*
* @return none.
*
* @see PMC_SetLVDTripVolt.
*
*****************************************************************************/
__STATIC_INLINE void PMC_SetLVWTripVolt(PMC_Type *pPMC, uint8_t Trippoint)
{
pPMC->SPMSC2 &= ~PMC_SPMSC2_LVWV_MASK;
pPMC->SPMSC2 |= PMC_SPMSC2_LVWV(Trippoint);
}
/*****************************************************************************//*!
*
* @brief 使能低压报警中断
*
* @param[in] pPMC 指向PMC模块
*
* @return none.
*
* @see PMC_DisableLVWInterrupt.
*
*****************************************************************************/
__STATIC_INLINE void PMC_EnableLVWInterrupt(PMC_Type *pPMC)
{
pPMC->SPMSC1 |= PMC_SPMSC1_LVWIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用低压报警中断
*
* @param[in] pPMC 指向PMC模块.
*
* @return none.
*
*
* @see PMC_EnableLVWInterrupt.
*
*****************************************************************************/
__STATIC_INLINE void PMC_DisableLVWInterrupt(PMC_Type *pPMC)
{
pPMC->SPMSC1 &= ~PMC_SPMSC1_LVWIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 读取低压报警标志位.
*
* @param[in] pPMC 指向PMC模块.
*
* @return 低压报警标志位值
*
* @see PMC_ClrLVWFlag.
*
*****************************************************************************/
__STATIC_INLINE uint8_t PMC_GetLVWFlag(PMC_Type *pPMC)
{
return (pPMC->SPMSC1 & PMC_SPMSC1_LVWF_MASK);
}
/*****************************************************************************//*!
*
* @brief 清除低压报警标志位
*
* @param[in] pPMC 指向PMC模块.
*
* @return none.
*
* @see PMC_GetLVWFlag.
*
*****************************************************************************/
__STATIC_INLINE void PMC_ClrLVWFlag(PMC_Type *pPMC)
{
pPMC->SPMSC1 |= PMC_SPMSC1_LVWACK_MASK;
}
/**************************************************************************/
void PMC_Init(PMC_Type *pPMC, PMC_ConfigType *pPMC_Config);
void PMC_DeInit(PMC_Type *pPMC);
void PMC_SetMode(PMC_Type *pPMC,uint8_t u8PmcMode);
#ifdef __cplusplus
}
#endif
#endif