1. 程式人生 > 實用技巧 >06-STM32+ESP8266+AIR202遠端升級方案-移植STM32+ESP8266實現利用http或https遠端更新STM32程式到自己的專案(定時訪問升級,備份升級)

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,至此使用者程式也移植完成