当我们遇到存储数据时候就需要对flash或者SD卡两种最通用的存储进行操作,而且需要一种方法把数据进行读取出来,这里我推荐一种方法,也是各位STM32软件工程师使用最多的,那就是
USB+FATFS+SD/FLASH,通过USB读取存储信息,也可把网页之类的配置信息保存,STM32进行读取。
加入freertos很简单,也就是几个文件。
cc936.c:支持中文系统,字库这个文件最好是放在flash中,减小程序文件对flash的消耗,调程序也快啊。
diskio.c:硬件驱动,硬件相关的驱动,只要spiflash.c这个文件写好了,往里填充即可。
ff.c:文件系统的文件,无需修改。
MYFF.c:自定义的读写文件。
FREERTOS系统,本人一般是分为四条任务:
MAINTask,放一些文件读取之类的进程
USBTask, freertos系统里面的USB进程的任务,一般是读取flash文件,SD卡文件,等等
TickTask,定时处理的一些函数。
TESTTask,预留的控制程序任务。
FATFS文件系统是直接放到MAINTask中,开机直接挂载到系统中去。
MountDriver(DRV_SPI_FLASH); 挂载SPIFLASH,SD卡一般不插入,不挂载,放在之后吧。。。。
FRESULT MountDriver(u8 pdrv)
{
u32 free_size;
FATFS *fs = &FAT_Fs[pdrv];
FRESULT rt = f_mount(fs,"0:",1);
if (rt == FR_OK)
{
Printf("\nNumber of driver: %c", 'A'+fs->drv);
Printf("\nFile system: %s", FatType[fs->fs_type]);
Printf("\nAmount of fats: %d", fs->n_fats);
Printf("\nSectors per clust: %d", fs->csize);
rt = f_getfree("0:", &free_size, &fs);
if (rt == FR_OK)
{
free_size *= fs->csize; // get free sectors
free_size *=512u; // get free bytes
Printf("\nFree size: %d", free_size);
}
else
{
Printf("\nGet free clust failed: %d", rt);
}
}
else
{
Printf("\nAdd file driver %d failed: %d",0, rt);
}
return rt;
}
直接挂载SPIFLASH,并且把flash的信息打印到串口上去,这里的Printf全是我自己写的带信号量的打印函数。不会在打印过程中遭受别的进程影响。
以我自己写程序习惯,我会去保存开机信息,包括时间啊,开机啊,之类的。
SaveLog("开机重启",8); 保存开机重启这几个字,还有就是当时的开机时间
void SaveLog(char *date,u16 len)
{
PFILE fp;
UINT length;
char head[10];
char path[22];
sprintf(path, "0:/d.d.d.txt", rtctime.Year, rtctime.Month, rtctime.Date); // 时间 path用来创建TXT文件
fp = FileOpen(path, FA_WRITE);
if(fp == NULL)
{
fp = FileOpen(path, FA_CREATE_NEW|FA_WRITE);
//自己的freertos的创建函数
}
sprintf(head, "d:d:d ", rtctime.Hours, rtctime.Minutes, rtctime.Seconds);
if(fp != NULL)
{
f_lseek(fp,f_size(fp)); //文件系统上一个地址开始
f_write(fp, "\r\n", 2, &length);
f_write(fp, head, 10, &length);
f_write(fp, date, len, &length);
FileClose(fp); //自己的关闭函数,里面要归还申请的内存的。
}
}
把重启信息保存
可以保存重启信息,也可以保存别的任何信息。
|