OpenEdv-开源电子网

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

在调试文件系统的时候遇到一个很奇怪的问题纠结到深夜

[复制链接]

7

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2013-3-9
在线时间
32 小时
发表于 2013-4-19 02:04:10 | 显示全部楼层 |阅读模式

代码如下:

 while(1) 
 { 
  if(FAT32_Enable)Cur_Dir_Cluster=FirstDirClust;//根目录簇号
   else Cur_Dir_Cluster=0;
  printf("SD_ReadSingleBlock4\r\n"); 
  i=Get_File_Info(Cur_Dir_Cluster,&FileInfo,T_TXT,&mus_total);//获取当前文件夹下面的目标文件个数
  printf("SD_ReadSingleBlock4ok\r\n");
  if(i==0)
  {
   LCD_write_english_string(0,0,"Get_File_error1");
   delay_ms(500);
   break;   //得到文件信息失败。
  }
  else
  { 
   file_index=1;
   printf("SD_ReadSingleBlock5\r\n");
   i=Get_File_Info(Cur_Dir_Cluster,&FileInfo,T_TXT,&file_index); //获取第一个文件信息
   if(i==0)
   {
    printf("\n获取文件失败2\r\n");
    LCD_write_english_string(0,0,"Get_File_error2");
    delay_ms(500);
    break;   //得到文件信息失败。
   }
   else
   {
    printf(FileInfo.F_Name);
    printf("\r\n");
    LCD_write_english_string(0,1,FileInfo.F_Name);
    bfactor=fatClustToSect(FileInfo.F_StartCluster);   //得到开始簇对应的扇区
    bcluster=FileInfo.F_StartCluster;          //得到文件开始簇号 
    count=0;
   }
   printf("SD_ReadSingleBlock6\r\n");
   if(SD_ReadSingleBlock(bfactor,TXT_BUFFER))    //读取一个扇区的数据
   {
    printf("\n读取一个扇区的数据出错3\r\n");
    LCD_write_english_string(0,0,"Get_File_error3");    
   }

在没有红色部分代码的情况下程序正常运行,

在加了红色部分之后程序就卡死在绿色那句那里,

纠结的是为什么在下面执行的语句为什么会影响到上面语句的执行呢,,,,,,,

实在想不出这是为什么,请求支援,,,,,,,,请求支援


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-19 11:12:07 | 显示全部楼层
回复【楼主位】天浪1990:
---------------------------------
跟踪进去,看具体是在哪句话死机.
 怀疑是你的内存访问出问题了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2013-3-9
在线时间
32 小时
 楼主| 发表于 2013-4-19 11:24:56 | 显示全部楼层

回复【2楼】正点原子:
---------------------------------
//读SD卡的一个block
//输入:u32 sector 取地址(sector值,非物理地址) 
//     u8 *buffer 数据存储地址(大小至少512byte)     
//返回值:0: 成功
//       other:失败   
u8 SD_ReadSingleBlock(u32 sector, u8 *buffer)
{
u8 r1;     
    //设置为高速模式
    SPIx_SetSpeed(SPI_SPEED_4);      
    //如果不是SDHC,给定的是sector地址,将其转换成byte地址
    if(SD_Type!=SD_TYPE_V2HC)
    {
        sector = sector<<9;
    } 
r1 = SD_SendCommand(CMD17, sector, 0);//读命令
printf("r1=%d\r\n",r1);       
if(r1 != 0x00)return r1;
printf("死在这\r\n",r1);        
***** r1 = SD_ReceiveData(buffer, 512, RELEASE);
printf("r1=%d\r\n",r1);  
if(r1 != 0)return r1;   //读数据出错!
    else return 0; 
}

用 printf追踪发现死在星号注释的句子那里了!!!            
 ------------------------------------------------------------------------------------------------------------

继续追踪SD_ReceiveData()函数又出现了新的问题

//从SD卡中读回指定长度的数据,放置在给定位置
//输入: u8 *data(存放读回数据的内存>len)
//      u16 len(数据长度)
//      u8 release(传输完成后是否释放总线CS置高 0:不释放 1:释放) 
//返回值:0:NO_ERR
//    other:错误信息               
u8 SD_ReceiveData(u8 *data, u16 len, u8 release)
{
    // 启动一次传输
    SD_CS=0;        
 if(SD_GetResponse(0xFE))//等待SD卡发回数据起始令牌0xFE
 {  
  SD_CS=1;
  return 1;
 }
// printf("len=%d\r\n",len);
    while(len--)//开始接收数据
    {
        *data=SPIx_ReadWriteByte(0xFF);
        data++;
    }
// printf("len=%d\r\n",len);
    //下面是2个伪CRC(dummy CRC)
    SPIx_ReadWriteByte(0xFF);
    SPIx_ReadWriteByte(0xFF);
    if(release==RELEASE)//按需释放总线,将CS置高
    {
        SD_CS=1;//传输结束
        SPIx_ReadWriteByte(0xFF);
    }                     
    return 0;
}   
加了红色那两句之后连初始化也无法通过了
一直在下面的初始化那里面循环而不会卡死

 Stm32_Clock_Init(9);//系统时钟设置
 delay_init(72);  //延时初始化
 uart_init(72,9600); //串口1初始化
 LED_Init();
 LCD_init();    //nokia_lcd初始化
 JTAG_Set(2);
 SD_Init();   //初始化SD卡          
  while(FAT_Init())//FAT 错误
 {
  LCD_write_english_string(0,0,"FAT SYS ERROR"); 
  i= SD_Init();
  if(i)//SD卡初始化
  {       
   LCD_write_english_string(0,1,"SD_CARD ERROR");
  }  
  delay_ms(500);    
  LED0=!LED0;   
 }

    

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-19 16:23:40 | 显示全部楼层
回复【3楼】天浪1990:
---------------------------------
换卡试试.
另外,你这代码是很久前的了,请用我们的最新代码测试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2013-3-9
在线时间
32 小时
 楼主| 发表于 2013-4-19 20:20:35 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,在哪里才能下载到最新的例程呢?我在坛里第一个里下载的和用的对比了一下怎么感觉都一样呢??
能给个下载链接吗???
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-19 22:29:30 | 显示全部楼层
回复【5楼】 天浪1990 :
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2013-3-9
在线时间
32 小时
 楼主| 发表于 2013-4-20 21:42:10 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
谢谢原子哥!!!
回复 支持 反对

使用道具 举报

7

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2013-3-9
在线时间
32 小时
 楼主| 发表于 2013-4-29 03:11:31 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,最近几天我又再去研究那个文件系统了:好像在用了新的FAT库的时候还是遇到了和用旧版本FAT的问题

代码:
printf("SD_ReadSingleBlock6\r\n");
// if(SD_ReadDisk(TXT_BUFFER,bfactor,1)) //读取一个扇区的数据
// {
// printf("\n读取一个扇区的数据出错3\r\n");
// LCD_write_english_string(0,0,"Get_File_error3");
// }
while(1)
{
LED0=!LED0;
delay_ms(500);
如上面所示,加了注释部分(红色)的代码后,程序死了,没加的时候一切正常,好奇怪啊啊 啊!!!!希望能再帮我看看吧,我纠结好久了,现在又纠结到深夜了唉!!!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-29 13:02:14 | 显示全部楼层
回复【8楼】天浪1990:
---------------------------------
红色部分的TXT_BUFFER,你怎么定义的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2013-3-9
在线时间
32 小时
 楼主| 发表于 2013-4-29 17:47:47 | 显示全部楼层

回复【9楼】正点原子:
---------------------------------
问题确实出现在这里了,我把TXT_BUFFER定义在main里面了,现在定义到全局里面去就可以了的,,,,,,
程序可以很好的运行了,,,,,,
但是我很想知道这是为什么呢???函数越界????还是什么什么的???编译的时候也没有什么警告或是错误的信息呢

现在又遇到了新的问题了,,,,
代码如下:
while(1)   //播放音乐的主循环
{
    if(SD_ReadDisk(MUSIC_BUFFER,bfactor,1))break;//读取一个扇区的数据   
SPIx_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M 

count++;//扇区计数器 
i=0;
do      //主播放循环
    {       
if(VS_DQ!=0&&pause==0)  // 非暂停 送数据给VS1003 
{      
     VS_XDCS=0;    
            for(n=0;n<32;n++)
{
SPIx_ReadWriteByte(MUSIC_BUFFER[i++]);  
}
VS_XDCS=1;    
  }
  key=KEY_Scan();
if(key)
{
switch(key)
{
case 1://下一首歌
return 1;
case 2://上一首歌
return 2;
case 3://暂停/播放
pause=!pause;
}
}      
}while(i<511); //循环发送512个字节 
MP3_Msg_Show(FileInfo.F_Size,index,total);     
    bfactor++;  //扇区加   
    if(count>=SectorsPerClust)//一个簇结束,换簇
    {   
        count=0;        
        bcluster=FAT_NextCluster(bcluster);
//printf("NEXT:%d\n",bcluster);
LED1=!LED1;    
//文件结束 
if((FAT32_Enable==0&&bcluster==0xffff)||bcluster==0x0ffffff8||bcluster==0x0fffffff)break;//error
        bfactor=fatClustToSect(bcluster);
    } 
}             
 

我把上面的代码改了,我用FAT里的F_Open和F_Read函数来实现MP3文件数据的读取

代码如下:

 F_Open(&FileInfo);

 while(1)   //播放音乐的主循环
 {
  SPI2_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M
  i=0;
  do      //主播放循环
     {      
   if(VS_DQ!=0)  // 非暂停 送数据给VS1003
   {       
       VS_XDCS=0;   
             for(n=0;n<32;n++)
    {
     SPI2_ReadWriteByte(FILE_BUFFER[i++]);     
    }
    VS_XDCS=1; 
    }
  }while(i<511); //循环发送512个字节
  LED0=!LED0;
  if(F_Read(&FileInfo,FILE_BUFFER)==0)    //读取一个扇区的数据
  {
   printf("\n读取的数据出错或是结束3\r\n");
   LCD_write_english_string(0,0,"File_error3");
   break;    
  }
 } 
 VS_HD_Reset();  //硬复位                  
 VS_Soft_Reset();//软复位
 LED0=1;   //关闭DS1
 return 0;  //返回按键的键值!
}

结果是F_Read函数读取出错了,我拿来读取txt文件的时候都是没问题的呢??又开始纠结了
希望再次得到原子哥的指点!!!!!!!!!!

 

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-29 21:00:35 | 显示全部楼层
在main里面定义数组,那是局部变量,会用到堆栈,当堆栈超出设置大小(在.s文件定义)的时候,就是程序跑飞的时刻。
所以,不要在函数里面定义什么几百个字节的数组。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2013-3-9
在线时间
32 小时
 楼主| 发表于 2013-4-29 21:52:40 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
现在又遇到了新的问题了,,,,
 代码如下:
while(1)   //播放音乐的主循环
{
     if(SD_ReadDisk(MUSIC_BUFFER,bfactor,1))break;//读取一个扇区的数据   
SPIx_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M 
 
count++;//扇区计数器 
i=0;
 do      //主播放循环
    {       
if(VS_DQ!=0&&pause==0)  // 非暂停 送数据给VS1003 
 {      
      VS_XDCS=0;    
             for(n=0;n<32;n++)
 {
 SPIx_ReadWriteByte(MUSIC_BUFFER[i++]);   
}
 VS_XDCS=1;    
   }
   key=KEY_Scan();
 if(key)
 {
 switch(key)
 {
 case 1://下一首歌
return 1;
 case 2://上一首歌
return 2;
 case 3://暂停/播放
pause=!pause;
 }
 }      
 }while(i<511); //循环发送512个字节 
MP3_Msg_Show(FileInfo.F_Size,index,total);     
     bfactor++;  //扇区加   
     if(count>=SectorsPerClust)//一个簇结束,换簇
    {   
         count=0;        
         bcluster=FAT_NextCluster(bcluster); 
//printf("NEXT:%d\n",bcluster);
 LED1=!LED1;    
 //文件结束 
if((FAT32_Enable==0&&bcluster==0xffff)||bcluster==0x0ffffff8||bcluster==0x0fffffff)break;//error 
        bfactor=fatClustToSect(bcluster);
     } 
 }             
  
 

我把上面的代码改了,我用FAT里的F_Open和F_Read函数来实现MP3文件数据的读取
 

代码如下:
 

 F_Open(&FileInfo);
 
 while(1)   //播放音乐的主循环
  {
   SPI2_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M 
  i=0;
   do      //主播放循环
      {       
   if(VS_DQ!=0)  // 非暂停 送数据给VS1003 
   {        
       VS_XDCS=0;    
             for(n=0;n<32;n++)
     {
      SPI2_ReadWriteByte(FILE_BUFFER[i++]);     
     }
     VS_XDCS=1;  
    }
   }while(i<511); //循环发送512个字节
   LED0=!LED0; 
  if(F_Read(&FileInfo,FILE_BUFFER)==0)    //读取一个扇区的数据
   {
    printf("\n读取的数据出错或是结束3\r\n");
    LCD_write_english_string(0,0,"File_error3");
    break;    
   } 
 }  
 VS_HD_Reset();  //硬复位                   
 VS_Soft_Reset();//软复位 
 LED0=1;   //关闭DS1
  return 0;  //返回按键的键值! 
}
 
结果是F_Read函数读取出错了,我拿来读取txt文件的时候都是没问题的呢??又开始纠结了
 希望再次得到原子哥的指点!!!!!!!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 18:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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