本帖最后由 xcc521 于 2018-8-3 13:45 编辑
准备搞一个SD可更新固件的程序
首先,直接上FATFS实验,最快速度实现文件的操作
然后学习一下基本的文件操作,我看过基本上都是通过外挂SD的固定位置(根目录或者固定文件夹以及固定文件名)进行打开并更新,这里使用递归实现文件夹扫描自动获取bin文件,所以就是如果卡里面包含多个bin文件时只更新第一个发现的文件
/**
* @brief scan_files 递归扫描FatFs内的文件
* @param path:初始扫描路径
* @retval result:文件系统的返回值
*/
FRESULT scan_files (char* path)
{
FRESULT res; //部分在递归过程被修改的变量,不用全局变量
FILINFO fno;
DIR dir;
int i;
char *fn; // 文件名
//打开目录
res = f_opendir(&dir, path);
if (res == FR_OK)
{
i = strlen(path);
for (;;)
{
//读取目录下的内容,再读会自动读下一个文件
res = f_readdir(&dir, &fno);
//为空时表示所有项目读取完毕,跳出
if (res != FR_OK || fno.fname[0] == 0) break;
fn = fno.fname;
//点表示当前目录,跳过
if (*fn == '.') continue;
//目录,递归读取
if (fno.fattrib & AM_DIR)
{
//合成完整目录名
sprintf(&path
, "/%s", fn);
//递归遍历
res = scan_files(path);
path = 0;
//打开失败,跳出循环
if (res != FR_OK)
break;
}
else
{
printf("
%s/%s", path, fn); //输出文件名
if(strstr(fn,".bin")) //找到更新固件的文件
{
update_en = 1;
printf("
找到可用固件
");
break;
}
}//else
} //for
}
return res;
}
看一下实现效果
//////////////////////////////////////////////////////
还在写,不急...
更新一个小bug,忘记没有SD卡的情况下执行原有FLASH程序了,只考虑有SD卡的情况下有没有bin文件而更不更新了
在这里修正一下
void run_app(void)
{
printf("run FLASH code ");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
else
{
printf("FLASH code error ");
}
}
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,115200); //串口初始化为115200
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
my_mem_init(SRAMIN); //初始化内部内存池
exfuns_init(); //为fatfs相关变量申请内存
if(SD_Init())//检测不到SD卡
{
printf("not find SD ");
run_app();
}
else
{
f_res = f_mount(fs[0],"0:",1); //挂载SD卡
if(f_res == FR_OK)
{
strcpy(fpath,"0:");
scan_files(fpath);
if(update_en != 17)
{
printf("not find bin ");
run_app();
}
else
{
printf("find bin:%s ",bin_path);
exe_play((const char *)bin_path);
}
}
else
{
printf("SD error ");
}
}
while(1)
{
delay_ms(1500);
LED0=!LED0;
printf("LED...");
}
}
将原有main函数替换即可
一周热门 更多>