STM32通过SD卡IAP
生活随笔
收集整理的這篇文章主要介紹了
STM32通过SD卡IAP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
STM32通過SD卡IAP(僅介紹應用層)
1.先確定是否插入了SD卡,否則直接進入app
read_sd_check();2.進行SD卡初始化
SD_Init();3.掛載SD卡
FRESULT f_mount (FATFS* fs,const TCHAR* path,BYTE opt)參數分別為:工作區指針、磁盤路徑、驅動器號(0為稍后注冊,1為立即注冊)。當工作區指針為NULL,則為注銷函數。 如:f_mount(&fatfs,"0:",1);4.打開記錄app數據的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); //關閉文件5.讀取Flash中原本的app數據,并判斷版本
#define SAVE_DATA_ADDR 0x08018800 //數據內部存儲起始地址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 //程序內部存儲起始地址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); //關閉文件8.校驗MD5
#define SAVE_PROGRAM_ADDR 0x08019000 //程序內部存儲起始地址progFileSize = atoi16((char *)updateInfoTypeDef.size,10);//把文件大小的字符轉換為整數 get_bin_md5(SAVE_PROGRAM_ADDR,progFileSize,buf); //校驗程序MD5值if(strcmp((const char *)&updateInfoTypeDef.md5,(const char *)buf)==0) //程序校驗成功9.校驗正確,則更新Flash內的app數據
#define SAVE_DATA_ADDR 0x08018800 //數據內部存儲起始地址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即可
總結
以上是生活随笔為你收集整理的STM32通过SD卡IAP的全部內容,希望文章能夠幫你解決所遇到的問題。