OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3709|回复: 5

SD卡固件更新程序

[复制链接]

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
发表于 2018-8-3 13:43:53 | 显示全部楼层 |阅读模式
本帖最后由 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("\r\n%s/%s", path, fn);                //输出文件名
                if(strstr(fn,".bin"))                                //找到更新固件的文件
                {
                        update_en = 1;
                        printf("\r\n找到可用固件\r\n");
                        break;
                }
      }//else
    } //for
  }
  return res;
}


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



还在写,不急...
天然懒,天然呆
能吃会睡,未来可期
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2018-8-6 14:50:38 | 显示全部楼层
SD卡更新固件.zip (1.99 MB, 下载次数: 90)
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2018-8-19 19:32:47 | 显示全部楼层
本帖最后由 xcc521 于 2018-8-19 19:37 编辑

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

捕获6.PNG

捕获7.PNG

RTC实验_FLASH_APP.zip (248.8 KB, 下载次数: 158)
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-8-20 07:43:32 | 显示全部楼层
干货,牛!
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2018-8-20 20:45:10 | 显示全部楼层
分享下日志,哈哈
找到可用固件:0:/test.bin
文件名:0:/test.bin
固件打开成功
写入块:0
写入块:1
写入块:2
写入块:3
写入块:4
写入块:5
写入块:6
写入块:7
写入块:8
写入块:9
写入块:10
写入块:11
写入块:12
写入块:13
写入块:14
写入块:15
写入块:16
写入块:17
写入块:18
写入块:19
写入块:20
写入块:21
写入块:22
写入块:23
写入块:24
写入块:25
写入块:26
写入块:27
写入块:28
写入块:29
写入块:30
写入块:31
写入块:32
写入块:33
写入块:34
写入块:35
写入块:36
写入块:37
写入块:38
写入块:39
写入块:40
写入块:41
写入块:42
写入块:43
写入块:44
写入块:45
写入块:46
写入块:47
写入块:48
写入块:49
写入块:50
写入块:51
写入块:52
写入块:53
写入块:54
写入块:55
写入块:56
写入块:57
写入块:58
写入块:59
写入块:60
写入块:61
写入块:62
写入块:63
写入块:64
写入块:65
写入块:66
写入块:67
写入块:68
最后:0小块
最后:1小块
最后:2小块
最后:3小块
最后:4小块
最后:5小块
最后:6小块
最后:7小块
最后:8小块
最后:9小块
最后:10小块
最后:11小块
最后:12小块
最后:13小块
最后:14小块
最后:15小块
最后:16小块
最后:17小块
最后:18小块
最后:19小块
最后:20小块
最后:21小块
最后:22小块
最后:23小块
最后:24小块
最后:25小块
最后:26小块
最后:27小块
最后:28小块
最后:29小块
最后:30小块
最后:31小块
最后:32小块
最后:33小块
最后:34小块
最后:35小块
最后:36小块
最后:37小块
最后:38小块
最后:39小块
最后:40小块
最后:41小块
最后:42小块
最后:43小块
最后:44小块
最后:45小块
最后:46小块
最后:47小块
最后:48小块
最后:49小块
最后:50小块
最后:51小块
最后:52小块
最后:53小块
最后:54小块
最后:55小块
最后:56小块
最后:57小块
最后:58小块
最后:59小块
最后:60小块
最后:61小块
最后:62小块
最后:63小块
最后:64小块
最后:65小块
最后:66小块
最后:67小块
最后:68小块
最后:69小块
最后:70小块
最后:71小块
最后:72小块
最后:73小块
最后:74小块
最后:75小块
最后:76小块
最后:77小块
最后:78小块
最后:79小块
最后:80小块
最后:81小块
最后:82小块
最后:83小块
最后:84小块
最后:85小块
最后:86小块
最后:87小块
写完
关闭文件开始执行
LCD ID:5510
OK
2015年1月14日 17时43分6秒 星期三
2015年1月14日 17时43分7秒 星期三
2015年1月14日 17时43分8秒 星期三
2015年1月14日 17时43分9秒 星期三
2015年1月14日 17时43分10秒 星期三
2015年1月14日 17时43分11秒 星期三
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2018-8-20 22:29:27 | 显示全部楼层
本帖最后由 xcc521 于 2018-8-20 22:31 编辑

更新一个小bug,忘记没有SD卡的情况下执行原有FLASH程序了,只考虑有SD卡的情况下有没有bin文件而更不更新了
在这里修正一下

void run_app(void)
{
        printf("run FLASH code\r\n");
        if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
        {
                iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
        }
        else
        {
                printf("FLASH code error\r\n");   
        }
}

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\r\n");
                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\r\n");
                                run_app();
                        }
                        else
                        {
                                printf("find bin:%s\r\n",bin_path);
                                
                                exe_play((const char *)bin_path);
                        }
                }
                else
                {
                        printf("SD error\r\n");
                }
        }
        while(1)
        {
                delay_ms(1500);
                LED0=!LED0;
                printf("LED...");
        }
}

将原有main函数替换即可 捕获8.PNG
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 18:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表