|
本帖最后由 tiky 于 2020-12-15 14:05 编辑
TKM32F499从最开始的用串口下载,到后来的用USB下载,后来又增加JLINK,DAP等各类仿真下载。今天,将再新增一种下载方式,从SD/TF 卡中下载程序,可以参考这个程序做ESP8266 WIFI远程升级了,以后再也不限载体了。
由于基础驱动都写得差不多了,今天这个程序相对来说就比较简单,调用一下FATFS文件系统函数,然后用QSPI写FLASH就完事;
样例程序中,点击图中“程序更新”进入升级。
关键代码如下:
- //============== 从SD卡中升级程序 ==============//
- #define QSPI_FLASH_SAVE_APP_ADD 0x10000 //程序存在FLASH中的起始总地址
- #define QSPI_FLASH_APP_DATA 0x400 //前面1KB用于存储程序头,例如简单校验,程序长度等,1K后就是程序主体了
- char program_updata(char *filename)
- {
- FATFS fs; // Work area (file system object) for logical drive
- FIL fsrc; // file objects
- FRESULT res; // FatFs function common result code
- UINT br; // File R/W count
-
- u8 Buf[512];
- u32 addTemp=QSPI_FLASH_APP_DATA + QSPI_FLASH_SAVE_APP_ADD;
- u32 temp=0,bin_size,erasedAdd;
- erasedAdd=QSPI_FLASH_SAVE_APP_ADD;
- res = f_mount (&fs, "0:", 1);//挂载文件系统
- res = f_open(&fsrc, filename, FA_OPEN_EXISTING | FA_READ); //打开传进来的文件
-
- if(res!=FR_OK){ //打开文件存在错误
- f_close(&fsrc);
- f_mount (NULL, "0:", 1);//注销文件系统
- return 0;
- }
- bin_size= fsrc.obj.objsize;//获取文件长度
- if(bin_size==0)
- {
- f_close(&fsrc);
- f_mount (NULL, "0:", 1);//注销文件系统
- return 0;
- }
- if(bin_size<= 1024*1024*2)//目前设定最高FLASH 存储容量是2MB
- {
- bin_size+=0x10000;
- while(erasedAdd<bin_size)
- {
- QFLASH_FunErase(erasedAdd,1);//eType 0:SE_Com , 1:BE64K_Com
- erasedAdd += 0x10000;
- }
- }
- else
- {
- f_close(&fsrc);
- f_mount (NULL, "0:", 1);//注销文件系统
- return 0;
- }
-
- bin_size= fsrc.obj.objsize;
- do
- {
- f_read(&fsrc, Buf, 512, &br);
- QFLASH_FunProgram(addTemp, ( unsigned char *)(Buf), 512);
- addTemp+=512;
- bin_size -= 512;
- }
- while(bin_size > 511);
- if(bin_size)
- {
- f_read(&fsrc, Buf, bin_size, &br);
- QFLASH_FunProgram(addTemp, ( unsigned char *)(Buf), bin_size);
- }
- //============== 写入程序头 ==============//
- *(u32*)(Buf) = 0x70020000 ;//程序存放在RAM中的起始地址,与KEIL设置中一致
- *(u32*)(Buf+4) = ~0x70020000 ;
- *(u32*)(Buf+8) = fsrc.obj.objsize;//程序长度
- *(u32*)(Buf+12) = ~(fsrc.obj.objsize);
- QSPI_PageXbytesProgram_Standard_NoCheck(0x10000, ( unsigned char *)(Buf), 16);//程序头目前只写两个参数,程序存放的RAM起始地址及长度
-
- f_close(&fsrc);//升级完成,关闭文件
- f_mount (NULL, "0:", 1);//注销文件系统
- return 1;
- }
复制代码
程序逻辑是这样的,举例:你要把一个点灯程序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)
|
|