20-STM32+ESP8266+AIR202/302遠程升級方案-擴展-移植遠程升級包實現STM32F072+DTU遠程升級單片機程序(基於STM32CubeMX)


<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

說明

當前很多用戶也在使用STM32CubeMX開發單片機程序,

這節說明一下在STM32CubeMX的基礎上移植進去遠程升級程序.

注:所有STM32F0XXX系列的單片機請參考這節移植使用!

前要

在移植到別的單片機之前,用戶需要對自己的單片機有如下的了解:

1.會使用Flash存儲數據,是非常的了解Flash的使用!

2.知道怎么跳轉程序運行!(這個都是固定的幾句程序,找找資料)

3.會使用定時器.

以上缺一不可!

注:(基礎知識不再重復,請用戶從第一節開始看!)

因為是使用的DTU,請用戶自行配置DTU連接自己的WEB服務器

可以配置成TCP模式,可以配置成我的服務器,先測試下

IP地址:  mnif.cn    端口號: 80

配置完成以后發送個指令

GET /1.txt HTTP/1.1\r\nHost: mnif.cn\r\n\r\n

然后會看到返回

 

 

 

 

 

 

 

快速使用

請把DTU或者模組配置為 IP地址:mnif.cn  端口號:80

並設置為透傳模式!

串口1作為日志打印,串口2和DTU或模組通信

 

1.打開下面的BootLoader程序 和 用戶程序 UserAPP

 

2. 用jlink 或者 ST-Link 下載BootLoader程序

 

 

 

2.打開用戶程序 調整下APP用戶程序配置(選擇只擦除本身使用的部分)

 

 

3.下載程序

 

 

4.查看打印的日志

先運行BootLoader然后運行用戶程序

用戶程序每隔一段時間發送get指令獲取 info.txt文件

 

 

 

5.單片機連接DTU或模組進行測試

已經配置好透傳的DTU連接單片機的串口2

STM32 PA2  TX   ---  DTU  RX

STM32 PA3  RX   ---  DTU  TX

我配置了ESP8266模塊作為了DTU 透傳模式

 

 

6.查看串口1打印的日志

 

 

 

 

 

 

 

 

開始移植(BootLoader程序制作)

1.新建CubeMX 工程

 

 

 

 

 

 

 

 

 

 

2.配置兩個串口,我串口1就負責打印日志,串口2負責和網絡模組通信

串口1,我設置的115200

 

 

 

 

 

 

 

串口2,波特率根據自己的選擇,我的模組是115200

 

 

 

 

 

 

3.打開看門狗

256分頻,溢出值為 2340;  約15S

注:因為升級之前需要先擦除Flash,擦除Flash需要時間,所以我設置的15S

 

 

 

 

注:看門狗時鍾為40KHz , 分頻256 , 40000/256 = 156Hz ,  所以每累加156,為1S 

看門狗溢出時間 S = 156*(1,2,3,4...)     

我設置的15S,所以上面的值為 156*15 = 2340;

 

 

 

 

 

3.配置工程

 

 

 

 

4.讓每個功能都生成單獨的文件,最后點擊生成工程

 

 

 

 

 

 

5.打開工程,或者自己去工程目錄打開

 

 

 

 

 

 

6.把移植文件放到自己的工程

 

 

7.工程添加兩個Group

注意:在工程名上右鍵選擇 Add group 這種方式添加!另一種方式會卡住.一個bug

 

 

 

 

 

 

8.添加頭文件

 

 

9.編譯下工程

 

 

 

 

10.修改為自己單片機的頭文件包含

 

 

 

 

 

11.然后再編譯一下,如果出現以下數據類型沒有定義

 

 

 

12.最簡單的方式是在自己的 stm32fxxxx.h的頭文件里面加入

typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;

typedef __IO uint32_t vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t vu8;

 

 

 

 

 

13.編譯一下(替換自己的復位重啟程序)

 

 

 

 

14.把自己的延時1ms函數放到此處

 

 

 

 

15.替換自己的請求文件發送函數(發送GET協議),

注:假設DTU配置好了透傳模式.(我使用的串口2,根據自己的修改)

只要往串口發送數據,數據就直接發送給了服務器.

如果自己的程序文件是https訪問的,請自行編寫https方式發送數據的方式.

 

 

 

 

16.關閉自己在BootLoader程序里面使用的所有中斷

 

 

 

 

17.修改stmflash.c文件里面的實現程序(根據自己的單片機修改)

讀寫半字

 

 

 

指定地址寫入指定長度的半字數據

 

 

寫一個半字,並加入判斷寫入的是否正確

 

指定地址讀取指定長度的半字數據

 

擦除頁

注意1:假設需要擦除20KB,BootLoader會傳進來20.

BootLoader里面只是傳進來需要擦除的KB數.

如果自己的單片機是以1024字節一頁,那么此函數直接控制擦除20頁即可.

如果自己的單片機是以2048作為一頁,那么此函數就應該擦除10頁!

所以源碼里面有一句 if(STM_SECTOR_SIZE==2048){PageCnt=PageCnt/2;}

 

注意2:擦除成功請返回 4

 

 

 

 

 

18.在stmflash.h文件中修改flash大小

 

 

 

19.在主程序里面寫上以下程序

 

 

 

 

注:如果使用的是DTU,DTU已經連接了服務器,所以屏蔽掉需要自己實現連接的部分 AutoConnectTCP()

 

 

 

20.把 IAPTimerOut(); 函數放到1ms定時器中斷函數里面

我放到了滴答定時器里面

 

 

 

 

 

 

 

 

 

 

21.重定向printf打印(可以沒有,最好有!)

注:假設使用的串口1作為日志打印,根據自己的修改

 

 

 

 

 

 

注:最好使用緩存+中斷的方式發送

 

22.上面是阻塞方式發送的printf數據,需要屏蔽下面的部分

 

 

 

 

23,把 IAPPutDataToLoopList(char Res); 和 IAPHttpHead(char Res);

函數放到和模塊通信的串口中斷接收里面

 

 

 

 

 

24.BootLoader已經移植完成,編譯,下載查看下打印的日志

 

 

 

 

注:上面顯示的是默認訪問的下載路徑.

 

我預期是把程序文件放到服務器的下面的目錄,bin文件名字為 user_crc.bin

所以上面才會那樣寫哦

 

 

 

修改BUG

1.HAL庫主循環執行起來比基礎庫慢....增加點緩存(或者修改主循環時鍾頻率)

 

 

 

 

2.STM32F072系列的單片機無法強制的把 char型 數組 映射為 u16型數組 (會死機)

 

 

 

死機位置:

 

 

 

 

 

 

制作用戶程序

1.新建一個工程(配置串口1,2)

 

 

 

 

 

 

2.工程名字為 UserAPP

 

 

 

3.打開看門狗

256分頻,溢出值為 780;  約5S

 

 

 

3.讓每個功能都生成單獨的文件,最后點擊生成工程

 

 

 

 

 

 

4.把BootLoader工程里面的文件拷貝到UserAPP工程

 

 

 

 

 

 

 

 

 

 

5.添加上類型定義

 

typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;

typedef __IO uint32_t vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t vu8;

 

 

6.修改IAP.h文件,里面的宏定義

 

 

 

 

7.屏蔽

 

 

 

 

8.取消屏蔽

型號和info.txt文件的下載地址(根據自己的情況修改)

 

我預期是把程序文件放到服務器的下面的目錄,info文件名字為 info.txt

所以上面才會那樣寫哦

 

 

提醒:用戶如果學習了前面的章節應該知道升級的流程哈

info.txt文件內容:

{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32F072DTU/user_crc.bin","info":"1.解決了部分BUG
2.優化了部分程序"}

 

用戶程序訪問 info.txt文件,獲取版本號,如果和自己的版本號不一致,再獲取size (程序文件大小)

url (程序文件下載地址)

然后存儲到flash,置位一下升級標志,其余的就交給BootLoader了

 

9.根據BootLoader先前打印的信息調整用戶程序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10.在主函數里面添加以下函數

IAPInfoPathInit();

IAPUpdateDispose();

注意:根據前面的說明,實際中最好應該確保用戶程序執行一段時間沒有問題以后

再調用 IAPUpdateDispose();函數

 

 

 

 

 

 

 

 

11.此時編譯下工程

 

 

 

 

12.報錯原因

 

 

 

咱們把48個中斷地址強制放在了RAM的 0x200000000的開始地址上了.

軟件編譯的時候,有些變量也放到了這個地址上,然后軟件就報沖突錯誤.

設置下RAM的偏移,讓程序里面的變量從偏移的地址開始存放

 

 

 

 

測試下程序是否可以工作起來(使用Jlink 或 ST-link下載器)

1.我在用戶程序里面加了些打印的信息

 

別忘了加喂狗 HAL_IWDG_Refresh(&hiwdg); 

我上面的截圖忘了加了.

 

 

 

2.先用下載器下載BootLoader程序

 

 

 

 

3.調整下APP用戶程序配置(選擇只擦除自己使用的部分)

 

 

 

4.下載APP用戶程序

 

 

 

 

5.查看日志(先運行BootLoader 然后接着運行用戶程序)

 

 

 

 

 

遠程升級准備工作

提示:

info.txt文件內容:

{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32F072DTU/user_crc.bin","info":"1.解決了部分BUG
2.優化了部分程序"}

 

用戶程序訪問雲端的 info.txt文件,獲取版本號,如果和自己的版本號不一致,再獲取size (程序文件大小),url (程序文件下載地址)

然后調用IAPSetFileSize(u32 data) 和 IAPResolveUrl(char* ch) 函數

把文件大小和url存儲到flash, 然后調用一下置位升級標志函數  IAPSetUpdateFlage();

最后執行復位  IAPResetMCU();  其余的就交給BootLoader了.

 

1.在用戶程序里面使用get指令獲取info.txt文件數據,並解析服務器返回的數據(串口2)

注:info.txt文件格式

{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32F072DTU/user_crc.bin","info":"1.解決了部分BUG
2.優化了部分程序"}

 

2.重新編譯下載APP用戶程序

串口2每隔10S發送get指令

 

 

 

 

3.用戶程序修改固件版本

 

 

 

 

 

4.配置生成bin文件,編譯下工程

 

 

 

E:\MDK5\ARM\ARMCC\bin\fromelf.exe  --bin -o  .\user.bin  .\UserAPP\UserAPP.axf

前面的路徑根據自己的修改

 

將會在工程目錄生成user.bin文件

 

 

 

 

 

5.打開OTA Tools 軟件,生成帶有CRC校驗的bin文件

 

 

 

 

在同一級目錄生成 user_crc.bin

 

 

 

12.把生成的 user_crc.bin放到服務器上

 

 

 

 

 

 

13.還差一個info.txt文件,我准備了一個模板

1.打開這個模板

 

 

2.版本號和剛才上傳上去的APP用戶程序保持一致

 

 

 

3. size和OTA Tools生成的保持一致

 

 

 

 

 

4.url和bin文件在服務器的下載路徑保持一致

 

 

 

 

 

5.把info.txt也放到服務器上

 

 

 

 

 

注:info.txt文件在服務器的位置其實是要和這里的路徑保持一致

 

 

 

 

測試遠程升級

1.已經配置好透傳的DTU連接單片機的串口2

STM32 PA2  TX   ---  DTU  RX

STM32 PA3  RX   ---  DTU  TX

我配置了ESP8266模塊作為了DTU 透傳模式

 

 

 

2.查看串口1打印的日志

 

 

 

 

 

 

 

 

 

 

 

 

 

3.如果更新失敗,會提示更新失敗原因,可以根據原因查找問題所在.

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM