实验代码如下: 实现现象 MP3 文件 :
https://pan.baidu.com/s/1i5DRGKP实验原理:参照stm32例子读取25Q16的数据送给单片机,调节占空比输出,送给LM386放大,输出至喇叭实现音乐播放
加了一个temper缓冲区是为了加快数据的读取,一次读一个数据送给单片机放大后,播放的音乐太慢
实验问题:播放出来的音乐有杂音
volatile uint32_t MusicDataAddress=0x00032f06;//0x0001be06,(0,1,2) ,0x00032f06,0x00024760
uint16_t pwmcnt=0,pwm5flag=0,MusicPosite=0;
uint8_t tempbuffer[3]={0};
void InitPWM(void)
{
/* Step 1. GPIO initial */
getMusicData();
DrvGPIO_InitFunction(FUNC_PWM45);
/* Step 2. Enable and Select PWM clock source*/
DrvPWM_Open();
DrvPWM_SelectClockSource(DRVPWM_TIMER5,3); //0:使用外部12M晶振 3:使用内部22.1184M晶振
PWMB->
PR.CP01=1;//4-1 //0~255 支持8位PWM分频 0~255设置为0的时候禁止时钟输出注意9是算出的分频值减1
PWMB->CSR.CSR1=0; // 2分频PWM timer 5 for group B 2的(n+1)次方分频 n:3
//PWM timer 1 for group A,PWM timer 5 for group B)
/* Step 3. Select PWM Operation mode */
PWMB->
CR.CH1MOD=1; //0:One-shot mode单触发模式, 1:Auto-load mode自动加载模式
//CNR and CMR will be auto-cleared after setting CH1MOD form 0 to 1.
PWMB->CNR1=0x0085; // 50k 0x006e 0x006e
PWMB->CMR1=0x0036; // 0x0037
PWMB->
CR.CH1INV=0; //输出反转Inverter->0
ff反转关闭, 1
n反转打开 0:CMR >= CNR: PWM 输出为高
DrvPWM_Enable(DRVPWM_TIMER5,1); // 使能pwm5
DrvPWM_EnableInt(DRVPWM_TIMER5,1,(PFN_DRVPWM_CALLBACK)pfnPWM5CallBack); //使能pwm5通道1中断
DrvPWM_SetTimerIO(DRVPWM_TIMER5,1); //Output to pin->0
iasble, 1:Enable 使能pwm5输出使能管脚
}
/**********************************************************************
* 函 数 名:pfnPWM5CallBack
* 参 数:PWM5中断回调函数初始化
* 功能描述:
* 返 回 值:无
* 抛出异常:无
* 作 者:
**********************************************************************/
void pfnPWM5CallBack(void)
{
pwmcnt++;
if(MusicPosite>2)
{
tempbuffer[0]=0;
tempbuffer[1]=0;
MusicPosite=0;
getMusicData();
}
if(pwmcnt<66000) //359632 32894(呲呲声音) 66000 65500(欢迎光临) 6800(01) 453(80杂音测试)
{
MusicPosite++;
MusicDataAddress++;
}
else
{
pwmcnt=0;
MusicDataAddress=0x00032f06; //0x0001be06 0x00032f06(0,1,2) 0x00032fff ,0x00024760(80测试杂音)00033370h
tempbuffer[0]=0;
tempbuffer[1]=0;
}
}
一周热门 更多>