<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.如果更新失敗,會提示更新失敗原因,可以根據原因查找問題所在.