参照stm32 实现pwm波播放音乐

2019-07-20 16:01发布

实验代码如下:   实现现象   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->0ff反转关闭, 1n反转打开 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->0iasble, 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;

                 }                               
}






0条回答

一周热门 更多>