版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.1Bootloader+3App TOC o 1-3 h z u HYPERLINK l _Toc3616705341 簡介 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 簡介IAPIn Applicat
3、ion Programming即在應(yīng)用編程,IAP是用戶自己的程序在運(yùn)行過程中對(duì)User Flash的局部區(qū)域進(jìn)展燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預(yù)留的通信口對(duì)產(chǎn)品中的固件程序進(jìn)展更新升級(jí)。通常實(shí)現(xiàn)IAP功能時(shí),即用戶程序運(yùn)行中作自身的更新操作,需要在設(shè)計(jì)固件程序時(shí)編寫兩個(gè)工程代碼,第一個(gè)工程程序不執(zhí)行正常的功能操作,而只是通過*種通信方式(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對(duì)第二局部代碼的更新;第二個(gè)工程代碼才是真正的功能代碼。這兩局部工程代碼都同時(shí)燒錄在User Flash中,當(dāng)芯片上電后,首先是第一個(gè)工程代碼開場運(yùn)行,它作如下操作:1檢查是否需要對(duì)第二局部代碼進(jìn)展更新2
4、如果不需要更新則轉(zhuǎn)到43執(zhí)行更新操作4跳轉(zhuǎn)到第二局部代碼執(zhí)行第一局部代碼必須通過其它手段,如JTAG或ISP燒入;第二局部代碼可以使用第一局部代碼IAP功能燒入,也可以和第一局部代碼一起燒入,以后需要程序更新是再通過第一局部IAP代碼更新。我們將第一個(gè)工程代碼稱之為Bootloader程序,第二個(gè)工程代碼稱之為APP程序,他們存放在STM32 FLASH的不同地址圍,一般從最低地址區(qū)開場存放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)原理我們先來看看STM32正常的程序運(yùn)行流程,如圖2.1所示:圖2.1 STM32正常運(yùn)行流程圖STM32的部閃存FLASH地址起始于0*08000000,一般情況下,程序文件就從此地址開場寫入。此外STM32是基于Corte*-M3核的微控制器,其部通過一“中斷向量表來響應(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í)行過程中,如果收到中斷請(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代碼寫入STM32的FLASH,灰底局部。新程序的復(fù)位中斷向量起始地址為0*08000004+N+M,跳轉(zhuǎn)至新寫入程序的復(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í)行過程中,如果CPU得到一個(gè)中斷請(qǐng)求,PC指針仍強(qiáng)制跳轉(zhuǎn)到地址0*08000
8、004中斷向量表處,而不是新程序的中斷向量表,如圖標(biāo)號(hào)所示;程序再根據(jù)我們設(shè)置的中斷向量表偏移量,跳轉(zhuǎn)到對(duì)應(yīng)中斷源新的中斷效勞程序中,如圖標(biāo)號(hào)所示;在執(zhí)行完中斷效勞程序后,程序返回main函數(shù)繼續(xù)運(yùn)行,如圖標(biāo)號(hào)所示。通過以上兩個(gè)過程的分析,我們知道IAP程序必須滿足兩個(gè)要求:1新程序必須在IAP程序之后的*個(gè)偏移量為*的地址開場;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è)置方法隨便翻開一個(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開場的512K空間為我們的程序存儲(chǔ)。而圖中,我們設(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è)置之前我們講解過,在系統(tǒng)啟動(dòng)的時(shí)候,會(huì)首先調(diào)用systemInit函數(shù)初始化時(shí)鐘系統(tǒng),同時(shí)systemInit還完成了中斷向量表的設(shè)置,我們可以翻開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是沒有定義,所以執(zhí)行SCB-VTOR = FLASH_BASE | VECT_TAB_OFFSET; 對(duì)于FLASH APP,我們設(shè)置為FLASH_BASE+偏移量0*10000,所以我們可以在FLASH APP的main函數(shù)最開頭處添加如下代碼實(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文件生成不過MDK默認(rèn)生成的文件是.he*文件,并不方便我們用作IAP更新,我們希望生成的文件是.bin文件,這樣可以方便進(jìn)展IAP升級(jí)。這里我們通過MDK自帶的格式轉(zhuǎn)換工具fromelf.e*e,來實(shí)現(xiàn).a*f文件到.bin文件的轉(zhuǎn)換。該工具在MDK的安裝目錄ARMBIN40文件夾里面。本章,我們通過在MDK點(diǎn)擊Options for TargetUser選項(xiàng)卡,在Run User Programs After Bu
13、ild/Rebuild 欄,勾選Run*1和DOS16,并寫入:D:Keil3.80aARMBIN40fromelf.e*e -bin -o .OBJTEST.bin .OBJTEST.a*f,如圖3.2所示:圖3.2 *bin文件生成設(shè)置通過這一步設(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è)偏移量為*的地址開場;2.必須將新程序的中斷向量表相應(yīng)的移動(dòng),移動(dòng)的偏移量為*;2STM32是按照半字讀寫數(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ù)一:寫入指定起始地址的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)前寫入的地址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é)寫進(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è)字為程序開場地址(復(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025湖北省安全員-A證考試題庫及答案
- 2025年山東建筑安全員C證考試題庫
- 2025年云南省安全員-B證(項(xiàng)目經(jīng)理)考試題庫
- 【課件】搜索引擎營銷的部分問題探討
- DB14T-紅地球葡萄主要病蟲害綜合防控技術(shù)規(guī)程編制說明
- 單位人力資源管理制度集合大全十篇
- 單位管理制度展示大全人員管理十篇
- 2024年土地登記代理人題庫附參考答案(鞏固)
- 2025年社會(huì)服務(wù)行業(yè)尋找彈性與韌性中的結(jié)構(gòu)機(jī)會(huì)
- 單位管理制度展示大合集人員管理十篇
- 實(shí)習(xí)終止及解除協(xié)議書
- 中國冠心病康復(fù)循證實(shí)踐指南(2024版)解讀
- 2024-2030年中國再生水行業(yè)發(fā)展前景預(yù)測規(guī)劃分析報(bào)告
- 城市公益性公墓建設(shè)項(xiàng)目施工組織設(shè)計(jì)
- 2022-2024年江蘇中考語文試題匯編:名著閱讀(教師版)
- 2024年秋季新人教版七年級(jí)上冊數(shù)學(xué)全冊教案
- 安全員年終總結(jié)報(bào)告
- 《客房服務(wù)與管理》課程標(biāo)準(zhǔn)課程內(nèi)容與要求
- GB/T 44823-2024綠色礦山評(píng)價(jià)通則
- 營銷中心建設(shè)實(shí)施方案
- 工程竣工驗(yàn)收(消防查驗(yàn))報(bào)告
評(píng)論
0/150
提交評(píng)論