求助原子哥,下面的程序我直接赋值在主函数中直接执行play_song(7);就可以正常播放歌曲,
而如果把play_song(7);嵌入void play_mp3(void)函数中,
在主函数中执行play_mp3();不能正常播放歌曲,串口会一直返回数据,不知道是哪里不对。。
u8 play_song(u32 song_num)
{
FATFS fs;
FIL file;
FRESULT res;
DIR dirs;
FILINFO finfo;
u32 i, j, n;
u8 SongPlayedNum = 0;
char *song_name;
u32 re, files_num = 0;
while(1)
{
files_num = 0; re = 0;
res = f_mount(0, &fs);//挂载文件系统到0区
if (res != FR_OK)
{
printf("rn挂载文件系统失败,错误代码: %u", res);
return res;
}
res = f_opendir(&dirs, "/"); //打开根目录
if (res == FR_OK)
{
for(j = 0; j < song_num; j++)
{
//i = strlen(path);
printf("rn-----------播放列表-----------");
while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])
{
if (finfo.fattrib & AM_DIR)//如果是文件夹
{
con
tinue;
}
else
{
if(((finfo.fname[9] == 'W') && (finfo.fname[10] == 'M') && (finfo.fname[11] == 'A'))
|| ((finfo.fname[9] == 'M') && (finfo.fname[10] == 'P') && (finfo.fname[11] == '3'))
|| ((finfo.fname[9] == 'W') && (finfo.fname[10] == 'A') && (finfo.fname[11] == 'V')))
{
files_num++;
//显示文件名,显示文件实际大小,文件实际大小采用四舍五入法
printf("rn/%12s%7ld KB ", &finfo.fname[0], (finfo.fsize + 512) / 1024);
if(files_num > SongPlayedNum)
{
song_name = finfo.fname;
break;
}
}
else
{
//显示文件名,显示文件实际大小 ,文件实际大小采用四舍五入法
printf("rn/%12s%7ld KB ", &finfo.fname[0], (finfo.fsize + 512) / 1024);
}
}
}
}
if( files_num == 0 )//无文件
{
printf("rn无文件,请返回先创建文件!");
return res;
}
}
else
{
printf("rn打开根目录失败!");
printf("rn错误代码: %u", res);
}
res = f_open(&file, (const char *)song_name, FA_READ);
printf("rn正在打开音乐:%srn", song_name);
if(files_num == SongPlayedNum)//播放最后一曲后返回99
return 99;
if (res == FR_OK)
{
while (1)
{
for(i = 0; i < 512; i++)
{
song_test_buffer
= 0x00;
}
res = f_read(&file, song_test_buffer, 512, (UINT*)&re);
SPIx_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为9Mhz
i = 0;
VS1003_XCS = 1;
do //主播放循环
{
if(VS1003_DREQ != 0) //非暂停 送数据给VS1003
{
VS1003_XDCS = 0; //开VS1003片选
for(n = 0; n < 32; n++)//VS1003的FIFO只有32个字节的缓冲
{
SPIx_ReadWriteByte(song_test_buffer[i++]);
}
VS1003_XDCS = 1; //关VS1003片选
}
}while(i < 511);//循环发送512个字节
SPIx_ReadWriteByte(0xff);//高速写命令延时
SPIx_ReadWriteByte(0xff);//高速写命令延时
SPIx_ReadWriteByte(0xff);//高速写命令延时
SPIx_ReadWriteByte(0xff);//高速写命令延时
SPIx_ReadWriteByte(0xff);//高速写命令延时
SPIx_ReadWriteByte(0xff);//高速写命令延时
if (res || re == 0) //出错或者到了文件尾
{
printf("rn文件读取结束,关闭文件!");
f_close(&file); //关闭打开的文件
SongPlayedNum++;
break;
}
}
}
f_mount(0,NULL);
}
}
-------------------------------
void play_mp3(void)
{
play_song(7);
}
-----------------------
int main(void)
{
STM32_init(); //stm32初始化
hardware_init();//外围器件初始化
// play_song(7);
play_mp3();
while(1);
}
0