OpenEdv-开源电子网

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

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

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-21 21:20:11 | 显示全部楼层 |阅读模式
这几天有客户反映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\r\n\r\n",wcnt);        //打印写入成功提示,并打印写入的字节数                       
                }else printf("fwrite error:%d\r\n",res);        //打印错误代码
        }else printf("fopen error:%d\r\n",res);                        //打印错误代码
        f_close(ftext);                                                                        //结束写入
       
        while(1)
        {
                printf("please use usmart to read the file we just write\r\n");
                delay_ms(5000);
        }
}[/mw_shl_code]

工程见附件。



USMART测试方法:

测试.png

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

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

实验43 汉字显示实验_在NAND创建test.txt文件.rar (3.08 MB, 下载次数: 650)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
发表于 2018-3-22 09:38:14 | 显示全部楼层
感谢原子哥,今天试了下这些,都和原子哥的一模一样,虽然之前没有用到文件系统实现了相应的目的,但是为了标准一些,我在试试用文件系统存储图片啥的,成功了我也会分享到论坛
qq1950361006,互帮互助,共同进步。
回复 支持 反对

使用道具 举报

17

主题

466

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2164
金钱
2164
注册时间
2013-1-11
在线时间
510 小时
发表于 2018-10-30 09:29:46 | 显示全部楼层
谢谢原子哥,NANDFLASH确实不容易搞
知识是你最好的财富
回复 支持 反对

使用道具 举报

16

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2019-5-29
在线时间
79 小时
发表于 2019-8-21 08:58:03 | 显示全部楼层
原子哥,请问如何移植到H743上面用?我生成hex文件显示出错
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-7-15
在线时间
7 小时
发表于 2019-11-11 16:45:24 | 显示全部楼层
请问一下大佬怎么把字符串改为输入的数据
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 19:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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