06-STM32+ESP8266+AIR202遠端升級方案-移植STM32+ESP8266實現利用http或https遠端更新STM32程式到自己的專案(定時訪問升級,備份升級)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
移植BootLoader
1.凡是和ESP8266類似,通過串列埠配置通訊的模組都可參照此節移植.
如果做專案,請大家必須使用STM32F103CBT6 及其以上的Flash>=128KB的微控制器.
2.使用者移植的時候首先保證自己的程式已經可以控制模組實現TCP通訊(模組作為客戶端)
3.我準備了一份空模板
該模板只有一個定時器,延時,串列埠
因為每個人寫的程式都不一樣,我假設我的模板也實現了控制模組實現TCP通訊.
然後現在我就想移植我寫的程式到一個新的工程裡面作為BootLoader載入程式.
4.我複製出來一份空模板作為BootLoader
5.把BootLoader移植檔案裡面的BootLoader和mem資料夾複製到自己的工程
6.把檔案新增到工程,幷包涵下.h路徑
7.需要新增操作 flash的庫
8.編譯工程,開啟第一個錯誤
9.新增上自己的延時1ms函式
10,接著看下面兩個錯誤
下面兩個地方是向模組傳送get指令
11,我的8266模組配置上TCP連線Web伺服器以後如果是透傳模式下我直接往串列埠傳送資料
資料就會被8266轉發出去
如果不是透傳模式下,https的時候模組就不支援透傳,我需要先發送AT+CIPSEND=資料個數
然後等模組返回 < 以後我再發送資料
所以我的修改如下(假設我是用串列埠1和wifi模組通訊)
12,把IAPTimerOut(); 函式放到1ms定時器中斷函式裡面
13, 在主程式裡面寫上以下程式
注:AutoConnectTCP()函式是控制模組連線web伺服器的函式,客戶需要根據自己的程式實現此功能
連線的IP地址為:IAPStructValue.IP(字串形式) 連線的埠號為:IAPStructValue.Port
連線成功以後返回 1
上面的IP地址和埠號是根據韌體程式地址解析出來的
還有一個引數IAPStructValue.SSLEN ; 0:http 1:https
如果客戶使用的也是8266,可以參考測試升級原始碼中的例子.
如果客戶需要把字串形式的IP地址轉換為陣列形式,可使用下面的轉化函式
/** *@brief 檢查字串地址是IP還是域名 *@param str 要轉換的資料 *@param ip 轉換後儲存的位置 *@return 0:轉換失敗,可能是域名 1:轉換成功 *@example UTILS_StrToIP("192.168.0.1", &ip) ip[0]=192;ip[1]=168;ip[2]=0;ip[3]=1; */ uint8 UTILS_StrToIP(const char* str, void *ip) { /* The count of the number of bytes processed. */ int i; /* A pointer to the next digit to process. */ const char * start; start = str; for (i = 0; i < 4; i++) { /* The digit being processed. */ char c; /* The value of this byte. */ int n = 0; while (1) { c = * start; start++; if (c >= '0' && c <= '9') { n *= 10; n += c - '0'; } /* We insist on stopping at "." if we are still parsing the first, second, or third numbers. If we have reached the end of the numbers, we will allow any character. */ else if ((i < 3 && c == '.') || i == 3) { break; } else { return 0; } } if (n >= 256) { return 0; } ((uint8_t*)ip)[i] = n; } return 1; }
14,把IAPPutDataToLoopList(char Res);IAPHttpHead(char Res);
函式放到和模組通訊的串列埠中斷裡面
15,設定下預設的韌體程式下載地址(根據自己的伺服器修改)
16,建議在BootLoader程式裡面開啟看門狗
可直接把我提供的升級原始碼中的看門狗複製過來
17,遮蔽掉BootLoader程式裡面使用的中斷
使用者需要把自己的中斷函式放到此處關閉!
18,關於日誌列印口(必須有,便於檢視Flash分配情況和更新過程)
所有的日誌都是使用的printf函式列印
printf列印不得和控制網路模組的串列埠衝突!
printf列印最好加上快取,中斷髮送方式(建議環形佇列+中斷)
如果使用者用 USART_SendData(其它串列埠,c);等類似的阻塞型的函式實現printf
請遮蔽以下部分
19,設定工程生成bin檔案,然後編譯下工程.
19,根據bin檔案大小在 stmflash.h中調整下flash分配
STM32_FLASH_SIZE 根據自己的微控制器容量調整
如果使用的是128KB Flash的微控制器:
FLASH_IAP_SIZE XX 根據BootLoader生成的bin檔案大小設定(該值需要大於生成的bin檔案大小)
FLASH_UPDATE_SIZE 1 //儲存更新相關資料所有FLASH大小,不需要改動.
FLASH_USERDATA_SIZE XX 如果使用者儲存的資料量比較大,增加該值即可
如果使用的是256KB及其以上 Flash的微控制器:
FLASH_IAP_SIZE XX 根據BootLoader生成的bin檔案大小設定(該值需要大於生成的bin檔案大小,設定為4的倍數)
FLASH_UPDATE_SIZE 4 //儲存更新相關資料所有FLASH大小,設定為4
FLASH_USERDATA_SIZE XX 如果使用者儲存的資料量比較大,增加該值即可(設定為4的倍數)
20,當前BootLoader程式已經移植完成
為防止意外情況,我提供的遠端升級原始碼中增加了崩潰處理程式.
客戶根據自己的情況參考移植使用!
重新設定URL
配置模組連線路由器
APUConfig配網
移植使用者程式
1.我複製了一份空模板假設作為了使用者程式
2.把BootLoader移植檔案裡面的BootLoader和mem資料夾複製到自己的工程
3.把檔案新增到工程,幷包涵下.h路徑
4.需要新增操作 flash的庫
5.開啟 IAP.h檔案 設定IAPProgramSelect 為 IAPUserProgram
6.遮蔽掉下面部分
7.去掉遮蔽
8.修改型號和info.txt檔案的下載地址(根據自己的情況修改)
9.編譯下工程,開啟下面的錯誤
10.把自己的延時函式放到此處
11.調整使用者程式stmflash.h檔案裡面的配置
和BootLoader程式裡面的保持一致
和BootLoader程式裡面的保持一致!
和BootLoader程式裡面的保持一致!
12.把BootLoader程式編譯下,下載到微控制器,根據列印的資訊調整使用者程式配置
SCB->VTOR = FLASH_BASE | 0xXXXX;
13,在主函式裡面新增以下函式
14,自行增加使用get指令訪問info.txt檔案命令
連線的伺服器的IP地址IAPStructValue.IP(字串) 埠號 IAPStructValue.Port
檔案路徑IAPStructValue.Path
以上資訊是由IAPInfoPathInit();函式解析而來
連線訪問參考原使用者程式:
15,解析獲取的檔案資訊
info.txt檔案內容:
{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32ESP8266BK/user_crc.bin","info":"1.解決了部分BUG
2.優化了部分程式"}
判斷版本號,本地版本號儲存在 FirmwareVersion
如果版本還不一致,把韌體程式大小和韌體程式下載地址呼叫相應的函式儲存
void IAPSetUpdateUrl(char* ch) //儲存url
void IAPSetFileSize(u32 data) //儲存size
然後設定更新標誌,重啟即可
IAPSetUpdateFlage();
IAPResetMCU();
16,至此使用者程式也移植完成