串口IAP實驗成功版(共16頁)_第1頁
串口IAP實驗成功版(共16頁)_第2頁
串口IAP實驗成功版(共16頁)_第3頁
串口IAP實驗成功版(共16頁)_第4頁
串口IAP實驗成功版(共16頁)_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四十八章串口IAP實驗(shyn)IAP,即在應用(yngyng)編程。很多單片機都支持這個功能,STM32也不例外(lwi)。在之前的FLASH模擬EEPROM實驗里面,我們學習了STM32的FLASH自編程,本章我們將結(jié)合FLASH自編程的知識,通過STM32的串口實現(xiàn)一個簡單的IAP功能。fficeffice /48.1IAP簡介IAP(In Application Programming)即在應用編程,IAP是用戶自己的程序在運行過程中對User Flash的部分區(qū)域進行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預留的通信口對產(chǎn)品中的固件程序進行更新升級。通常實現(xiàn)IAP功能時,即用戶

2、程序運行中作自身的更新操作,需要在設計固件程序時編寫兩個項目代碼,第一個項目程序不執(zhí)行正常的功能操作,而只是通過某種通信方式(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對第二部分代碼的更新;第二個項目代碼才是真正的功能代碼。這兩部分項目代碼都同時燒錄在User Flash中,當芯片上電后,首先是第一個項目代碼開始運行,它作如下操作:1)檢查是否需要對第二部分代碼進行更新2)如果不需要更新則轉(zhuǎn)到4)3)執(zhí)行更新操作4)跳轉(zhuǎn)到第二部分代碼執(zhí)行第一部分代碼必須通過其它手段,如JTAG或ISP燒入;第二部分代碼可以使用第一部分代碼IAP功能燒入,也可以和第一部分代碼一起燒入,以后需要程序更新是再通過第

3、一部分IAP代碼更新。我們將第一個項目代碼稱之為Bootloader程序,第二個項目代碼稱之為APP程序,他們存放在STM32 FLASH的不同地址范圍,一般從最低地址區(qū)開始存放Bootloader,緊跟其后的就是APP程序(注意,如果FLASH容量足夠,是可以設計很多APP程序的,本章我們只討論一個APP程序的情況)。這樣我們就是要實現(xiàn)2個程序:Bootloader和APP。STM32的APP程序不僅可以放到FLASH里面運行,也可以放到SRAM里面運行,本章,我們將制作兩個APP,一個用于FLASH運行,一個用于SRAM運行。我們先來看看STM32正常的程序運行流程,如圖48.1.1所示:

4、圖48.1.1 STM32正常(zhngchng)運行流程圖STM32的內(nèi)部(nib)閃存(FLASH)地址(dzh)起始于0 x08000000,一般情況下,程序文件就從此地址開始寫入。此外STM32是基于Cortex-M3內(nèi)核的微控制器,其內(nèi)部通過一張“中斷向量表”來響應中斷,程序啟動后,將首先從“中斷向量表”取出復位中斷向量執(zhí)行復位中斷程序完成啟動,而這張“中斷向量表”的起始地址是0 x08000004,當中斷來臨,STM32的內(nèi)部硬件機制亦會自動將PC指針定位到“中斷向量表”處,并根據(jù)中斷源取出對應的中斷向量執(zhí)行中斷服務程序。在圖48.1.1中,STM32在復位后,先從0X080000

5、04地址取出復位中斷向量的地址,并跳轉(zhuǎn)到復位中斷服務程序,如圖標號所示;在復位中斷服務程序執(zhí)行完之后,會跳轉(zhuǎn)到我們的main函數(shù),如圖標號所示;而我們的main函數(shù)一般都是一個死循環(huán),在main函數(shù)執(zhí)行過程中,如果收到中斷請求(發(fā)生重中斷),此時STM32強制將PC指針指回中斷向量表處,如圖標號所示;然后,根據(jù)中斷源進入相應的中斷服務程序,如圖標號所示;在執(zhí)行完中斷服務程序以后,程序再次返回main函數(shù)執(zhí)行,如圖標號所示。當加入IAP程序之后,程序運行流程如圖48.1.2所示:在圖48.1.2所示流程(lichng)中,STM32復位(f wi)后,還是從0X08000004地址取出復位(f

6、wi)中斷向量的地址,并跳轉(zhuǎn)到復位中斷服務程序,在運行完復位中斷服務程序之后跳轉(zhuǎn)到IAP的main函數(shù),如圖標號所示,此部分同圖48.1.1一樣;在執(zhí)行完IAP以后(即將新的APP代碼寫入STM32的FLASH,灰底部分。新程序的復位中斷向量起始地址為0X08000004+N+M),跳轉(zhuǎn)至新寫入程序的復位向量表,取出新程序的復位中斷向量的地址,并跳轉(zhuǎn)執(zhí)行新程序的復位中斷服務程序,隨后跳轉(zhuǎn)至新程序的main函數(shù),如圖標號和所示,同樣main函數(shù)為一個死循環(huán),并且注意到此時STM32的FLASH,在不同位置上,共有兩個中斷向量表。在main函數(shù)執(zhí)行過程(guchng)中,如果CPU得到(d do)

7、一個中斷請求,PC指針(zhzhn)仍強制跳轉(zhuǎn)到地址0X08000004中斷向量表處,而不是新程序的中斷向量表,如圖標號所示;程序再根據(jù)我們設置的中斷向量表偏移量,跳轉(zhuǎn)到對應中斷源新的中斷服務程序中,如圖標號所示;在執(zhí)行完中斷服務程序后,程序返回main函數(shù)繼續(xù)運行,如圖標號所示。通過以上兩個過程的分析,我們知道IAP程序必須滿足兩個要求:1)新程序必須在IAP程序之后的某個偏移量為x的地址開始;2)必須將新程序的中斷向量表相應的移動,移動的偏移量為x;本章,我們有2個APP程序,一個為FLASH的APP,程序在FLASH中運行,另外一個位SRAM的APP,程序運行在SRAM中,圖48.1.2

8、雖然是針對FLASH APP來說的,但是在SRAM里面運行的過程和FLASH基本一致,只是需要設置向量表的地址為SRAM的地址。1.APP程序起始地址設置方法隨便打開一個之前的實例工程,點擊Options for TargetTarget選項卡,如圖48.1.3所示:圖48.1.3 FLASH APP Target選項卡設置默認的條件下,圖中IROM1的起始地址(Start)一般為0X08000000,大?。⊿ize)為0X80000,即從0X08000000開始的512K空間為我們的程序存儲(因為我們的STM32F103ZET6的FLASH大小是512K)。而圖中,我們設置起始地址(Star

9、t)為0X08010000,即偏移量為0X10000(64K字節(jié)),因而,留給APP用的FLASH空間(Size)只有0X80000-0X10000=0X70000(448K字節(jié))大小了。設置好Start和Szie,就完成APP程序的起始地址設置。這里(zhl)的64K字節(jié),需要(xyo)大家根據(jù)Bootloader程序大小(dxio)進行選擇,比如我們本章的Bootloader程序為22K左右,理論上我們只需要確保APP起始地址在Bootloader之后,并且偏移量為0X200的倍數(shù)即可(相關(guān)知識,請參考: HYPERLINK /posts/list/392.htm /posts/list/

10、392.htm)。這里我們選擇64K(0X10000)字節(jié),留了一些余量,方便Bootloader以后的升級修改。這是針對FLASH APP的起始地址設置,如果是SRAM APP,那么起始地址設置如圖48.1.4所示:圖48.1.4 SRAM APP Target選項卡設置這里我們將IROM1的起始地址(Start)定義為:0X20001000,大小為0XA000(40K字節(jié)),即從地址0X20000000偏移0X1000開始,存放APP代碼。因為整個STM32F103ZET6的SRAM大小為64K字節(jié),所以IRAM1(SRAM)的起始地址變?yōu)?X2000B000(0 x20001000+0

11、xA000=0X2000B000),大小只有0X5000(20K字節(jié))。這樣,整個STM32F103ZET6的SRAM分配情況為:最開始的4K給Bootloader程序使用,隨后的40K存放APP程序,最后20K,用作APP程序的內(nèi)存。這個分配關(guān)系大家可以根據(jù)自己的實際情況修改,不一定和我們這里的設置一模一樣,不過也需要注意,保證偏移量為0X200的倍數(shù)(我們這里為0X1000)。2.中斷向量表的偏移(pin y)量設置(shzh)方法(fngf)之前我們講解過,在系統(tǒng)啟動的時候,會首先調(diào)用systemInit函數(shù)初始化時鐘系統(tǒng),同時systemInit還完成了中斷向量表的設置,我們可以打開s

12、ystemInit函數(shù),看看函數(shù)體的結(jié)尾處有這樣幾行代碼:#ifdef VECT_TAB_SRAMSCB-VTOR = SRAM_BASE | VECT_TAB_OFFSET;/* Vector Table Relocation in Internal SRAM. */#elseSCB-VTOR = FLASH_BASE | VECT_TAB_OFFSET;/* Vector Table Relocation in Internal FLASH. */#endif從代碼可以理解,VTOR寄存器存放的是中斷向量表的起始地址。默認的情況VECT_TAB_SRAM是沒有定義,所以執(zhí)行SCB-VTOR

13、 = FLASH_BASE | VECT_TAB_OFFSET;對于FLASH APP,我們設置為FLASH_BASE+偏移量0 x10000,所以我們可以在FLASH APP的main函數(shù)最開頭處添加如下代碼實現(xiàn)中斷向量表的起始地址的重設:SCB-VTOR = FLASH_BASE | 0 x10000;以上是FLASH APP的情況,當使用SRAM APP的時候,我們設置起始地址為:SRAM_bASE+0 x1000,同樣的方法,我們在SRAM APP的main函數(shù)最開始處,添加下面代碼:SCB-VTOR = SRAM_BASE | 0 x1000;這樣,我們就完成了中斷向量表偏移量的設置

14、。通過以上兩個步驟的設置,我們就可以生成APP程序了,只要APP程序的FLASH和SRAM大小不超過我們的設置即可。不過MDK默認生成的文件是.hex文件,并不方便我們用作IAP更新,我們希望生成的文件是.bin文件,這樣可以方便進行IAP升級(至于為什么,請大家自行百度HEX和BIN文件的區(qū)別?。?。這里我們通過MDK自帶的格式轉(zhuǎn)換工具fromelf.exe,來實現(xiàn).axf文件到.bin文件的轉(zhuǎn)換。該工具在MDK的安裝目錄ARMBIN40文件夾里面。fromelf.exe轉(zhuǎn)換工具的語法格式為:fromelf options input_file。其中options有很多選項可以設置,詳細使用請

15、參考光盤mdk如何生成bin文件.pdf.本章,我們通過在MDK點擊Options for TargetUser選項卡,在Run User Programs After Build/Rebuild欄,勾選Run#1和DOS16,并寫入:D:Keil3.80aARMBIN40fromelf.exe-bin -o.OBJTEST.bin .OBJTEST.axf,如圖48.1.6所示:通過這一步設置,我們(w men)就可以在MDK編譯成功之后(zhhu),調(diào)用fromelf.exe(注意(zh y),我的MDK是安裝在D:Keil3.80A文件夾下,如果你是安裝在其他目錄,請根據(jù)你自己的目錄修改

16、fromelf.exe的路徑),根據(jù)當前工程的TEST.axf(如果是其他的名字,請記住修改,這個文件存放在OBJ目錄下面,格式為xxx.axf),生成一個TEST.bin的文件。并存放在axf文件相同的目錄下,即工程的OBJ文件夾里面。在得到.bin文件之后,我們只需要將這個bin文件傳送給單片機,即可執(zhí)行IAP升級。最后再來APP程序的生成步驟:1)設置APP程序的起始地址和存儲空間大小對于在FLASH里面運行的APP程序,我們可以按照圖48.1.3的設置。對于SRAM里面運行的APP程序,我們可以參考圖48.1.4的設置。2)設置中斷向量表偏移量這一步按照上面講解,重新設置SCB-VTO

17、R的值即可。3)設置編譯后運行fromelf.exe,生成.bin文件.通過在User選項卡,設置編譯后調(diào)用fromelf.exe,根據(jù).axf文件生成.bin文件,用于IAP更新。以上(yshng)3個步驟,我們就可以(ky)得到一個.bin的APP程序(chngx),通過Bootlader程序即可實現(xiàn)更新。大家可以打開我們光盤的兩個APP工程,熟悉這些設置。48.2硬件設計本章實驗(Bootloader部分)功能簡介:開機的時候先顯示提示信息,然后等待串口輸入接收APP程序(無校驗,一次性接收),在串口接收到APP程序之后,即可執(zhí)行IAP。如果是SRAM APP,通過按下KEY0即可執(zhí)行這

18、個收到的SRAM APP程序。如果是FLASH APP,則需要先按下WK_UP按鍵,將串口接收到的APP程序存放到STM32的FLASH,之后再按KEY2既可以執(zhí)行這個FLASH APP程序。通過KEY1按鍵,可以手動清除串口接收到的APP程序。DS0用于指示程序運行狀態(tài)。本實驗用到的資源如下:1)指示燈DS02)四個按鍵(KEY0/KEY1/KEY2/WK_UP)3)串口4)TFTLCD模塊這些用到的硬件,我們在之前都已經(jīng)介紹過,這里就不再介紹了。48.3軟件設計本章,我們總共需要3個程序:1,Bootloader;2,F(xiàn)LASH APP;3)SRAM APP;其中,我們選擇之前做過的RTC

19、實驗(在第二十章介紹)來做為FLASH APP程序(起始地址為0X08010000),選擇觸摸屏實驗(在第三十一章介紹)來做SRAM APP程序(起始地址為0X20001000)。Bootloader則是通過TFTLCD顯示實驗(在第十八章介紹)修改得來。本章,關(guān)于SRAM APP和FLASH APP的生成比較簡單,我們就不細說,請大家結(jié)合光盤源碼,以及48.1節(jié)的介紹,自行理解。本章軟件設計僅針對Bootloader程序。打開本實驗工程,可以看到我們增加了IAP組,在組下面添加了iap.c文件以及其頭文件isp.h。打開iap.c,代碼如下:#include sys.h#include delay.h#include usart.h#include stmflash.h#include iap.hiapfun jump2app;u16 iapbuf1024;/appxaddr:應用程序的起始地址/appbuf:應用程序CODE./

溫馨提示

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

評論

0/150

提交評論