日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32通过SD卡IAP

發(fā)布時間:2023/12/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32通过SD卡IAP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

STM32通過SD卡IAP(僅介紹應(yīng)用層)

1.先確定是否插入了SD卡,否則直接進入app

read_sd_check()

2.進行SD卡初始化

SD_Init();

3.掛載SD卡

FRESULT f_mount (FATFS* fs,const TCHAR* path,BYTE opt)參數(shù)分別為:工作區(qū)指針、磁盤路徑、驅(qū)動器號(0為稍后注冊,1為立即注冊)。當工作區(qū)指針為NULL,則為注銷函數(shù)。 如:f_mount(&fatfs,"0:",1);

4.打開記錄app數(shù)據(jù)的txt文件,并讀取版本、大小、MD5

#define SD_INFO_PATH "/program/slave/info.txt" //更新消息文本地址f_open(&updateProgFile,SD_INFO_PATH,FA_READ); //只讀類型打開文件copy_between_characters((char *)&readBuf,(char*)&updateInfoTypeDef.version,"#","$ ");//獲取版本 copy_between_characters((char *)&readBuf,(char *)&updateInfoTypeDef.size,"$ ","@");//獲取大小 copy_between_characters((char *)&readBuf,(char *)&updateInfoTypeDef.md5,"@","&");//獲取MD5f_close (&updateProgFile); //關(guān)閉文件

5.讀取Flash中原本的app數(shù)據(jù),并判斷版本

#define SAVE_DATA_ADDR 0x08018800 //數(shù)據(jù)內(nèi)部存儲起始地址STMFLASH_Read(SAVE_DATA_ADDR,(u16 *)buf,sizeof(innerSaveTypeDef));if(strcmp((const char *)&updateInfoTypeDef.version,(const char*)&innerSaveTypeDef.ProgVersion)!=0) //版本號不一樣

6.版本不一樣,則打開bin文件

#define SD_PROG_PATH "/program/slave/" //更新程序地址sprintf((char *)buf,"%s%s%s",SD_PROG_PATH,updateInfoTypeDef.version,".bin"); //組合成路徑+文件名 fileOperionResult = f_open(&updateProgFile,buf,FA_READ); //只讀類型打開文件

7.將讀取的bin文件寫入flash

#define SAVE_PROGRAM_ADDR 0x08019000 //程序內(nèi)部存儲起始地址fileOperionResult = f_open(&updateProgFile,buf,FA_READ); //只讀類型打開文件 i=updateProgFile.fsize; progWriteAddr=SAVE_PROGRAM_ADDR;while(1)if(i<2048){fileOperionResult = f_read (&updateProgFile, &readBuf,i, &br); //讀取文件if(fileOperionResult!=FR_OK) //文件打開失敗goto ERROR; iap_write_appbin(progWriteAddr,readBuf,i); //更新FLASH代碼 break;}else{fileOperionResult = f_read (&updateProgFile, &readBuf,2048, &br); //讀取文件if(fileOperionResult!=FR_OK) //文件打開失敗goto ERROR; iap_write_appbin(progWriteAddr,readBuf,sizeof(readBuf)); //更新FLASH代碼 i-=2048;progWriteAddr+=2048;} } fileOperionResult = f_close (&updateProgFile); //關(guān)閉文件

8.校驗MD5

#define SAVE_PROGRAM_ADDR 0x08019000 //程序內(nèi)部存儲起始地址progFileSize = atoi16((char *)updateInfoTypeDef.size,10);//把文件大小的字符轉(zhuǎn)換為整數(shù) get_bin_md5(SAVE_PROGRAM_ADDR,progFileSize,buf); //校驗程序MD5值if(strcmp((const char *)&updateInfoTypeDef.md5,(const char *)buf)==0) //程序校驗成功

9.校驗正確,則更新Flash內(nèi)的app數(shù)據(jù)

#define SAVE_DATA_ADDR 0x08018800 //數(shù)據(jù)內(nèi)部存儲起始地址memcpy(innerSaveTypeDef.ProgVersion,updateInfoTypeDef.version,sizeof(innerSaveTypeDef.ProgVersion));//記錄版本號 memcpy(innerSaveTypeDef.ProgSize,updateInfoTypeDef.size,sizeof(innerSaveTypeDef.ProgSize)); //記錄文件大小 memcpy(innerSaveTypeDef.progMd5,updateInfoTypeDef.md5,sizeof(innerSaveTypeDef.progMd5)); //記錄MD5值 memcpy(innerSaveTypeDef.progDate,buf,sizeof(innerSaveTypeDef.progDate)); //記錄更新日期STMFLASH_Write(SAVE_DATA_ADDR,(uint16 *)readBuf,sizeof(innerSaveTypeDef)); //更新成功存儲更新信息

10.完成后進入app即可

總結(jié)

以上是生活随笔為你收集整理的STM32通过SD卡IAP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。