OpenEdv-开源电子网

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

求助!!fatfs 播放MP3问题

[复制链接]

23

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2012-3-15
在线时间
13 小时
发表于 2012-3-28 10:53:48 | 显示全部楼层 |阅读模式

求助原子哥,下面的程序我直接赋值在主函数中直接执行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("\r\n挂载文件系统失败,错误代码: %u", res);
   return res;
  }
  res = f_opendir(&dirs, "/"); //打开根目录
  if (res == FR_OK)
  {
   for(j = 0; j < song_num; j++)
   {
    //i = strlen(path);
    printf("\r\n-----------播放列表-----------");
    while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])
    {
     if (finfo.fattrib & AM_DIR)//如果是文件夹
     {
      continue;
     }
     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("\r\n/%12s%7ld KB ", &finfo.fname[0], (finfo.fsize + 512) / 1024);
       if(files_num > SongPlayedNum)
       {
        song_name = finfo.fname;
        break;
       }
      }
      else
      {
       //显示文件名,显示文件实际大小 ,文件实际大小采用四舍五入法
       printf("\r\n/%12s%7ld KB ", &finfo.fname[0], (finfo.fsize + 512) / 1024);
      }
     }
    }
   }
   if( files_num == 0 )//无文件
   {
    printf("\r\n无文件,请返回先创建文件!");
    return res; 
   }
  }
  else
  {
   printf("\r\n打开根目录失败!");
   printf("\r\n错误代码: %u", res);
  }           
  res = f_open(&file, (const char *)song_name, FA_READ); 
  printf("\r\n正在打开音乐:%s\r\n", 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("\r\n文件读取结束,关闭文件!");
     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);
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-28 11:14:41 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2012-3-15
在线时间
13 小时
 楼主| 发表于 2012-3-28 11:20:39 | 显示全部楼层
那该怎么办呀,都没听过堆栈溢出,杯具了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-28 11:29:25 | 显示全部楼层
把你play_song里面几个有大数组的东东放到外面去了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2012-3-15
在线时间
13 小时
 楼主| 发表于 2012-3-28 11:45:33 | 显示全部楼层
原子你太厉害了,根据你的思路我把STM32F10x.s文件里的Stack_Size      EQU     0x00000200改成Stack_Size      EQU     0x00000800 程序终于正常运行了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 07:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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