最近在做一个关于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)