搜索
bottom↓
回复: 10
打印 上一主题 下一主题

TKM32F499远程更新参考程序

[复制链接]

出0入143汤圆

跳转到指定楼层
1
发表于 2020-12-15 12:21:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tiky 于 2020-12-15 14:05 编辑

TKM32F499从最开始的用串口下载,到后来的用USB下载,后来又增加JLINK,DAP等各类仿真下载。今天,将再新增一种下载方式,从SD/TF 卡中下载程序,可以参考这个程序做ESP8266 WIFI远程升级了,以后再也不限载体了。

由于基础驱动都写得差不多了,今天这个程序相对来说就比较简单,调用一下FATFS文件系统函数,然后用QSPI写FLASH就完事;

样例程序中,点击图中“程序更新”进入升级。

关键代码如下:
  1. //==============  从SD卡中升级程序 ==============//
  2. #define QSPI_FLASH_SAVE_APP_ADD                 0x10000  //程序存在FLASH中的起始总地址
  3. #define QSPI_FLASH_APP_DATA     0x400        //前面1KB用于存储程序头,例如简单校验,程序长度等,1K后就是程序主体了
  4. char program_updata(char *filename)
  5. {
  6.         FATFS fs;            // Work area (file system object) for logical drive
  7.         FIL fsrc;                              // file objects
  8.         FRESULT res;         // FatFs function common result code
  9.         UINT br;                         // File R/W count
  10.        
  11.         u8 Buf[512];
  12.         u32 addTemp=QSPI_FLASH_APP_DATA + QSPI_FLASH_SAVE_APP_ADD;
  13.         u32         temp=0,bin_size,erasedAdd;
  14.         erasedAdd=QSPI_FLASH_SAVE_APP_ADD;
  15.   res = f_mount (&fs, "0:", 1);//挂载文件系统
  16.   res = f_open(&fsrc, filename, FA_OPEN_EXISTING | FA_READ);         //打开传进来的文件
  17.        
  18.   if(res!=FR_OK){ //打开文件存在错误
  19.                  f_close(&fsrc);
  20.      f_mount (NULL, "0:", 1);//注销文件系统
  21.                  return 0;
  22.   }
  23.         bin_size= fsrc.obj.objsize;//获取文件长度
  24.         if(bin_size==0)
  25.         {
  26.                 f_close(&fsrc);
  27.     f_mount (NULL, "0:", 1);//注销文件系统
  28.                 return 0;
  29.         }
  30.         if(bin_size<= 1024*1024*2)//目前设定最高FLASH 存储容量是2MB
  31.                 {
  32.                         bin_size+=0x10000;
  33.                         while(erasedAdd<bin_size)
  34.                         {
  35.                                 QFLASH_FunErase(erasedAdd,1);//eType 0:SE_Com , 1:BE64K_Com
  36.                                 erasedAdd += 0x10000;
  37.                         }       
  38.                 }
  39.                 else
  40.                 {
  41.                         f_close(&fsrc);
  42.       f_mount (NULL, "0:", 1);//注销文件系统
  43.                   return 0;
  44.                 }
  45.        
  46.                 bin_size= fsrc.obj.objsize;
  47.         do
  48.     {
  49.       f_read(&fsrc, Buf, 512, &br);
  50.       QFLASH_FunProgram(addTemp, ( unsigned char *)(Buf), 512);
  51.                         addTemp+=512;
  52.       bin_size -= 512;
  53.     }
  54.    while(bin_size > 511);
  55.                 if(bin_size)
  56.                 {
  57.                         f_read(&fsrc, Buf, bin_size, &br);
  58.                         QFLASH_FunProgram(addTemp, ( unsigned char *)(Buf), bin_size);
  59.                 }
  60.                 //==============  写入程序头 ==============//
  61.                 *(u32*)(Buf)    =  0x70020000 ;//程序存放在RAM中的起始地址,与KEIL设置中一致
  62.                 *(u32*)(Buf+4)  =  ~0x70020000 ;
  63.                 *(u32*)(Buf+8)  =  fsrc.obj.objsize;//程序长度
  64.                 *(u32*)(Buf+12) =  ~(fsrc.obj.objsize);       
  65.                 QSPI_PageXbytesProgram_Standard_NoCheck(0x10000, ( unsigned char *)(Buf), 16);//程序头目前只写两个参数,程序存放的RAM起始地址及长度
  66.                
  67.                 f_close(&fsrc);//升级完成,关闭文件
  68.                 f_mount (NULL, "0:", 1);//注销文件系统
  69.                 return 1;
  70. }
复制代码


程序逻辑是这样的,举例:你要把一个点灯程序tk499.bin放到SD卡上升级进去,那先把这个tk499.bin文件复制到SD卡的根目录下,然后在程序中打开这个文件就行 program_updata("tk499.bin");仅需要调用一个函数即可以实现升级。

核心程序流程:先open传进来的文件,获取文件长度,然后按照文件长度擦除足够的FLASH(注意:用64K模式擦除,速度快),然后就一个扇区一个扇区从SD卡中读取文件写入FLASH,最后不足一个扇区的数据单独写入;最后,主体程序写完了,要写一个程序头,告诉bootloader,这个程序应该放在哪个地址的RAM上运行,及程序的长度。这两个参数均取反一次存入,以便bootloader校验。这样就升级完成了,关机再开一下就是新的程序了。

用最新emWin版本写的程序: TK499_emWin6.14_SmartBoard_TK043F1168横屏版_按键图标模版.rar (15.77 MB)




题外话:这个程序很接近bootloader了,bootloader的编与就FLASH与RAM的起始地址不同,利用这个模式,你可以写一个自己的bootloader
bootloader编写,这两个宏定义要改成下面这个,另外bootloader的容量是很小的,程序要限制在64K内
#define T_SRAM_BASE 0X20000000
#define T_SDRAM_BASE 0X70008000
bootloader程序,KEIL的设置如下:


如果有特殊需要的客户,可以试着改一下属于自己的bootloader

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入90汤圆

2
发表于 2020-12-15 13:16:13 | 只看该作者
挺好,又有新的资料分享了

出0入0汤圆

3
发表于 2020-12-15 15:03:11 | 只看该作者
很好,可以开整了

出0入0汤圆

4
发表于 2020-12-16 09:07:33 来自手机 | 只看该作者
哇,这个可以!

出0入0汤圆

5
发表于 2020-12-16 14:11:25 | 只看该作者
你的系统的资料越来越多了,以后会多关注一下,如果有机会,就尝试做下切换

另外,建议系统的介绍贵司单片机的下载,升级,就是把资料组织在一个文档中, 最好不要到处找帖子。
还有一个建议,把例程也都整理到一个统一的帖子里,加上简要说明和详细介绍,方便查阅使用。

出0入42汤圆

6
发表于 2020-12-16 14:13:07 | 只看该作者
看楼主一路走来,资料越来越齐全了,可见贵公司呆头呆脑的工程师还是挺努力的

出90入4汤圆

7
发表于 2020-12-16 20:19:18 | 只看该作者
这个芯片少了以太网。暂时用不上

出100入101汤圆

8
发表于 2020-12-16 21:14:37 来自手机 | 只看该作者
还是本地升级

出0入17汤圆

9
发表于 2020-12-17 10:57:01 来自手机 | 只看该作者
聪明头脑的工程师,搞个wifi远程升级。

出0入0汤圆

10
发表于 2020-12-31 13:42:46 | 只看该作者
越来越完善了

出0入0汤圆

11
发表于 2021-2-1 18:39:44 | 只看该作者
Build target 'TK499_LTDC'
linking...
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_mem.o(.bss).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching uart.o(.bss).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_draw_blend.o(.bss).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_tk499.o(STACK).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_gc.o(.bss).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_draw_label.o(.bss).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_theme_material.o(.bss).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_port_indev_template.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_mem.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching hal_rcc.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_font_montserrat_14.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_gc.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_font_montserrat_14.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_mem.o(.bss).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_mem.o(.bss).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_task.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_obj.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_font_fmt_txt.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_anim.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_txt.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching tk499_timer.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_indev.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_refr.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_draw_label.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_hal_tick.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_theme_material.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lcd.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching uart.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_hal_disp.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_txt.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_theme.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_img.o(.data).
.\obj\TK499_LTDC.axf: Error: L6406E: No space in execution regions with .ANY selector matching lv_img_cache.o(.data).
.\obj\TK499_LTDC.axf: Error: L6407E: Sections of aggregate size 0x4db4 bytes could not fit into .ANY selector(s).
Not enough information to list image symbols.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 08:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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