野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32425|回复: 46

STM32 + VS1053 +OLED屏幕制作的MP3,附例程和视频播放效果

[复制链接]
发表于 2016-7-28 11:04:40 | 显示全部楼层 |阅读模式
新手兼菜鸟,初次发帖,用OLED屏幕制作的MP3,解码芯片用的是vs1003(用的是模块,杜邦线连接的,方便测试),主控是stm32f103zet6(用的是开发板,没打pcb,等开学做板子)。
模块连线可以照代码中芯片初始化的接口连接。等下发个视频。代码和图片上传不了。留了网盘链接。
百度云链接:http://pan.baidu.com/s/1kU5SP6n

以下由fire根据楼主提供的资料整理:

1-视频:


2-代码:
My_OLED_MP3_Chinese_FSM_6.zip (1.83 MB, 下载次数: 516)

3-图片
1.jpg

1.jpg







2.jpg
回复

使用道具 举报

发表于 2016-7-28 11:55:52 | 显示全部楼层
我被楼主的资料下载下来后,整理如下:
图片
1.jpg
6.jpg
2.jpg

代码
My_OLED_MP3_Chinese_FSM_6.zip (1.83 MB, 下载次数: 628)
视频



3.jpg
5.jpg
回复 支持 反对

使用道具 举报

发表于 2016-7-28 11:51:57 | 显示全部楼层
很厉害啊,想研究一下这些菜单是怎么制作的
回复 支持 反对

使用道具 举报

发表于 2016-7-28 12:07:04 | 显示全部楼层
cool,已加精华贴
回复 支持 反对

使用道具 举报

发表于 2016-7-28 13:41:56 | 显示全部楼层
牛逼啊,看着好像是可以显示歌词,是不是?
回复 支持 反对

使用道具 举报

发表于 2016-7-28 13:42:25 | 显示全部楼层
谢谢分享,不错的资料。
回复 支持 反对

使用道具 举报

发表于 2016-7-28 13:42:56 | 显示全部楼层
做到不错                           
回复 支持 反对

使用道具 举报

发表于 2016-7-28 14:00:04 | 显示全部楼层
和普通的mp3是一样的吗?
回复 支持 反对

使用道具 举报

发表于 2016-7-28 14:00:27 | 显示全部楼层
赞啊,楼主初学就做了个小作品,不错嘛
回复 支持 反对

使用道具 举报

发表于 2016-7-28 14:00:56 | 显示全部楼层
自从接触了stm32,我就大概知道市面上那些普通的mp3是怎么做出来的了
回复 支持 反对

使用道具 举报

发表于 2016-7-28 14:01:30 | 显示全部楼层
支持歌词显示嘛
回复 支持 反对

使用道具 举报

发表于 2016-7-28 14:01:52 | 显示全部楼层
赞,这样的资料可以拿来自已用一下,谢谢火哥和楼主
回复 支持 反对

使用道具 举报

发表于 2016-7-28 14:02:58 | 显示全部楼层
做的很好啊,下载代码来看看,再买个OLED,我也试试做一个
回复 支持 反对

使用道具 举报

发表于 2016-7-28 14:07:17 | 显示全部楼层
酷~~~~~~~~~~~·
回复

使用道具 举报

发表于 2016-7-28 14:23:27 | 显示全部楼层
楼主特别棒,火哥很给力!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 15:50:47 | 显示全部楼层
fire 发表于 2016-7-28 12:07
cool,已加精华贴

谢谢火哥帮忙整理资料
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 15:55:16 | 显示全部楼层
祁羽彤 发表于 2016-7-28 13:41
牛逼啊,看着好像是可以显示歌词,是不是?

目前不能显示歌词,因为没加系统,用状态机思想实现的。显示歌词的话,就要用到ucos了。用状态机实现的话是比较困难的,实时性不好。
回复 支持 反对

使用道具 举报

发表于 2016-7-28 15:58:12 | 显示全部楼层
李小龙 发表于 2016-7-28 15:55
目前不能显示歌词,因为没加系统,用状态机思想实现的。显示歌词的话,就要用到ucos了。用状态机实现的话 ...

那用ucos搞一个                    
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 15:59:44 | 显示全部楼层
红思雨 发表于 2016-7-28 14:00
和普通的mp3是一样的吗?

可以更强大的,只要芯片flash够大,可以加入很多小游戏,各种功能,准备再添加个界面,用来做智能家居,控制家里的电器,根据自己发挥了
回复 支持 反对

使用道具 举报

发表于 2016-7-28 16:00:12 | 显示全部楼层
汪曼丽 发表于 2016-7-28 14:00
自从接触了stm32,我就大概知道市面上那些普通的mp3是怎么做出来的了

你肯定不知道,我敢保证90%的人都不知道
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:00:27 | 显示全部楼层
康锦 发表于 2016-7-28 14:00
赞啊,楼主初学就做了个小作品,不错嘛

谢谢,共同努力                                                                                            
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:01:01 | 显示全部楼层

目前不支持,可以自己发挥
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:01:22 | 显示全部楼层
解凝然 发表于 2016-7-28 14:01
赞,这样的资料可以拿来自已用一下,谢谢火哥和楼主

不用谢                                                  
回复 支持 反对

使用道具 举报

发表于 2016-7-28 16:04:27 | 显示全部楼层
李小龙 发表于 2016-7-28 15:59
可以更强大的,只要芯片flash够大,可以加入很多小游戏,各种功能,准备再添加个界面,用来做智能家居, ...

如果我送你一块 F429的核心板,2M 的 FLASH ,你能玩出什么花样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:09:33 | 显示全部楼层
潮小男ㄨ 发表于 2016-7-28 11:51
很厉害啊,想研究一下这些菜单是怎么制作的

菜单是自己用取模软件自己慢慢画的,网上没找到满意的,所以就自己做了,花了好几小时了,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:36:54 | 显示全部楼层

正准备学ucos,学的太着急容易走火入魔的
回复 支持 反对

使用道具 举报

发表于 2016-7-28 16:45:28 | 显示全部楼层
这音质好像好不错的感觉啊
回复 支持 反对

使用道具 举报

发表于 2016-7-28 16:46:14 | 显示全部楼层
李小龙 发表于 2016-7-28 16:01
目前不支持,可以自己发挥

好吧,我以为同时提供了显示歌词的源码呢,不是还是谢谢啊,可以拿来学习下
回复 支持 反对

使用道具 举报

发表于 2016-7-28 16:47:11 | 显示全部楼层
fire 发表于 2016-7-28 16:00
你肯定不知道,我敢保证90%的人都不知道

楼主不是搞出来了嘛?就是包装再搞漂亮些就成了个MP3了
回复 支持 反对

使用道具 举报

发表于 2016-7-28 16:47:43 | 显示全部楼层
李小龙 发表于 2016-7-28 15:59
可以更强大的,只要芯片flash够大,可以加入很多小游戏,各种功能,准备再添加个界面,用来做智能家居, ...

可以做成控制自己家里的各种电器吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:47:51 | 显示全部楼层
fire 发表于 2016-7-28 16:04
如果我送你一块 F429的核心板,2M 的 FLASH ,你能玩出什么花样

火哥,ucos还没学呢,感觉要充分发挥f429的资源,肯定要上ucos+gui,感觉自己再怎么玩,也不会比你的综合实验厉害吧,,不过我会尽力多学点知识,要让自己变得更强大,还要时刻保持创新的想法,才能做出精彩的作品。谢谢火哥支持。
回复 支持 反对

使用道具 举报

发表于 2016-7-28 16:48:13 | 显示全部楼层

哈哈,那用ucos再搞一个,也要记得开源啊
回复 支持 反对

使用道具 举报

发表于 2016-7-28 16:48:59 | 显示全部楼层
李小龙 发表于 2016-7-28 15:55
目前不能显示歌词,因为没加系统,用状态机思想实现的。显示歌词的话,就要用到ucos了。用状态机实现的话 ...

是主芯片的速率不够还是屏幕刷屏速度限制?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:53:49 | 显示全部楼层
红思雨 发表于 2016-7-28 16:47
可以做成控制自己家里的各种电器吗?

可以呀,硬件上加入无线模块(如:nrf24l01),软件上也不难。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 17:08:10 | 显示全部楼层
平凡之路 发表于 2016-7-28 16:48
是主芯片的速率不够还是屏幕刷屏速度限制?

是状态机一般状态切换一次,就进入另一种状态,因为我的是靠按键来切换的,不适合需要不停切换状态的应用。像一边显示歌词,一边听歌,肯定需要系统智能快速切换不同的任务。状态机也有好处,就是不用一遇到多种任务的程序,就上ucos。根据自己需求合理利用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 17:11:34 | 显示全部楼层
容洋洋 发表于 2016-7-28 16:45
这音质好像好不错的感觉啊

归功于解码芯片,效果的确不错,反正我听着跟手机听的没什么区别
回复 支持 反对

使用道具 举报

发表于 2016-8-8 18:37:00 | 显示全部楼层
李小龙 发表于 2016-7-28 17:11
归功于解码芯片,效果的确不错,反正我听着跟手机听的没什么区别

还有一个原因就是这个是自己做的,自己做的东西感觉都不差
回复 支持 反对

使用道具 举报

发表于 2016-8-14 14:28:40 | 显示全部楼层
楼主在原子哥的程序修改的啊  不错  学习了 有没有参考资料
回复 支持 反对

使用道具 举报

发表于 2016-8-14 16:14:37 | 显示全部楼层
汪曼丽 发表于 2016-7-28 14:00
自从接触了stm32,我就大概知道市面上那些普通的mp3是怎么做出来的了

拆开看看,有个纽曼的mp3,一直吃灰,不过舍不得拆开来看!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-15 08:52:16 | 显示全部楼层
淼飞飞 发表于 2016-8-14 14:28
楼主在原子哥的程序修改的啊  不错  学习了 有没有参考资料

没有参考资料,边想边写的,谢谢支持。
回复 支持 反对

使用道具 举报

发表于 2016-8-30 21:51:26 | 显示全部楼层
fire 发表于 2016-7-28 11:55
我被楼主的资料下载下来后,整理如下:
图片

火哥,我最近也在做这个,现在是直接从SD卡里提取音乐,spi给VS1053直接播放指定歌曲,都是用MINI V2配套的例程做的,这部分功能都实现了。
有个小问题这几天一直没解决,我想用SPI +DMA 给VS1053传文件,单独做个程序SPI+DMA 自发自收没问题。
然后就用开发板配套的VS1053的程序做模板加入DMA,但是DMA发出的数据VS1053貌似没有接收到,实验现象就是VS1053一直要数据(VS_DREQ_IN一直等于1),DMA就一直发,大约两秒钟一首歌就放完了,但什么声音都没有。
火哥有时间把您VS1053的例程加入个DMA试试呗。我现在不知道是DMA给出的数据类型不对,还是速度不对,还是因为程序哪些地方冲突了。

我的SPI2 DMA初始化

#define SPI2_DR_Base                        0x4000380C
#define VS1053_SPI2_DMA_SendBuff_size        32

uint8_t VS1053_SPI2_DMA_SendBuff[32]={0};
void SPI2_DMA_Config(void)
{         
        DMA_InitTypeDef DMA_InitStructure;
//        DMA_Cmd (DMA1_Channel5,DISABLE);
        DMA_DeInit(DMA1_Channel5);
        //RCC_PCLK2Config(RCC_HCLK_Div2);
        /*开启DMA时钟*/
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);   
        //NVIC_Config();                   //配置dma中断
        
        /*设置DMA源*/
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI2_DR_Base;      

        /*内存地址*/
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)VS1053_SPI2_DMA_SendBuff;

        /*·方向 内存到外设*/        
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;   

        /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/   
        DMA_InitStructure.DMA_BufferSize = VS1053_SPI2_DMA_SendBuff_size;

        /*外设地址不增*/        
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

        /*内存地址自增*/
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   

        /*外设数据单位 */   
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

        /*内存数据单位 */
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte ;     

        /*不循环*/
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
        //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;     

        /*优先级中*/   
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  

        /*禁止内存到内存   */
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

        /*配置DMA1的5通道*/           
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
        
        //DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);  //ÅäÖÃDMA·¢ËÍÍê³Éºó²úÉúÖжÏ
        /*ʹÄÜDMA*/
//        DMA_Cmd (DMA1_Channel5,DISABLE);
//        
        //SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
            
}

发送一次音频的函数

u8 VS_Send_MusicData(u8* buf)
{
    u8 n;
    if(VS_DREQ_IN!=0)  //
    {                    
        VS_XDCS_CLR;
        for(n=0;n<32;n++)
        {
            //VS_SPI_ReadWriteByte(buf[n]);  //例程代码
            VS1053_SPI2_DMA_SendBuff[n]=buf[n];//我加的,把数据存入缓存
        }
        
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);//我加的
        DMA_Cmd(DMA1_Channel5,ENABLE);//我加的 使能通道
        while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));//我加的
        
        VS_XDCS_SET;                        
    }else return 1;
    return 0;//发送成功
}
基本就这点儿改动。

火哥帮帮忙 这几天茶不思饭不想的,就是出不来。

回复 支持 反对

使用道具 举报

发表于 2016-8-30 22:34:58 | 显示全部楼层
fire 发表于 2016-7-28 11:55
我被楼主的资料下载下来后,整理如下:
图片

火哥,我上传了我的SPI+DMA的测试程序,spi+DMA自发自收,是用火哥的例程改的,有用的信息就是两个DMA初始化和一个主函数,其他没用的也没全删。
杜板线短接B14 B15 按按钮PC13发送数据,串口显示接收到的数据。

问题说明:
下面函数主循环里,使用方案1,其实就是调用下面的函数SPI2_ReadWriteByte(),但是就会卡在
/* Loop while DR register in not emplty */
    while(SPI_I2S_GetFlagStatus(VS_SPI,SPI_I2S_FLAG_TXE) == RESET);
这句话里,如果直接使用方案2,普通spi传输就没问题,
方案3是spi+DMA 发送,三种方案都是用DMA接收。

火哥能否解答一下为啥方案1会卡死。感觉和SPI2->TXE寄存器有关。


    while(1)
    {
        if( Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON  )
        {
            
            printf("\r\n PC13按下");
            SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
            //DMA_SetCurrDataCounter(DMA1_Channel4,VS1053_SPI2_DMA_SendBuff_size);//DMA&#205;¨&#181;&#192;&#181;&#196;DMA&#187;&#186;&#180;&#230;&#181;&#196;&#180;ó&#208;&#161;
            DMA_Cmd(DMA1_Channel4,ENABLE);
            printf("\r\n DMA1通道4已使能");
        
            for(SPInum=0;SPInum<32;SPInum++)
            {
                /*方案1*/
                //VS_SPI_ReadWriteByte(VS1053_SPI2_DMA_SendBuff[SPInum]);   
                /*方案2*/
                //SPI_I2S_SendData(SPI2, VS1053_SPI2_DMA_SendBuff[SPInum]);               
            }
            /*·方案3start*/
            SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
            DMA_Cmd(DMA1_Channel5,ENABLE);
            while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));
            printf("\r\n SPI发送完毕");
            /*·方案3end*/
            
            while(!DMA_GetFlagStatus(DMA1_FLAG_TC4));
            printf("\r\n SPI接收完毕");
            
            DMA_Cmd(DMA1_Channel4,DISABLE);
            printf("\r\n DMA1通道4已关闭");
            
            
            printf("\r\n SPI数据为\r\n");
            for(SPInum=0;SPInum<32;SPInum++)
            {
                printf("VS1053_SPI2_DMA_ReceiveBuff[%d]=%X\r\n",SPInum,VS1053_SPI2_DMA_ReceiveBuff[SPInum]);
            }
        }  
    }

unsigned char SPI2_ReadWriteByte(unsigned char writedat)
{
    /* Loop while DR register in not emplty */
    while(SPI_I2S_GetFlagStatus(VS_SPI,SPI_I2S_FLAG_TXE) == RESET);
   
    /* Send byte through the SPI1 peripheral */
    SPI_I2S_SendData(VS_SPI, writedat);
   
    /* Wait to receive a byte */
    while(SPI_I2S_GetFlagStatus(VS_SPI, SPI_I2S_FLAG_RXNE) == RESET);
   
    /* Return the byte read from the SPI bus */
    return SPI_I2S_ReceiveData(VS_SPI);
}
   


SPI验证程序.rar

3.23 MB, 下载次数: 35

mini v2 开发板

回复 支持 反对

使用道具 举报

发表于 2016-8-30 22:37:08 | 显示全部楼层
rhubarb 发表于 2016-8-30 22:34
火哥,我上传了我的SPI+DMA的测试程序,spi+DMA自发自收,是用火哥的例程改的,有用的信息就是两个DMA初 ...

我觉得我把DMA加入VS1053不好用,跟这个寄存器也有部分关系。
回复 支持 反对

使用道具 举报

发表于 2017-12-13 10:49:17 | 显示全部楼层
歌词能全显吗,如何滚动显示歌词?
谢谢
回复 支持 反对

使用道具 举报

发表于 2018-9-13 16:35:58 | 显示全部楼层
你好,有硬件电路图吗?
回复 支持 反对

使用道具 举报

发表于 2018-9-13 17:04:59 | 显示全部楼层
硬件原理图有没
回复 支持 反对

使用道具 举报

发表于 2020-7-17 23:41:43 | 显示全部楼层
感谢大佬分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-1 07:10 , Processed in 0.091247 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表