STM32F407——FATFS 写入速度测试(库函数版)

最近在做一个关于SD卡的小课题,发现在对SD卡读写速度测试时,搜了很多帖子都没有看到关于F407版本的,于是根据原子哥F103版本的代码写了一个F407库函数版本的,希望对各位有所帮助。话不多说,直接上代码…

首先定义两个宏来表示文件大小
文件大小=FATFS_WR_SIZEFATFS_WR_CYCLE=81921024

 void text_new_pathname(u8 *pname)
{	 
	u8 res1;					 
	u16 index=0;
	while(index<0XFFFF)
	{
		sprintf((char*)pname,"0:TEST%05d.txt",index);
		res1=f_open(ftemp,(const TCHAR*)pname,FA_READ);
		if(res1==FR_NO_FILE)break;
		index++;
	}
}
#define FATFS_WR_SIZE    8192  //单次写入块的大小
#define FATFS_WR_CYCLE   1024
extern u32 wrtime; //1s计时单位  (在通用定时器.c文件中有定义)

main函数代码:


  FIL* f_txt;        
  u8 key,res;
  u16 i;
  u8 *p;
  u8 *pname;                                        //带路径的文件名
  u8 *wbuffer;                                //写入缓冲
  u16 wt;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);  
	uart_init(115200);		
	LED_Init();			
	usmart_dev.init(84);	
	TIM3_Int_Init(10000-1,8400-1);//10Khz计数频率,1s中断一次	
 	KEY_Init();					//按键初始化 
	W25QXX_Init();				//初始化W25Q128
	my_mem_init(SRAMIN);		//初始化内部内存池 
	my_mem_init(SRAMCCM);		//初始化CCM内存池 
	SD_Init()exfuns_init();			//为fatfs相关变量申请内存				 
  f_mount(fs[0],"0:",1); 	//挂载SD卡 
 res=f_mount(fs[1],"1:",1); 		//挂载FLASH.	
 
p=mymalloc(SRAMIN,50);                              
pname=mymalloc(SRAMIN,30);     //为带路径的文件名分配内存                      
f_txt=(FIL *)mymalloc(SRAMIN,sizeof(FIL));    //开辟内存区域
wbuffer=mymalloc(SRAMIN,FATFS_WR_SIZE);         //申请写入大小  
        for(i=0;i<FATFS_WR_SIZE;i+=8)
        {
                wbuffer[i]='T';
                wbuffer[i+1]='E';
                wbuffer[i+2]='S';
                wbuffer[i+3]='T';
                wbuffer[i+4]='!';
                wbuffer[i+5]='!';
                wbuffer[i+6]='!';
                wbuffer[i+7]=' ';
        }    
printf("测速开始\r\n");		
sprintf((char*)p,"文件大小:%dKB",FATFS_WR_CYCLE*FATFS_WR_SIZE/1024);
printf("单次写入块大小:%d\r\n",FATFS_WR_SIZE);                       
  while(1)
  {
     key=KEY_Scan(0);
    if(key==KEY0_PRES)
     {         
        text_new_pathname(pname);    //得到文件名  
        TIM3->CNT=0;
        wrtime=0;
       wt=0;
     res=f_open(f_txt,(constTCHAR*)pname,FA_WRITE|FA_CREATE_NEW);//模式0,或者尝试打开  
    if(res==0)//打开成功.
    {
     for(i=0;i<FATFS_WR_CYCLE;i++)
      {
       res=f_write(f_txt,wbuffer,FATFS_WR_SIZE,&bw);
       if(res)break;
       if(wt!=wrtime)
  {
     wt=wrtime;																
     }
           }
         }
else
	{
		printf("打开失败\r\n");
	}
if(res==0)
{
  wt=FATFS_WR_CYCLE*FATFS_WR_SIZE/1024/wrtime;                              
  sprintf((char*)p,"平均速度:%dKB/s",wt);                           											
     }else printf("失败\r\n");
       f_close(f_txt);
    }
  		delay_ms(10);
     }		

通过改变两个宏变量,可以改变写入文件大小,以及单次写入的块大小。在调试的时候,要先设置好定时器中断,本例设置的是TIM定时器1S产生一次中断计数。最终代码在F407上亲测有效。
测试结果如下:
在这里插入图片描述
其实F1和F4的读写代码都一样,小编也就是个搬运工。好了,以上就是最核心的部分,希望能有点用。如有需要源代码的小伙伴可以私信博主。
(参考:正点原子http://www.openedv.com/forum.php?mod=viewthread&tid=94284)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值