【解决客户问题】使用STM32F767,通过FATFS往nand flash写文本文件测试

2019-07-20 05:28发布

这几天有客户反映767往nand里面写入文本文件出错,搞不出来。
故写此代码。以供大家测试。
注意:如果测试有问题,请让程序先自己运行,然后通过usmart发送:NAND_EraseChip()   擦除整片flash,然后按复位键,然后等待代码自己重新格式化nand,就可以用了。
代码简单(在汉字显示实验的基础上改的),如下:
[mw_shl_code=c,true]//通过编号获取文件名
//仅存放在nand flash
//组合成:形如"2:00001.txt"的文件名
void text_new_pathname(u8 *pname)
{         
        u8 res;                                         
        u16 index=0;
        while(index<0XFFFF)
        {
                sprintf((char*)pname,"2:%05d.txt",index);
                res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//尝试打开这个文件
                if(res==FR_NO_FILE)break;                //该文件名不存在=正是我们需要的.
                index++;
        }
}

const u8 test_text[]="你好,这是一个测试文件,本内容由程序自动写入NAND FLASH,可以在电脑上读取出来测试(下载USB 读卡器实验,即可验证,或者通过USMART验证)";

int main(void)
{   
       
        FIL *ftext;                        //文件结构体
        u8 *fname=0;                //文件名
        u32 wcnt;                        //写计数器       
        u8 res;
        Stm32_Clock_Init(432,25,2,9);//设置时钟,216Mhz
    delay_init(216);                        //延时初始化  
        uart_init(108,115200);                //初始化串口波特率为115200  
        usmart_dev.init(108);                //初始化USMART
        LED_Init();                                          //初始化与LED连接的硬件接口
        MPU_Memory_Protection();        //保护相关存储区域
        SDRAM_Init();                                //初始化SDRAM
        LCD_Init();                                        //初始化LCD
        KEY_Init();                                        //初始化按键
        W25QXX_Init();                                //初始化W25Q256
        my_mem_init(SRAMIN);                //初始化内部内存池
        my_mem_init(SRAMEX);                //初始化外部内存池
        my_mem_init(SRAMTCM);                //初始化TCM内存池
        exfuns_init();                                //为fatfs相关变量申请内存  
        f_mount(fs[0],"0:",1);                 //挂载SD卡
        f_mount(fs[1],"1:",1);                 //挂载FLASH.  
        res=f_mount(fs[2],"2:",1);        //挂载NAND FLASH.       
        if(res==0X0D)                                //NAND FLASH磁盘,FAT文件系统错误,重新格式化NAND FLASH
        {
                LCD_ShowString(30,150,200,16,16,"NAND Disk Formatting...");//格式化NAND
                res=f_mkfs("2:",FM_ANY,0,fatbuf,_MAX_SS);        //格式化NAND FLASH,1:,盘符;FM_ANY,自动选择文件系统类型,0,自动选择簇大小
                if(res==0)
                {
                        f_setlabel((const TCHAR *)"2:NANDDISK");//设置Flash磁盘的名字为:NANDDISK
                        LCD_ShowString(30,150,200,16,16,"NAND Disk Format Finish");                //格式化完成
                }else LCD_ShowString(30,150,200,16,16,"NAND Disk Format Error ");        //格式化失败
                delay_ms(1000);
        }         
       
        font_init();                                 //检查字库 ;
        LCD_Clear(WHITE);
        POINT_COLOR=RED;
        Show_Str(30,20,230,24,"NAND文件创建测试",24,0);
        Show_Str(20,50,220,16,"每次按复位,自动创建一个文件",16,0);
        Show_Str(20,70,220,16,"通过usmart,可以读取这个文件",16,0);                         
        Show_Str(20,90,220,16,"通过usb读卡器例程,也可测试",16,0);

        ftext=(FIL*)mymalloc(SRAMIN,sizeof(FIL));        //申请内存       
        fname=mymalloc(SRAMIN,32);                                        //申请内存
       
        mymemset(ftext,0,sizeof(FIL));                                //内存清零
        text_new_pathname(fname);                                        //获取能新建的文件名,每次名字编号加1.
        //每按一次复位,都会在nandflash里面新建一个型如:xxxxx.txt的文件,x=0~9
        //并且在该文件里面写入一个字符串:test_text,长度为126个字节,内容见上面的 定义.
        //然后,可以通过usmart
        res=f_open(ftext,(const TCHAR*)fname, FA_CREATE_ALWAYS|FA_WRITE);         //创建文件
        if(res==FR_OK)
        {
                res=f_write(ftext,(void*)test_text,sizeof(test_text),&wcnt);        //写入数据
                if(res==FR_OK)
                {
                        printf("fwrite ok,write data length is:%d byte ",wcnt);        //打印写入成功提示,并打印写入的字节数                       
                }else printf("fwrite error:%d ",res);        //打印错误代码
        }else printf("fopen error:%d ",res);                        //打印错误代码
        f_close(ftext);                                                                        //结束写入
       
        while(1)
        {
                printf("please use usmart to read the file we just write ");
                delay_ms(5000);
        }
}[/mw_shl_code]

工程见附件。



USMART测试方法:

测试.png

通过USB读卡器实验,测试:
u盘读取.png

电脑打开文件:
读出来.png

实验43 汉字显示实验_在NAND创建test.txt文件.rar (3.08 MB, 下载次数: 454) 2018-3-21 21:19 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。