1. 程式人生 > >STM32 IAP線上升級教學

STM32 IAP線上升級教學

該篇文章主要講解如何使用SMT32進行線上升級的方法和流程,並不會設計過多具體程式碼,之後會製作專門講程式碼的視訊。

概述

如何實現線上的韌體更新,其實就是在片子中儲存一段BootLoader程式和主程式(我叫他APP程式)。正常情況下程式僅僅執行APP程式,當得到命令後,程式將跳轉到BootLoader程式進行新的APP程式更新,完成後跳轉到APP程式執行。呃,好繞,哎無所謂,將就看吧。
BootLoader程式放置在正常程式的開始位置,沒啥講究,但是APP程式就不一樣的,他需要給他規定一個起始位置,所以需要計算好判斷程式的大小來進行設定設定。
SMT32的儲存結構就變為了 記憶體 – BootLoader — APP —flash —

BootLoader程式

這個程式主要是用來區分是否需要更新程式,如果是就接收新程式並且寫入flash,如果不是就直接跳轉至APP程式。我將該程式分為了四個部分

1.判斷

該步驟用於判斷是否需要更新,我的程式裡面使用了0x0800F000這個flash地址作為標誌位來判斷,地址是隨便選的啦,只要不干擾到APP程式就好。該標識如果是0xFFFF則表示需要更新。修改是在APP程式裡面(咦!我怎麼把它寫到那去了,這個應該寫在BootLoader裡面,在更新結束後更改標誌位)具體在APP程式 一欄會講到。

2.擦除

該步驟用於預先擦除需要寫入的flash程式區域,於是就需要上位機發送一個頁大小,這裡我頂的協議是 FF PAGE AA,PAGE表示頁數。為什麼要這麼做呢,因為擦除操作將會耗費大量的時間,如果邊接收資料邊擦除寫入會影響接收資料量,這點筆者糾結了好久才發現為啥資料量不對 - -||。於是我便先對區域擦除,再邊接收資料邊寫入flash就不會出問題了。頁數也方便確認,上位機在讀取bin檔案的時候便能知道大小,除以也大小就得到頁數了。

3.下載

這一步驟就是迴圈的接收資料寫入flash而已,對了,這裡要提到的是筆者使用的是c8t6系列,是MD的,如果你使用HD的片子需要修改下寫入方式。怎麼弄就自己去學SMT32的flash操作啦。

4.執行

這裡就不得不提到使用者程式碼去的第二個地址為開始地址這個知識咯,具體可以到手冊上去看看,就是說我們需要執行新程式,就得吧指標指向新程式的開始地址,也叫復位地址。至此,程式就跑去執行app程式咯。
我想大家也是覺得一篇文章全是字難受吧,還是貼幾張圖吧 - -
這裡我選用了封裝的IAP類圖和主函式圖。
這裡寫圖片描述
這裡寫圖片描述

APP程式

這個程式也就是我們需要實際執行的程式了。他與我們之前寫的程式不同之處就在於:

1.需要偏移向量表

就是在程式開始加上一句 SCB->VTOR = 0x08000000 | 0x2800;來偏移向量表,當然還是的根據你的BootLoader來寫,這裡的0x2800就是我設定的APP程式rom區域的起始位置

2.需要有軟體復位方法

APP程式當然需要一個能夠更新程式的方法啦,這裡使用軟體復位,並且修改標誌位來讓BootLoader明白這次復位時為了更新程式的。
提供下STM32軟體復位的程式碼 星號((u32 星號)0xE000ED0C) = 0x05fa0004;

3.需要修改ROM範圍

由於前面都擠了一坨程式了,所以APP程式的ROM區域也就不一樣的。貼張圖吧:

這裡寫圖片描述

這裡還需要說下,我們需要的是一個bin檔案,不是Hex檔案,由於我們是直接指定了地址進行下載的,就不需要下載檔案還附帶地址了。額不懂可以搜尋bin檔案和Hex檔案的區別,簡單講就是一個帶了地址,一個沒有。至於如何使用KEIL來生成bin檔案了,當然你也可以去搜- -,我貼幾個圖講講吧

這裡寫圖片描述
這裡寫圖片描述
其實圖片說得很清楚了,額。。這個圖是我擷取的別人的。就是使用了個keil裡面的工具來生成。在Run右邊的框裡寫的東西有點多,我就發個例子吧
C:\Other\keil5\ARM\ARMCC\bin\fromelf.exe –bin -o E:\study\stm32\procedure\IAP_example\APP\RTE\APP.bin E:\study\stm32\procedure\IAP_example\APP\Objects\App1.axf
額。。。真夠長的,但這是絕對路徑,你也可以寫相對路徑就沒這麼長

流程圖

這裡寫圖片描述

測試

1.首先下載BootLoader程式
2.開啟串列埠除錯助手,16進位制傳送FF 02 AA(由於我的APP程式大小小於兩頁)這是程式會返回please choose file….
3.這裡選擇bin檔案傳送過去。 程式將返回Data is written to complete…和loading APP….後執行新程式
這裡寫圖片描述
我的APP程式就是不斷髮送。。。
4.對執行中的新程式傳送FF AA,這時就會跳轉到BootLoader程式。

相關下載

STM32程式碼下載
額,太窮了,收集點幣,之後會提供GitHub連線的

上位機下載程式
這個是百度的連線。。。不要幣 - -

視訊

還沒做,做了會發上來的