基于STM32的IAP設(shè)計(jì)文檔_第1頁(yè)
基于STM32的IAP設(shè)計(jì)文檔_第2頁(yè)
基于STM32的IAP設(shè)計(jì)文檔_第3頁(yè)
基于STM32的IAP設(shè)計(jì)文檔_第4頁(yè)
基于STM32的IAP設(shè)計(jì)文檔_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、.1Bootloader+3App TOC o 1-3 h z u HYPERLINK l _Toc3616705341 簡(jiǎn)介 PAGEREF _Toc361670534 h 2HYPERLINK l _Toc3616705352 Bootloader實(shí)現(xiàn)原理 PAGEREF _Toc361670535 h 2HYPERLINK l _Toc3616705363 APP實(shí)現(xiàn)與配置 PAGEREF _Toc361670536 h 2HYPERLINK l _Toc3616705373.1 APP1程序起始地址設(shè)置方法 PAGEREF _Toc361670537 h 2HYPERLINK l _T

2、oc3616705383.2 中斷向量表的偏移量設(shè)置 PAGEREF _Toc361670538 h 2HYPERLINK l _Toc3616705393.3 *bin文件生成 PAGEREF _Toc361670539 h 2HYPERLINK l _Toc3616705403.4 步驟總結(jié) PAGEREF _Toc361670540 h 2HYPERLINK l _Toc3616705414 關(guān)鍵點(diǎn) PAGEREF _Toc361670541 h 2HYPERLINK l _Toc361670542: PAGEREF _Toc361670542 h 21 簡(jiǎn)介IAPIn Applicat

3、ion Programming即在應(yīng)用編程,IAP是用戶自己的程序在運(yùn)行過(guò)程中對(duì)User Flash的局部區(qū)域進(jìn)展燒寫(xiě),目的是為了在產(chǎn)品發(fā)布后可以方便地通過(guò)預(yù)留的通信口對(duì)產(chǎn)品中的固件程序進(jìn)展更新升級(jí)。通常實(shí)現(xiàn)IAP功能時(shí),即用戶程序運(yùn)行中作自身的更新操作,需要在設(shè)計(jì)固件程序時(shí)編寫(xiě)兩個(gè)工程代碼,第一個(gè)工程程序不執(zhí)行正常的功能操作,而只是通過(guò)*種通信方式(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對(duì)第二局部代碼的更新;第二個(gè)工程代碼才是真正的功能代碼。這兩局部工程代碼都同時(shí)燒錄在User Flash中,當(dāng)芯片上電后,首先是第一個(gè)工程代碼開(kāi)場(chǎng)運(yùn)行,它作如下操作:1檢查是否需要對(duì)第二局部代碼進(jìn)展更新2

4、如果不需要更新則轉(zhuǎn)到43執(zhí)行更新操作4跳轉(zhuǎn)到第二局部代碼執(zhí)行第一局部代碼必須通過(guò)其它手段,如JTAG或ISP燒入;第二局部代碼可以使用第一局部代碼IAP功能燒入,也可以和第一局部代碼一起燒入,以后需要程序更新是再通過(guò)第一局部IAP代碼更新。我們將第一個(gè)工程代碼稱(chēng)之為Bootloader程序,第二個(gè)工程代碼稱(chēng)之為APP程序,他們存放在STM32 FLASH的不同地址圍,一般從最低地址區(qū)開(kāi)場(chǎng)存放Bootloader,緊跟其后的就是APP程序注意,如果FLASH容量足夠,是可以設(shè)計(jì)很多APP程序的,本章我們討論3個(gè)APP程序的情況。這樣我們就是要實(shí)現(xiàn)4個(gè)程序:Bootloader和3個(gè)APP。2 B

5、ootloader實(shí)現(xiàn)原理我們先來(lái)看看STM32正常的程序運(yùn)行流程,如圖2.1所示:圖2.1 STM32正常運(yùn)行流程圖STM32的部閃存FLASH地址起始于0*08000000,一般情況下,程序文件就從此地址開(kāi)場(chǎng)寫(xiě)入。此外STM32是基于Corte*-M3核的微控制器,其部通過(guò)一“中斷向量表來(lái)響應(yīng)中斷,程序啟動(dòng)后,將首先從“中斷向量表取出復(fù)位中斷向量執(zhí)行復(fù)位中斷程序完成啟動(dòng),而這“中斷向量表的起始地址是0*08000004,當(dāng)中斷降臨,STM32的部硬件機(jī)制亦會(huì)自動(dòng)將PC指針定位到“中斷向量表處,并根據(jù)中斷源取出對(duì)應(yīng)的中斷向量執(zhí)行中斷效勞程序。在圖2.1中,STM32在復(fù)位后,先從0*0800

6、0004地址取出復(fù)位中斷向量的地址,并跳轉(zhuǎn)到復(fù)位中斷效勞程序,如圖標(biāo)號(hào)所示;在復(fù)位中斷效勞程序執(zhí)行完之后,會(huì)跳轉(zhuǎn)到我們的main函數(shù),如圖標(biāo)號(hào)所示;而我們的main函數(shù)一般都是一個(gè)死循環(huán),在main函數(shù)執(zhí)行過(guò)程中,如果收到中斷請(qǐng)求發(fā)生重中斷,此時(shí)STM32強(qiáng)制將PC指針指回中斷向量表處,如圖標(biāo)號(hào)所示;然后,根據(jù)中斷源進(jìn)入相應(yīng)的中斷效勞程序,如圖標(biāo)號(hào)所示;在執(zhí)行完中斷效勞程序以后,程序再次返回main函數(shù)執(zhí)行,如圖標(biāo)號(hào)所示。當(dāng)參加IAP程序之后,程序運(yùn)行流程如圖2.2所示:圖2.2 參加IAP之后程序運(yùn)行流程圖在圖2.2所示流程中,STM32復(fù)位后,還是從0*08000004地址取出復(fù)位中斷向量

7、的地址,并跳轉(zhuǎn)到復(fù)位中斷效勞程序,在運(yùn)行完復(fù)位中斷效勞程序之后跳轉(zhuǎn)到IAP的main函數(shù),如圖標(biāo)號(hào)所示,此局部同圖2.1一樣;在執(zhí)行完IAP以后即將新的APP代碼寫(xiě)入STM32的FLASH,灰底局部。新程序的復(fù)位中斷向量起始地址為0*08000004+N+M,跳轉(zhuǎn)至新寫(xiě)入程序的復(fù)位向量表,取出新程序的復(fù)位中斷向量的地址,并跳轉(zhuǎn)執(zhí)行新程序的復(fù)位中斷效勞程序,隨后跳轉(zhuǎn)至新程序的main函數(shù),如圖標(biāo)號(hào)和所示,同樣main函數(shù)為一個(gè)死循環(huán),并且注意到此時(shí)STM32的FLASH,在不同位置上,共有兩個(gè)中斷向量表。在main函數(shù)執(zhí)行過(guò)程中,如果CPU得到一個(gè)中斷請(qǐng)求,PC指針仍強(qiáng)制跳轉(zhuǎn)到地址0*08000

8、004中斷向量表處,而不是新程序的中斷向量表,如圖標(biāo)號(hào)所示;程序再根據(jù)我們?cè)O(shè)置的中斷向量表偏移量,跳轉(zhuǎn)到對(duì)應(yīng)中斷源新的中斷效勞程序中,如圖標(biāo)號(hào)所示;在執(zhí)行完中斷效勞程序后,程序返回main函數(shù)繼續(xù)運(yùn)行,如圖標(biāo)號(hào)所示。通過(guò)以上兩個(gè)過(guò)程的分析,我們知道IAP程序必須滿足兩個(gè)要求:1新程序必須在IAP程序之后的*個(gè)偏移量為*的地址開(kāi)場(chǎng);2必須將新程序的中斷向量表相應(yīng)的移動(dòng),移動(dòng)的偏移量為*;3 APP實(shí)現(xiàn)與配置本章設(shè)計(jì)3個(gè)APP的情況,因?yàn)榫褪欠峙涞膄lash扇區(qū)不同,所以就舉例其中的一個(gè)。3.1 APP1程序起始地址設(shè)置方法隨便翻開(kāi)一個(gè)之前的實(shí)例工程,點(diǎn)擊Options for TargetTar

9、get選項(xiàng)卡,如圖3.1所示:圖3.1 FLASH APP1 Target選項(xiàng)卡設(shè)置默認(rèn)的條件下,圖中IROM1的起始地址Start一般為0*08000000,大小Size為0*80000,即從0*08000000開(kāi)場(chǎng)的512K空間為我們的程序存儲(chǔ)。而圖中,我們?cè)O(shè)置起始地址Start為0*08010000,即偏移量為0*1000064K字節(jié),因而,留給APP用的FLASH空間Size只有0*80000-0*10000=0*70000448K字節(jié)大小了。設(shè)置好Start和Szie,就完成APP1程序的起始地址設(shè)置。APP2則為0*08020000+0*60000;App3則為0*08030000

10、+0*50000;其實(shí)就是為每個(gè)app程序分配了4k的空間。3.2 中斷向量表的偏移量設(shè)置之前我們講解過(guò),在系統(tǒng)啟動(dòng)的時(shí)候,會(huì)首先調(diào)用systemInit函數(shù)初始化時(shí)鐘系統(tǒng),同時(shí)systemInit還完成了中斷向量表的設(shè)置,我們可以翻開(kāi)systemInit函數(shù),看看函數(shù)體的結(jié)尾處有這樣幾行代碼:*ifdef VECT_TAB_SRAMSCB-VTOR = SRAM_BASE | VECT_TAB_OFFSET;/* Vector Table Relocation in Internal SRAM. */*elseCB-VTOR = FLASH_BASE | VECT_TAB_OFFSET; /

11、* Vector Table Relocation in Internal FLASH. */*endif從代碼可以理解,VTOR存放器存放的是中斷向量表的起始地址。默認(rèn)的情況VECT_TAB_SRAM是沒(méi)有定義,所以執(zhí)行SCB-VTOR = FLASH_BASE | VECT_TAB_OFFSET; 對(duì)于FLASH APP,我們?cè)O(shè)置為FLASH_BASE+偏移量0*10000,所以我們可以在FLASH APP的main函數(shù)最開(kāi)頭處添加如下代碼實(shí)現(xiàn)中斷向量表的起始地址的重設(shè):SCB-VTOR = FLASH_BASE | 0*10000;如果是APP2可以設(shè)置為SCB-VTOR = FLASH

12、_BASE | 0*20000;如果是APP3可以設(shè)置為SCB-VTOR = FLASH_BASE | 0*30000;這樣,我們就完成了中斷向量表偏移量的設(shè)置。3.3 *bin文件生成不過(guò)MDK默認(rèn)生成的文件是.he*文件,并不方便我們用作IAP更新,我們希望生成的文件是.bin文件,這樣可以方便進(jìn)展IAP升級(jí)。這里我們通過(guò)MDK自帶的格式轉(zhuǎn)換工具fromelf.e*e,來(lái)實(shí)現(xiàn).a*f文件到.bin文件的轉(zhuǎn)換。該工具在MDK的安裝目錄ARMBIN40文件夾里面。本章,我們通過(guò)在MDK點(diǎn)擊Options for TargetUser選項(xiàng)卡,在Run User Programs After Bu

13、ild/Rebuild 欄,勾選Run*1和DOS16,并寫(xiě)入:D:Keil3.80aARMBIN40fromelf.e*e -bin -o .OBJTEST.bin .OBJTEST.a*f,如圖3.2所示:圖3.2 *bin文件生成設(shè)置通過(guò)這一步設(shè)置,我們就可以在MDK編譯成功之后,調(diào)用fromelf.e*e注意,我的MDK是安裝在D:Keil3.80A文件夾下,如果你是安裝在其他目錄,請(qǐng)根據(jù)你自己的目錄修改fromelf.e*e的路徑,根據(jù)當(dāng)前工程的TEST.a*f如果是其他的名字,請(qǐng)記住修改,這個(gè)文件存放在OBJ目錄下面,格式為*.a*f,生成一個(gè)TEST.bin的文件。并存放在a*f

14、文件一樣的目錄下,即工程的OBJ文件夾里面。在得到.bin文件之后,我們只需要將這個(gè)bin文件傳送給單片機(jī),即可執(zhí)行IAP升級(jí)。3.4 步驟總結(jié)1設(shè)置APP程序的起始地址和存儲(chǔ)空間大小2設(shè)置中斷向量表偏移量3設(shè)置編譯后運(yùn)行fromelf.e*e,生成.bin文件. 4 關(guān)鍵點(diǎn)1 IAP程序必須滿足兩個(gè)要求:1.新程序必須在IAP程序之后的*個(gè)偏移量為*的地址開(kāi)場(chǎng);2.必須將新程序的中斷向量表相應(yīng)的移動(dòng),移動(dòng)的偏移量為*;2STM32是按照半字讀寫(xiě)數(shù)據(jù)到FLASH里面,所以串口收發(fā)數(shù)據(jù)時(shí),必須設(shè)置一個(gè)收發(fā)完成標(biāo)志,只有數(shù)據(jù)全部承受前方可執(zhí)行更新。而且接收完成到收發(fā)數(shù)據(jù)之間也必須設(shè)置一個(gè)延時(shí)才行。

15、3必須先更新后執(zhí)行,程序中相應(yīng)的設(shè)置一個(gè)標(biāo)志位。Flag。重點(diǎn):一定要為每個(gè)app分配好偏移地址。/保存0*080000000*0800FFFF的空間為IAP使用*define FLASH_APP1_ADDR0*08010000 /第一個(gè)應(yīng)用程序起始地址(存放在FLASH)*define FLASH_APP2_ADDR0*08020000/第二個(gè)應(yīng)用程序起始地址(存放在FLASH)*define FLASH_APP3_ADDR0*08030000/第三個(gè)應(yīng)用程序起始地址(存放在FLASH):函數(shù)一:寫(xiě)入指定起始地址的FLASH空間/app*addr:應(yīng)用程序的起始地址/appbuf:應(yīng)用程序C

16、ODE./appsize:應(yīng)用程序大小(字節(jié)).void iap_write_appbin(u32 app*addr,u8 *appbuf,u32 appsize)u16 t;u16 i=0;u16 temp;u32 fwaddr=app*addr;/當(dāng)前寫(xiě)入的地址u8 *dfu=appbuf;for(t=0;tappsize;t+=2) temp=(u16)dfu18;temp+=(u16)dfu0; dfu+=2;/偏移2個(gè)字節(jié)iapbufi+=temp; if(i=1024)i=0;STMFLASH_Write(fwaddr,iapbuf,1024);fwaddr+=2048;/偏移20

17、48 16=2*8.所以要乘以2.if(i)STMFLASH_Write(fwaddr,iapbuf,i);/將最后的一些容字節(jié)寫(xiě)進(jìn)去. 函數(shù)二:跳轉(zhuǎn)執(zhí)行FLASH/跳轉(zhuǎn)到應(yīng)用程序段/app*addr:用戶代碼起始地址.void iap_load_app(u32 app*addr) if(*(vu32*)app*addr)&0*2FFE0000)=0*20000000)/檢查棧頂?shù)刂肥欠窈戏? jump2app=(iapfun)*(vu32*)(app*addr+4);/用戶代碼區(qū)第二個(gè)字為程序開(kāi)場(chǎng)地址(復(fù)位地址)MSR_MSP(*(vu32*)app*addr);/初始化APP堆棧指針(用戶代碼區(qū)的第一個(gè)字用于存放棧頂?shù)刂?jump2app();/跳轉(zhuǎn)到APP.函數(shù)三:串口中斷效勞函數(shù)if(USART_GetITStatus(USART1, USART_IT_R*NE) != RESET)/接收到數(shù)據(jù) /USART

溫馨提示

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

評(píng)論

0/150

提交評(píng)論