这几天有客户反映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,&quot;2:%05d.txt&quot;,index);
res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//尝试打开这个文件
if(res==FR_NO_FILE)break; //该文件名不存在=正是我们需要的.
index++;
}
}
const u8 test_text[]=&quot;你好,这是一个测试文件,本内容由程序自动写入NAND FLASH,可以在电脑上读取出来测试(下载USB 读卡器实验,即可验证,或者通过USMART验证)&quot;;
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],&quot;0:&quot;,1); //挂载SD卡
f_mount(fs[1],&quot;1:&quot;,1); //挂载FLASH.
res=f_mount(fs[2],&quot;2:&quot;,1); //挂载NAND FLASH.
if(res==0X0D) //NAND FLASH磁盘,FAT文件系统错误,重新格式化NAND FLASH
{
LCD_ShowString(30,150,200,16,16,&quot;NAND Disk Formatting...&quot;);//格式化NAND
res=f_mkfs(&quot;2:&quot;,FM_ANY,0,fatbuf,_MAX_SS); //格式化NAND FLASH,1:,盘符;FM_ANY,自动选择文件系统类型,0,自动选择簇大小
if(res==0)
{
f_setlabel((const TCHAR *)&quot;2:NANDDISK&quot;);//设置Flash磁盘的名字为:NANDDISK
LCD_ShowString(30,150,200,16,16,&quot;NAND Disk Format Finish&quot;); //格式化完成
}else LCD_ShowString(30,150,200,16,16,&quot;NAND Disk Format Error &quot;); //格式化失败
delay_ms(1000);
}
font_init(); //检查字库 ;
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str(30,20,230,24,&quot;NAND文件创建测试&quot;,24,0);
Show_Str(20,50,220,16,&quot;每次按复位,自动创建一个文件&quot;,16,0);
Show_Str(20,70,220,16,&quot;通过usmart,可以读取这个文件&quot;,16,0);
Show_Str(20,90,220,16,&quot;通过usb读卡器例程,也可测试&quot;,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(&quot;fwrite ok,write data length is:%d byte
&quot;,wcnt); //打印写入成功提示,并打印写入的字节数
}else printf(&quot;fwrite error:%d
&quot;,res); //打印错误代码
}else printf(&quot;fopen error:%d
&quot;,res); //打印错误代码
f_close(ftext); //结束写入
while(1)
{
printf(&quot;please use usmart to read the file we just write
&quot;);
delay_ms(5000);
}
}[/mw_shl_code]
工程见附件。
USMART测试方法: |