SD卡固件更新程序

2019-07-21 03:44发布

本帖最后由 xcc521 于 2018-8-3 13:45 编辑

准备搞一个SD可更新固件的程序
首先,直接上FATFS实验,最快速度实现文件的操作
捕获1.PNG

然后学习一下基本的文件操作,我看过基本上都是通过外挂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;
}


看一下实现效果
捕获2.PNG
//////////////////////////////////////////////////////
捕获3.PNG



还在写,不急...
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
xcc521
1楼-- · 2019-07-21 09:06
SD卡更新固件.zip (1.99 MB, 下载次数: 51) 2018-8-6 14:50 上传 点击文件名下载附件
好像还有点问题,再看看吧
xcc521
2楼-- · 2019-07-21 13:29
本帖最后由 xcc521 于 2018-8-19 19:37 编辑

刚刚更新了一下,没问题了
捕获5.PNG

捕获6.PNG

捕获7.PNG

RTC实验_FLASH_APP.zip (248.8 KB, 下载次数: 47) 2018-8-19 19:36 上传 点击文件名下载附件

FATFS_SD固件实验.zip (1.99 MB, 下载次数: 67) 2018-8-19 19:37 上传 点击文件名下载附件

欢迎指正


backup2k
3楼-- · 2019-07-21 19:19
干货,牛!
xcc521
4楼-- · 2019-07-21 20:48
 精彩回答 2  元偷偷看……
xcc521
5楼-- · 2019-07-22 01:58
本帖最后由 xcc521 于 2018-8-20 22:31 编辑

更新一个小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函数替换即可 捕获8.PNG

一周热门 更多>