OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7395|回复: 9

求助原子哥和各位大佬,音乐播放器实验

[复制链接]

6

主题

23

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-20
在线时间
19 小时
发表于 2022-5-17 19:57:06 | 显示全部楼层 |阅读模式
15金钱
  我买了最小系统板做音乐播放器的实验,按照正点战舰版原理图接了SDIO模块和VS1053模块。这程序在开发板上直接可以运行了。在自己接的最小系统跑不了,烧录等候led0没能正常闪烁,没啥反应一样(闪烁应该是显示在读取SD卡播放音乐,开发板上是可以的)。我通过在主函数里不断注释,大概找到了问题的地方。           while(font_init())                                 //检查字库
        {            
                LCD_ShowString(30,50,200,16,16,"Font Error!");
                delay_ms(200);                                  
                LCD_Fill(30,50,240,66,WHITE);//清除显示             
        }

注释掉该循环程序,开发板led0没在闪烁,倒是led1在闪烁,然后有滴~滴~滴声音(应该是后文的VS_Sine_Test();的作用)
最小系统板如上。所以我觉得问题在这个函数上

在fontunp.c里
  u8 font_init(void)
  {               
        u8 t=0;
        W25QXX_Init();  
        while(t<10)//连续读取10次,都是错误,说明确实是有问题,得更新字库了
        {
                t++;
                W25QXX_Read((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));//读出ftinfo结构体数据
                if(ftinfo.fontok==0XAA)break;
                delay_ms(20);
        }
        if(ftinfo.fontok!=0XAA)return 1;
        return 0;                    
}

  我认为应该是font_init 检查字库的时候出了错,返回值为1,导致陷入while的死循环里(因为我的最小系统不知道为啥不能驱动正点LCD,不能直观看出LED显示的报错。下次再这个问题解决),在循环里打印发送

作为提示,确实是掉进死循环里了。
   开发板挂载FLASH的是WQ25128,我买的最小在系统板挂载的是WQ2516。理论上字库要占据15.1M的内存而已。16M是够的,为啥我检查字库一直报错呢???
是因为字库超过16M了吗?还有字库是这个程序烧进去的吗还是出厂已经被烧进WQ25了,如果不是我该怎么做?字库检查跟后面播放音乐有什么必然性?注释掉就不能播放音乐还滴滴滴响,能否跳过检查字库直接放?


我的项目时间紧急,差不多是空降过来的,望原子哥和各位大佬解惑

最佳答案

查看完整内容[请看2#楼]

根据正点原子淘宝技术人员提示,检查字库方法解决了。自己接的最小系统板外挂的WQ2516里没有字库,我们要做的是把字库加载在WQ2516里,先在资料里把font复制得到SD卡里,调用一次字库更新字库的函数updata_font即可(烧录执行一次后注释掉也行)。比如在founupd.c里一个检查字库的10次 循环里调用,*src=0 代表SD卡,随便u8 i=0;啥的,&0放进去就行....前面,x,y,size参数无所谓,随便写,应该是在LCD位置显示而已.... SD卡检查字库 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

23

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-20
在线时间
19 小时
 楼主| 发表于 2022-5-21 19:26:21 | 显示全部楼层
正点原子 发表于 2022-5-21 01:13
我们技术支持没帮你解决么?

解决了字库问题。但不能解决实验43语音播放器的实验的问题:。用的是库函数,我用硬件仿真一直设置断点逐行检测,发现它不能进入主播放循环程序中
panmes是个音乐文件名,加入窗口可以看得到它的值。说明程序跑下来一直都是能读sd卡的,vs1053检测返回值是0x83FF。说明模块都没问题。
仿真if前面加断点查看res=0x06 不为0。然后进不去就回到主函数的循环,一直重复。。。
就算我强行令res=0 , 或者if(res!=0) 进去循环也是没有声音。

                res=f_open(fmp3,(const TCHAR*)pname,FA_READ);//打开文件         
                if(res==0)//打开成功.
                {
                        VS_SPI_SpeedHigh();        //高速                                                  
                        while(rval==0)
                        {
                                res=f_read(fmp3,databuf,4096,(UINT*)&br);//读出4096个字节  
                                i=0;
                                do//主播放循环
                            {         
                                        if(VS_Send_MusicData(databuf+i)==0)//给VS10XX发送音频数据
                                        {
                                                i+=32;
                                        }else   
                                        {
                                                key=KEY_Scan(0);
                                                switch(key)
                                                {
                                                        case KEY0_PRES:
                                                                rval=1;                //下一曲
                                                                break;
                                                        case KEY2_PRES:
                                                                rval=2;                //上一曲
                                                                break;
                                                        case WKUP_PRES:        //音量增加
                                                                if(vsset.mvol<250)
                                                                {
                                                                        vsset.mvol+=5;
                                                                         VS_Set_Vol(vsset.mvol);       
                                                                }else vsset.mvol=250;
                                                                mp3_vol_show((vsset.mvol-100)/5);        //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30   
                                                                break;
                                                        case KEY1_PRES:        //音量减
                                                                if(vsset.mvol>100)
                                                                {
                                                                        vsset.mvol-=5;
                                                                         VS_Set_Vol(vsset.mvol);       
                                                                }else vsset.mvol=100;
                                                                mp3_vol_show((vsset.mvol-100)/5);        //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30   
                                                                break;
                                                }
                                                mp3_msg_show(fmp3->fsize);//显示信息            
                                        }                        
                                }while(i<4096);//循环发送4096个字节
                                if(br!=4096||res!=0)
                                {
                                        rval=0;
                                        break;//读完了.                  
                                }                                                          
                        }
                        f_close(fmp3);
                }else rval=0XFF;//出现错误                     
        }                                                              
回复

使用道具 举报

6

主题

23

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-20
在线时间
19 小时
 楼主| 发表于 2022-5-22 20:23:31 | 显示全部楼层
补充上述原因:res不为0的原因是f_open没有开启读长文件名的功能。把音乐名改成一个英文字符再开启就可以验证了是不是这个原因。
回复

使用道具 举报

6

主题

23

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-20
在线时间
19 小时
 楼主| 发表于 2022-5-17 19:57:07 | 显示全部楼层
根据正点原子淘宝技术人员提示,检查字库方法解决了。自己接的最小系统板外挂的WQ2516里没有字库,我们要做的是把字库加载在WQ2516里,先在资料里把font复制得到SD卡里,调用一次字库更新字库的函数updata_font即可(烧录执行一次后注释掉也行)。比如在founupd.c里一个检查字库的10次 循环里调用,*src=0 代表SD卡,随便u8 i=0;啥的,&0放进去就行....前面,x,y,size参数无所谓,随便写,应该是在LCD位置显示而已....
SD卡检查字库后是能读了,但是我的实验还是算失败了,这是咋回事啊。音乐放不出来,这一直都是滴~滴~滴的声音        VS_Sine_Test();
  没办法进去mp3_play();里(或者进去提前退出了),进去后应该LED00闪烁的,但我一直在主函数的while里进行LED1的翻转....这就很折磨
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2022-5-18 09:44:34 | 显示全部楼层
帮顶                    
回复

使用道具 举报

6

主题

23

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-20
在线时间
19 小时
 楼主| 发表于 2022-5-18 19:59:33 | 显示全部楼层
自顶加下热度
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-5-18 21:54:02 | 显示全部楼层
联系下我们淘宝技术支持
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-5-21 01:13:40 | 显示全部楼层
老陈在单 发表于 2022-5-20 01:12
根据正点原子淘宝技术人员提示,检查字库方法解决了。自己接的最小系统板外挂的WQ2516里没有字库,我们要做 ...

我们技术支持没帮你解决么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

23

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-20
在线时间
19 小时
 楼主| 发表于 2022-5-21 20:10:07 | 显示全部楼层
老陈在单 发表于 2022-5-21 19:26
解决了字库问题。但不能解决实验43语音播放器的实验的问题:。用的是库函数,我用硬件仿真一直设置断 ...

这段程序仿真如下:https://www.bilibili.com/video/bv1eR4y1w7au
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2023-4-15
在线时间
1 小时
发表于 2023-4-15 23:56:41 | 显示全部楼层
老陈在单 发表于 2022-5-17 19:57
根据正点原子淘宝技术人员提示,检查字库方法解决了。自己接的最小系统板外挂的WQ2516里没有字库,我们要做 ...

这个问题解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 10:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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