添加一些关于midi播放的项目
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
#include "common.h"
|
||||
#include "rtc.h"
|
||||
#include "flash.h"
|
||||
#include "sysinit.h"
|
||||
#include "etm.h"
|
||||
#include "eeprom.h"
|
||||
#include "pit.h"
|
||||
#include "sim.h"
|
||||
#include "gpio.h"
|
||||
#include "adc.h"
|
||||
#include "pmc.h"
|
||||
#include "Player.h"
|
||||
#include "SynthCore.h"
|
||||
#include "NV32.h"
|
||||
#include "systick.h"
|
||||
#include "KeyScan.h"
|
||||
#include "DownloadScoreData.h"
|
||||
#include <stdlib.h>
|
||||
#include "PeriodTimer.h"
|
||||
|
||||
Player mPlayer;
|
||||
|
||||
int main(void);
|
||||
void TestInit(void);
|
||||
void TestSynth(void);
|
||||
|
||||
|
||||
void ConfigPIT(void)
|
||||
{
|
||||
PIT_ConfigType sPITConfig0;
|
||||
PIT_ConfigType *pPIT_Config0 = &sPITConfig0;
|
||||
/* PIT时钟源为总线时钟 */
|
||||
/* 通道0装载值为 = (1000000-1),通道1装载值为 = (40-1) */
|
||||
|
||||
/* 配置通道0, 仅仅使能 */
|
||||
pPIT_Config0->u32LoadValue = 1249;
|
||||
pPIT_Config0->bFreeze = FALSE; //定时器在调试模式下继续运行
|
||||
pPIT_Config0->bModuleDis = FALSE; //使能定时器模块
|
||||
pPIT_Config0->bInterruptEn = TRUE;
|
||||
pPIT_Config0->bChainMode = FALSE;
|
||||
pPIT_Config0->bETMerEn = TRUE; //定时器使能
|
||||
|
||||
PIT_Init(PIT_CHANNEL0, pPIT_Config0); //初始化PIT模块通道0
|
||||
|
||||
// PIT_SetCallback(PIT_CHANNEL0, PIT_Task); //设置通道1中断回调函数
|
||||
}
|
||||
|
||||
void ConfigADC(void)
|
||||
{
|
||||
ADC_ConfigType sADC_Config = {0};
|
||||
|
||||
/*初始化ADC模块*/
|
||||
sADC_Config.u8ClockDiv = ADC_ADIV_DIVIDE_8; /*!< ADC时钟源分频系数为8*/
|
||||
sADC_Config.u8ClockSource = CLOCK_SOURCE_BUS_CLOCK; /*!< ADC时钟源选择总线时钟*/
|
||||
sADC_Config.u8Mode = ADC_MODE_12BIT; /*!< 12位转换*/
|
||||
|
||||
ADC_Init(ADC, &sADC_Config); /*!< 初始化ADC模块*/
|
||||
}
|
||||
|
||||
uint32_t GetVolt(void)
|
||||
{
|
||||
uint32_t voltChn = ADC_PollRead(ADC, ADC_CHANNEL_AD3);
|
||||
return voltChn;
|
||||
}
|
||||
|
||||
uint32_t GetVolume(void)
|
||||
{
|
||||
uint32_t volChn1 = ADC_PollRead(ADC, ADC_CHANNEL_AD2);
|
||||
return volChn1 >> 4;
|
||||
}
|
||||
|
||||
void ETM0Config(void)
|
||||
{
|
||||
SIM->SCGC |= SIM_SCGC_ETM0_MASK; //使能ETM2时钟
|
||||
ETM0->CONTROLS[0].CnSC = ETM_CnSC_ELSA_MASK | (1 << ETM_CnSC_MSB_SHIFT); //低真脉冲
|
||||
|
||||
ETM_ClockSet(ETM0, ETM_CLOCK_SYSTEMCLOCK, ETM_CLOCK_PS_DIV1); //ETM2时钟设置
|
||||
|
||||
ETM0->MOD = 0xFFFF;
|
||||
ETM0->CONTROLS[0].CnV = 0xFFFF;
|
||||
}
|
||||
|
||||
void ETM2Config(void)
|
||||
{
|
||||
SIM->SCGC |= SIM_SCGC_ETM2_MASK; //使能ETM2时钟
|
||||
ETM2->COMBINE &= ~ETM_COMBINE_COMBINE2_MASK; //通道0和通道1独立
|
||||
ETM2->SC |= ETM_SC_CPWMS_MASK; //选择先增后减的计数方式
|
||||
ETM2->COMBINE |= ETM_COMBINE_COMP2_MASK; //通道0和通道1的输出互补
|
||||
ETM2->CONTROLS[4].CnSC = ETM_CnSC_ELSA_MASK; //低真脉冲
|
||||
ETM2->CONTROLS[5].CnSC = ETM_CnSC_ELSA_MASK;
|
||||
|
||||
ETM_ClockSet(ETM2, ETM_CLOCK_SYSTEMCLOCK, ETM_CLOCK_PS_DIV1); //ETM2时钟设置
|
||||
|
||||
ETM_SetModValue(ETM2, 255);
|
||||
}
|
||||
|
||||
uint32_t GlobalMills = 0;
|
||||
|
||||
void SysTick_CallBack(void)
|
||||
{
|
||||
GlobalMills++;
|
||||
}
|
||||
|
||||
void SysTickConfig(void)
|
||||
{
|
||||
SysTick_SetCallBack(SysTick_CallBack);
|
||||
SysTick->CTRL = 0;
|
||||
SysTick->LOAD = (BUS_CLK_HZ) / 1000 - 1; //配置定时中断时间为1MS
|
||||
SysTick->VAL = 0;
|
||||
NVIC_SetPriority(SysTick_IRQn, (1 << __NVIC_PRIO_BITS) - 1);
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_CLKSOURCE_Msk; //开中断开定时器
|
||||
}
|
||||
/********************************************************************/
|
||||
|
||||
void KeyNextCallBack(uint32_t param)
|
||||
{
|
||||
PlaySchedulerNextScore(&mPlayer);
|
||||
}
|
||||
|
||||
void KeyPreviousCallBack(uint32_t param)
|
||||
{
|
||||
PlaySchedulerPreviousScore(&mPlayer);
|
||||
}
|
||||
|
||||
void VisualIndicatorPrcoess(Player *player)
|
||||
{
|
||||
ETM0->CONTROLS[0].CnV = abs(player->synthesizer.mixOut) >> 8;
|
||||
}
|
||||
|
||||
void VolumeProcess(Player *player)
|
||||
{
|
||||
player->synthesizer.mainVolume = GetVolume();
|
||||
}
|
||||
|
||||
void SynthHwOnOff(SYNTH_HW_STATUS status)
|
||||
{
|
||||
static SYNTH_HW_STATUS lastStatus = SYNTH_HW_OFF;
|
||||
DisableInterrupts;
|
||||
if (status == SYNTH_HW_ON)
|
||||
{
|
||||
if (lastStatus != SYNTH_HW_ON)
|
||||
{
|
||||
lastStatus = SYNTH_HW_ON;
|
||||
ConfigPIT();
|
||||
ETM2Config();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lastStatus != SYNTH_HW_OFF)
|
||||
{
|
||||
lastStatus = SYNTH_HW_OFF;
|
||||
PIT_DeInit();
|
||||
ETM_DeInit(ETM2);
|
||||
}
|
||||
}
|
||||
EnableInterrupts;
|
||||
}
|
||||
|
||||
uint8_t GetRandom(void)
|
||||
{
|
||||
uint8_t random = 0;
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
random |= ((ADC_PollRead(ADC, ADC_CHANNEL_AD5) & 0x07) << (i * 3));
|
||||
}
|
||||
return random;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
PMC_DisableLVD(PMC);
|
||||
sysinit();
|
||||
GPIO_Init(GPIOA, GPIO_PTB1_MASK, GPIO_PinInput);
|
||||
GPIO_Init(GPIOA, GPIO_PTA6_MASK, GPIO_PinInput);
|
||||
GPIO_Init(GPIOA, GPIO_PTA7_MASK, GPIO_PinInput);
|
||||
GPIO_Init(GPIOA, GPIO_PTA0_MASK, GPIO_PinInput_InternalPullup);
|
||||
GPIO_Init(GPIOA, GPIO_PTA1_MASK, GPIO_PinInput_InternalPullup);
|
||||
GPIO_Init(GPIOA, GPIO_PTA2_MASK, GPIO_PinInput);
|
||||
SIM_RemapETM0CH0Pin();
|
||||
|
||||
(*((uint32_t *)0x4004900C)) = PORT_HDRVE_PTB4_MASK | PORT_HDRVE_PTB5_MASK | PORT_HDRVE_PTH1_MASK | PORT_HDRVE_PTH0_MASK;
|
||||
|
||||
PlayerInit(&mPlayer);
|
||||
SynthRegisterHwChangeFunc(&mPlayer.synthesizer, SynthHwOnOff);
|
||||
KeyScanInit();
|
||||
|
||||
DownloadInit();
|
||||
ConfigADC();
|
||||
ETM0Config();
|
||||
SysTickConfig();
|
||||
KeySetCallBack(USER_KEY_2, KeyNextCallBack);
|
||||
KeySetCallBack(USER_KEY_1, KeyPreviousCallBack);
|
||||
StartPlayScheduler(&mPlayer);
|
||||
SchedulerSetIntialRandomSeed(&mPlayer, GetRandom());
|
||||
srand(GetRandom());
|
||||
|
||||
while (1)
|
||||
{
|
||||
VolumeProcess(&mPlayer);
|
||||
PlayerProcess(&mPlayer);
|
||||
KeyProcess(GlobalMills);
|
||||
KeyRawInput(USER_KEY_2, GPIO_BitRead(GPIO_PTA0));
|
||||
KeyRawInput(USER_KEY_1, GPIO_BitRead(GPIO_PTA1));
|
||||
VisualIndicatorPrcoess(&mPlayer);
|
||||
DownloadProcess();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user