STM32
直播中

李蕊

8年用户 222经验值
私信 关注
[问答]

如何才能在FAT中查看SD卡根目录?

#include <STM32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"  
#include "lcd.h"
#include "flash.h"
#include "mmc_sd.h"
#include "fat.h"
//Mini STM32开发板范例代码24
//汉字显示 实验
//发烧友@ALIENTEK
//技术论坛:www.openedv.com
int main(void)
{
    u16 cot;
FileInfoStruct *file;
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化      
LCD_Init(); //初始化液晶   
LED_Init();         //LED初始化
SPI_Flash_Init(); //SPI FLASH初始化  
if(SD_Init())  LCD_ShowString(60,20,"SDT  ERROR");
if(FAT_Init()) LCD_ShowString(60,40,"FAT  ERROR");
cot=1;  //查找SD卡根目录 的第cot个txt文件,并通过串口打印出来
Get_File_Info(FirstDirClust,file,T_TXT,&cot);
printf("文本名:%sn",file->F_ShortName);
}
  下载到板子后通过串口知道 这个程序会死在Get_File_Info(FirstDirClust,file,T_TXT,&cot)这个函数中 所包含的CopyDirentruyItem(FileInfoStruct *Desti,direntry *Source)函数中,
void CopyDirentruyItem(FileInfoStruct *Desti,direntry *Source)
{
u8 i;
u8 t;
printf("进入CopyDirentruyItem");
for(i=0;i<8;i++) Desti->F_ShortName=Source->deName;//复制短文件名
printf("过了一个");
            ..........
}
而我看原子的综合测试例程 电子书部分 的代码却能成功进入此函数......菜鸟学FAT有一段时间了...连个查查看SD卡根目录都不行....求指点

回帖(6)

侯倩

2019-8-19 07:54:54
就是查不出是什么问题...编译不报错,没警告.........下到板子上就是死在CopyDirentruyItem(FileInfoStruct *Desti,direntry *Source)函数中
举报

陈霞玻

2019-8-19 08:09:36
FileInfoStruct *file; 
没分配内存.
导致内存溢出引起HARD FAULT.
改为:
FileInfoStruct file; 
调用的时候,用&file.
举报

张洁

2019-8-19 08:21:21
原子哥好样的!!!知道了,果然是那个问题........原子哥想你学习了!!要回去好好学C语言了.....
举报

张俊

2019-8-19 08:40:52
原子哥,我回去看了看你的综合测试程序,Read_Book程序中你也是FileInfoStruct *FileInfo;这样定义的!!!!再者File_Browse程序中你也是这样定义的!!!你的却也没问题,也不会内存溢出.......也都用了Get_File_Info(......)函数。
void Read_Book(FileInfoStruct *FileName); 
//文本浏览器(.txt/.c/.h/.lrc)  
//支持FAT32/16文件系统的浏览.  
void Ebook_Play(void)

FileInfoStruct *FileInfo;  
u16 index=0;  //当前选择的文件编号   
//从根目录开始浏览
if(FAT32_Enable)Cur_Dir_Cluster=FirstDirClust;//根目录簇号
 else Cur_Dir_Cluster=0;   
Fat_Dir_Cluster=Cur_Dir_Cluster;//父目录就是当前目录
while(1)
{  
POINT_COLOR=RED;   
Load_Gui_Bro("选择");//显示GUI界面
Show_Str(88,2,"电子图书",16,0x01);//叠加模式,非自动换行
index=File_Browse(T_LRC|T_TXT|T_C|T_H);//浏览文件夹    
if(!index)return;//结束浏览,退出此功能!!!!!
    
Pen_Point.Key_Sta=Key_Up;         //释放显示期间的触发    
FileInfo=&F_Info[0];//开辟暂存空间. 
Get_File_Info(Cur_Dir_Cluster,FileInfo,T_LRC|T_TXT|T_C|T_H,&index);//得到这张图片的信息  
Read_Book(FileInfo);//读取TXT文件     
}
}
u16 File_Browse(u32 file_type)

FileInfoStruct *FileInfo;
u16 folder_cnt;//文件夹的个数
u16 des_cnt;   //目标文件的个数    
u8 fcnt;   //显示的文件数目
u16 temp;        
u16 total_file;//总文件数目
u16 pos_cnt;//当前文件号 1~folder_cnt+des_cnt
u8 key;    
     
Reset:    
POINT_COLOR=BLUE;        //蓝色笔头使用
folder_cnt=0;des_cnt=0;fcnt=0;key=0;pos_cnt=0; 
Get_File_Info(Cur_Dir_Cluster,FileInfo,T_FILE,&folder_cnt);//得到当前目录下文件夹的个数    
Get_File_Info(Cur_Dir_Cluster,FileInfo,file_type,&des_cnt);//得到当前目录下目标文件的个数 
   
total_file=des_cnt+folder_cnt;//总的文件数目=文件夹数目+目标文件数目
while(1)
{
if(pos_cnt {   
               ..............
              ..............>
举报

更多回帖

发帖
×
20
完善资料,
赚取积分