Stm8s_IAP_Bootloader設(shè)計_第1頁
Stm8s_IAP_Bootloader設(shè)計_第2頁
Stm8s_IAP_Bootloader設(shè)計_第3頁
Stm8s_IAP_Bootloader設(shè)計_第4頁
Stm8s_IAP_Bootloader設(shè)計_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、項目實踐2:Bootloader1. 項目介紹在之前的例程和實踐中,我們都是使用st-link調(diào)試下載的方式進行程序燒錄。大家可能已經(jīng)認識到這種燒錄方式的弊端了。因為這種燒錄方式首先必須要有以下幾個工具或者軟件:1. 燒錄工具(不能芯片支持的工具不一樣,有ST-Link,JTAG等)2. 已經(jīng)安裝了IDE(IAR或者SVD或者CCS等)或者與燒錄工具匹配的燒錄軟件的電腦3. 燒錄前后需要物理上電掉電(不建議ST-Link進行熱插拔),即開/關(guān)電源.也許大家會覺得,對于學(xué)習(xí)而言,這些都能忍受。但是如果真正做成產(chǎn)品,如果還是用這種方式進行升級,那代價就太大。舉個例子吧,我之前的工作是開發(fā)和維護大功

2、率的UPS(不間斷電源),主要客戶是一些大型企業(yè),例如銀行的數(shù)據(jù)中心,中國移動網(wǎng)絡(luò)中心。UPS內(nèi)部有許多ARM芯片,DSP芯片。這類應(yīng)用場合,即便給程序升級,客戶也不會讓你斷電的,而且因為安全性要求,一般MCU,DSP都是在產(chǎn)品內(nèi)部,根本無法對外開放燒錄盒的燒錄接口。所以絕大部分嵌入式產(chǎn)品,都會開發(fā)Bootloader程序。那么什么是Boot Loader呢?一般來說,嵌入式產(chǎn)品的軟件都會分為兩部分,第一部分為Bootloader,第二部分為主程序(Main APP),它們存放在flash的不同區(qū)域。Bootloader是上電或者復(fù)位以后先執(zhí)行的,通過它,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的

3、映射圖,檢測程序的完整性,判斷是否需要從Bootloader跳轉(zhuǎn)到APP或者更新APP。而主程序呢,則是真正用來實現(xiàn)產(chǎn)品面向客戶的功能的。通常呢,在Bootloader會實現(xiàn)一種或者一種以上的IAP方式,可能是UART,SPI,CAN或者Ethernet等。本次例程呢,就是設(shè)計一個Bootloader,允許用戶用電腦的串口+超級終端實現(xiàn)燒錄功能 2. 程序流程設(shè)計秉承軟件開發(fā)好習(xí)慣,coding前先想好思路,設(shè)計好流程框圖,coding時才能事半功倍哦。 此次Bootloader程序主要分為三個模式:1. 升級模式Upgrade mode:對硬件初始化完成以后,率先檢測這個模式,進入該模式的條

4、件為,檢測到升級程序的命令,否則進入下一個模式的檢測。在這個模式下,LED指示燈閃爍速率最快,為50ms2. 正常模式Normal Mode:這個模式主要作用為檢測主程序是否有效,如果有效則進行程序跳轉(zhuǎn)進入主程序,否則進行下一個模式的檢測。這邊建議在主程序控制LED指示燈以其他的頻率(例如500ms或者1s)閃爍,以示區(qū)別。3. 等待模式Wait Mode:如果上述兩種模式都不滿足,則停留在這個模式。這個模式主要作用為循環(huán)檢測串口數(shù)據(jù),如果有收到數(shù)據(jù)則進行解析,滿足升級模式的進入條件則轉(zhuǎn)到升級模式。該模式下,LED指示燈閃爍速率為200ms。程序流程框圖如下:2.1. 正常模式從之前的程序流程

5、圖可以看出,我們已經(jīng)將stm8s的flash分為了Bootloader和Main APP,所以如果沒有接到燒錄指令且Main APP的flash區(qū)域已經(jīng)有了正常的程序,那么bootloader就跳轉(zhuǎn)到Main APP執(zhí)行。那么怎么判斷Main APP已經(jīng)有了程序了呢?這邊我提供一個比較簡單方法。我們可以在Main APP的代碼中,把某串特定的字符通過偽指令放入特定的地址,那么Bootloader只要讀取該地址與預(yù)先規(guī)定好的字符是否一致。一致的話則認為Main APP存在。本次實踐,我在Main APP中將“XLXWW”字符放入flash的0x9180地址中。當然如果對安全性要求更高的話,我們還

6、可以定義更復(fù)雜的方式。業(yè)內(nèi)比較通用的方式是除了剛才提到的方法,還會加上將整個Main APP的flash的值進行checksum校驗等。2.2. 升級模式升級指令會在在兩種情況下收到:1. 芯片內(nèi)部只有bootloader2. 芯片有bootloader和Main APP,且當前程序跑在Main APP。這種情況下,我們在跳轉(zhuǎn)會Bootloader前需要先將這個信息寫入EEPROM,bootloader才知道需要升級程序下面定義了升級模式過程中的步驟:1. 如果之前未初始化UART,則首先初始化UART的配置;2. 上位機(PC)通過串口發(fā)送詢問請求,包括系統(tǒng)型號,程序版本等信息,Bootlo

7、ader根據(jù)自己的信息回復(fù),如果上位機認為匹配成功,則進行下一步3. 上位機根據(jù)燒錄文件的信息,發(fā)送開始燒錄請求,請求包中包含了需要擦除的地址段。Bootloader根據(jù)上位機的請求,擦除對應(yīng)地址的flash,成功后回復(fù)ok4. 上位機分段將flash的Data傳送給你Bootloader,Bootloader將數(shù)據(jù)依次寫入Flash空間5. 所有數(shù)據(jù)燒寫完成后,上位機開始請求驗證flash數(shù)據(jù)是否被正確寫入。此時Bootloader分段讀取flash數(shù)據(jù),發(fā)送給上位機,上位機收到數(shù)據(jù)后與原始燒錄文件的數(shù)據(jù)做對比,如果完全一致,則整個燒錄過程結(jié)束,如果有不一致,則提示用戶是否重新燒錄。2.3.

8、 等待模式等待模式,其實就是由于Main APP不存在或者不完整,程序一直待在booloader. 在while循環(huán)里面,一直查詢是否有收到串口數(shù)據(jù)。如果有則進行解析,并根據(jù)解析后的指令是進入升級模式還是丟棄這些不滿足期望的數(shù)據(jù)。3. 前期準備3.1. 編譯器是怎么生成燒錄文件的簡單講,編譯器就是將“一種語言(通常為高級語言)”翻譯為“另一種語言(通常為低級語言)”的程序。一個現(xiàn)代編譯器的主要工作流程:源代碼 (source code) 預(yù)處理器 (preprocessor) 編譯器 (compiler) 目標代碼 (object code) 鏈接器 (Linker) 可執(zhí)行程序 (execu

9、tables). 以IAR為例,編譯可以細分為三個階段:1. 源文件解析IAR中有C/C+和匯編編譯器,會根據(jù)實際項目中的源文件類型,翻譯為中間目標文件. 這些文件具備特殊格式,可重定位,作為第二步鏈接器的輸入文件。2. 鏈接第一步生成的目標文件,只是一個中間產(chǎn)物,需要通過鏈接器進行鏈接,生成燒錄文件。既然要鏈接,我們首先必須得有鏈接配置文件。Stm8s鏈接配置文件是.icf文件,默認情況下只要我們在工程設(shè)置中選取了device,編譯器會自動找尋到對應(yīng)的.icf作為配置文件。所以之前的課程中,并沒有提及。但是在此次課程中,由于我們需要將flash分為兩個部分,因此需要我們對自帶的.icf進行適

10、當?shù)男薷?。詳?.2.與此同時,鏈接器也可以生成其他文件,比較有參考意義的有.map文件。在.map文件里面我們可以詳細的查看flash空間用了多少,一些全局變量和函數(shù)被分配到了flash的什么區(qū)域。3. 鏈接以后鏈接器生成的一些文件,可以根據(jù)需要進一步轉(zhuǎn)換為其他文件,例如給IAR的調(diào)試器,方便我們進行調(diào)試. 或者調(diào)用其他外部轉(zhuǎn)換器,轉(zhuǎn)為其他我們所想要格式的燒錄文件。3.2. 如何將Bootloader和Main APP放入特定flash段LINK鏈接器是按照用戶在ICF文件中的規(guī)定來放置sections的,所以理解ICF文件的內(nèi)容尤其重要。一個標準的ICF文件可包括下面這些內(nèi)容:- 可編址的

11、存儲空間(memory)- 不同的存儲器地址區(qū)域(region)- 不同的地址塊(block)- Section的初始化與否- Section在存儲空間中的放置默認情況下IAR根據(jù)Device類別自動選取對應(yīng)的icf文件,也可以根據(jù)需要選定自己寫的icf文件,設(shè)置方法如下:Option Linker,選取自定義文件所以我們需要分別為bootloader和main APP準備icf文件,里面定義的flash地址需要錯開,RAM空間可以共用。下面是兩個文件的部分對比,詳細的內(nèi)容請參見bootloader和main APP工程下的Linker文件夾。3.3. Main APP和Bootloader間

12、的切換和識別3.3.1. Main APPBooloaderMain APP切換到Bootloader的情形為,Main APP接收到燒錄命令,需要跳轉(zhuǎn)到Bootloader,然后由bootloader擦除Main APP的flash空間。所以這里存在兩個問題:1. Main APP如何跳轉(zhuǎn)到Bootloader2. Bootloader怎么分辨是從Main APP跳入的,而不是系統(tǒng)硬復(fù)位對于第一個問題,簡單的來說,就是收到燒錄指令后,我們?nèi)藶榈刈尦绦蜻M入Bootloader的flash首地址存儲的地址中去。Bootloader中的flash開頭存放的是中斷向量表,PC跳到首地址以后,CPU會

13、先取2個地址,第一個是棧頂?shù)刂?,第二個是復(fù)位異常地址,然后執(zhí)行復(fù)位初始化函數(shù)以后,轉(zhuǎn)入執(zhí)行bootloader的main函數(shù)。如此便開始執(zhí)行bootloader。第二問題,我們在ifc文件中定義一段RAM空間,屬性為不需要初始化。正常來說,只要發(fā)生復(fù)位,不管是硬復(fù)位還是軟復(fù)位,那么RAM區(qū)域都會初始化為0(跳入Main函數(shù)前的匯編代碼中)。但是如果我們在icf文件中設(shè)定為不需要初始化,那么則會跳過這段區(qū)域的初始化。所以在跳轉(zhuǎn)之前,我們將這片RAM區(qū)更新為某個特定的值,那么Bootloader開始階段,以此判斷即可。icf程序3.3.2. BooloaderMain APP類似的,所以這里也存在

14、兩個問題:1. Bootloader如何跳轉(zhuǎn)到Main APP2. Bootloader怎么分辨flash中已經(jīng)有Main APP第一個問題與3.3.1描述的類似,不再重復(fù)。第二個問題也需要利用icf文件。教程里面用的方法是,在flash地址最末尾預(yù)留出一小段,存放特定的字符串。之所以放在末尾,是因為這段地址最后更新,如果能檢測到,說明之前的地址已經(jīng)燒錄了Main APP。icf程序3.4. 如何解析燒錄文件有了前面的準備,我們可以準備工程并且通過工程配置生成Intel Hex格式燒錄文件。Intel HEX 文件是遵循 Intel HEX 文件格式的 ASCII 文本文件。在 Intel H

15、EX 文件的每一行都包含了一個 HEX 記錄。這些記錄是由一些代表機器語言代碼和常量的16進制數(shù)據(jù)組成的。Intel HEX 文件常用來傳輸要存儲在 ROM 或者 EPROM 中的程序和數(shù)據(jù)。每個記錄包含5個域,它們按以下格式排列:Start Code 每個 Intel HEX 記錄都由冒號開頭Byte count 是數(shù)據(jù)長度域,它代表記錄當中數(shù)據(jù)字節(jié)的數(shù)量Address 是地址域,它代表記錄當中數(shù)據(jù)的起始地址Record type 是代表HEX記錄類型的域,它可能是以下數(shù)據(jù)當中的一個:00-數(shù)據(jù)記錄01-文件結(jié)束記錄02-擴展段地址記錄03-開始段地址記錄04-擴展線性地址記錄05-開始線性

16、地址記錄Data 是數(shù)據(jù)域,一個記錄可以有許多數(shù)據(jù)字節(jié).記錄當中數(shù)據(jù)字節(jié)的數(shù)量必須和數(shù)據(jù)長度域中指定的數(shù)字相符Checksum 是校驗和域,它表示這個記錄的校驗和.校驗和的計算是通過將記錄當中所有十六進制編碼數(shù)字對的值相加,以256為模進行以下補足。下圖是我們此次例程生成的hex文件截圖,大家可以對照著看看:通過上面的說明,我們就可以設(shè)計程序在接收到串口數(shù)據(jù)以后進行解析。需要注意的是,Intel Hex是ASCII 文本文件,在燒錄前需要轉(zhuǎn)下格式。舉個例子,同樣表示0x12,ASCII會將1和2分別拆分為字符“1”和“2”進行傳送,所以接收端要將其重新整合為0x12。3.5. 如何利用超級終端

17、發(fā)送燒錄文件超級終端估計大家平時比較少用到,我們可以認為它就是一個特殊版本的串口工具。之所以本次使用它,是因為這個軟件有發(fā)送文本文件的功能,并且可以設(shè)置行延遲,即每發(fā)送完一行數(shù)據(jù)以后,可以根據(jù)設(shè)定延遲x ms后再發(fā)送下一行。如此Bootloader就有時間去處理數(shù)據(jù)了。當然,如果大家學(xué)有余力且懂得MFC或者VB編程的話,可以自己寫個上位機。使用步驟如下:- 新建連接,名稱隨便。我習(xí)慣以串口號+波特率方式進行命名:- 選擇你的串口號- 設(shè)置波特率等。注意:數(shù)據(jù)流控制記得選 無:- 然后繼續(xù)配置屬性,行延遲這里設(shè)定為200ms,其實也可以選擇快一點。但是為了驗證燒錄是否正確,stm8s程序加入了測

18、試指令,每燒錄一行數(shù)據(jù),也會向超級終端回發(fā)flash數(shù)據(jù),這個需要200ms才能確保不被打斷。- 一切就緒就可以選擇實際的文本文件發(fā)送數(shù)據(jù)給開發(fā)板了另外為了讓stm8s知道什么時候開始擦除以及燒錄結(jié)束,我們需要給hex文件做個小改動。我們規(guī)定,如果stm8s收到字符串“flash”表示燒錄開始,需要擦除Main APP flash空間;如果收到字符串“end”,則表示燒錄結(jié)束,可以reset了。4. 工程介紹為了驗證燒錄是否ok,此次課程有三個工程,一個自然是bootloader,LED每100ms閃爍以此,一個是以500ms閃爍的Main APP,第三個是以2s閃爍的Main APP。大家就可以明確地感受是否正常燒錄進去對應(yīng)的Main APP了。Bootloader主程序示意圖如下所示:Main APP主程序示意圖:具體細節(jié)可以查看代碼,都有很詳細的注釋了,詳細大家都能看懂。5. 問題匯總和后續(xù)改進注意事項和總結(jié):1. Stm8s雖然支持中斷向量表重映射,但是bootloader和APP似乎一次只能有一個能使能中斷,用遠跳轉(zhuǎn)的方式會有問題。有興趣的可以深入研

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論