GD32(7)程序烧录及运行
目錄
- 簡介
- 啟動方式
- Boot0=0,Boot1=x
- Boot0=1,Boot1=0
- Boot0=1,Boot1=1
- 燒錄方式
- ICP
- ISP
- IAP
- IAP的作用
- IAP與ICP、ISP的運行差別
- IAP的Bootloader程序?qū)崿F(xiàn)
- IAP的APP程序?qū)崿F(xiàn)
簡介
???????微控制器在硬件中作為核心,通過執(zhí)行保存在內(nèi)部存儲器中的程序,運行各種外設(shè),并通過引腳,控制其它電路,而將程序保存在微控制器內(nèi)部存儲器的過程,被稱為燒錄。
???????燒錄的方式可分為以下三種:
- ICP(In-Circuit Programmer,在電路編程)
- ISP(In-System Programming,在系統(tǒng)編程)
- IAP(In-Application Programming,在應(yīng)用編程)
???????在介紹不同燒錄方式的區(qū)別前,先介紹一下微控制器的啟動方式。
啟動方式
???????微控制器的啟動方式有引腳Boot0和Boot1的電平?jīng)Q定,一般通過撥碼開關(guān)或引腳+跳線帽的方式控制,根據(jù)組合有以下三種啟動方式,其中‘x‘表示高電平或低電平(即高低電平皆可)。
Boot0=0,Boot1=x
???????當Boot0=0, Boot1=x時,上電復(fù)位后微控制器從內(nèi)部Flash的主存儲區(qū)開始運行程序,該地址一般是0x0800 0000。
???????設(shè)置該啟動模式前,程序應(yīng)該被保存在內(nèi)部Flash主存儲區(qū)的最前面。
Boot0=1,Boot1=0
???????當Boot0=1, Boot1=0時,上電復(fù)位后微控制器自動運行引導(dǎo)裝載程序,即內(nèi)部Flash信息塊中的Bootloader區(qū),通過運行該程序?qū)⒋a引導(dǎo)裝載至內(nèi)部Flash中,完成程序燒錄。
Bootloader區(qū)的地址可能隨著微控制器的不同而改變,主要是由于內(nèi)部Flash的主存儲區(qū)大小變化。
Boot0=1,Boot1=1
???????當Boot0=1, Boot1=1時,上電復(fù)位后微控制器從內(nèi)部SRAM開始運行程序,該地址一般是0x2000 0000。
???????同理,設(shè)置該啟動模式前,程序應(yīng)該被保存在內(nèi)部SRAM的最前面,并且由于SRAM掉電后不會保留數(shù)據(jù),因此不能進行復(fù)位等操作,一般該啟動模式用于調(diào)試程序。
燒錄方式
ICP
???????ICP(In-Circuit Programmer)指在電路中編程,需要ST-Link、J-Link等燒錄器進行燒錄(此時使用JTAG、SWD等接口),使用該燒錄方式時,通過燒錄器連接計算機和微控制器后通過keil5進行程序燒錄(聽說除了keil5還有其它軟件,但都需要燒錄器),此時燒錄文件為編譯后產(chǎn)生的bin文件。
???????通過ICP進行燒錄時,啟動方式設(shè)置為第1種,即Boot0=0,Boot1=x,以在燒錄完成并復(fù)位后直接從內(nèi)部Flash開始運行。
雖然這時候在硬件設(shè)置啟動方式為Boot0=0,Boot1=x,但燒錄器會在下載時調(diào)整為Boot0=1,Boot1=0以進行程序燒錄,但這不影響后續(xù)復(fù)位后的程序運行。
ISP
??????? ISP(In-System Programming)指在系統(tǒng)編程,不需要燒錄器,但同樣需要將計算機和微控制器連接,用于作為程序的數(shù)據(jù)進行傳輸,可以使用USB、USB轉(zhuǎn)串口模塊(常用)等方式進行燒錄,在燒錄時計算機需要打開ISP燒錄軟件,并選擇對應(yīng)的模式,一般不同微控制器使用的ISP軟件不同,下圖分別是ST和GD使用的ISP軟件。
???????紅框中為燒錄時選擇模式,DTR(Data Terminal Ready)表示數(shù)據(jù)終端準備好,RTS(Request To Send)表示請求發(fā)送 。可以看到都是通過串口進行燒錄的(當然還有其它的ISP軟件)。
???????通過ISP燒錄時,啟動方式設(shè)置為第2種,即Boot0=1,Boot1=0,運行引導(dǎo)裝載程序以將傳輸?shù)臄?shù)據(jù)作為程序存儲在內(nèi)部Flash最前面,燒錄完成后需要修改啟動方式為第1種。
???????通過ISP方式燒錄到程序文件通常是hex文件。
當然,使用此種模式一般將Boot0接到按鍵上,然后不按下接高電平,按下后接低電平,此時通過ISP燒錄前按住按鍵即可。
IAP
??????? IAP(In-Application Programming)指在應(yīng)用編程,不需要通過燒錄器、USB等設(shè)備與計算機連接,但需要從SD卡等存儲設(shè)備獲取新程序(bin文件)進行自我更新(當然,通過USB、UART等接口獲取的程序也可行)。
???????IAP燒錄方式的燒錄邏輯是:在內(nèi)部Flash的最前面燒錄第1個程序(稱為Bootloader程序),其次在相對0800 0000具有偏移的位置存儲第2個程序(稱為APP程序)。在Bootloader程序中,完成APP程序的更新,以及跳轉(zhuǎn)至APP程序執(zhí)行。
APP程序則和上述兩種燒錄方式燒錄的程序相同,為正式運行的程序。
IAP的作用
???????IAP一般可以用于產(chǎn)品的程序更新,避免更新時需要對其進行收回、拆解等步驟,并且方便用于自行操作。
IAP與ICP、ISP的運行差別
???????ICP和ISP都是將1個程序存儲到內(nèi)部Flash中并運行,程序在內(nèi)部Flash中的存儲空間分布如下圖所示,最前面是棧頂?shù)刂?#xff0c;其次是各個中斷向量,然后是各個中斷向量對應(yīng)的中斷程序入口,最后是main函數(shù)入口。
???????程序運行時,棧指針指向復(fù)位中斷向量,其次通過該向量跳轉(zhuǎn)至復(fù)位中斷程序中運行,復(fù)位中斷程序一般在startupxx.s文件中定義,用于初始化系統(tǒng)并跳轉(zhuǎn)至main函數(shù)運行,最后進入main函數(shù)執(zhí)行循環(huán)。當中斷請求出現(xiàn)時,棧指針指向?qū)?yīng)中斷向量,并通過該向量跳轉(zhuǎn)至對應(yīng)的中斷程序中運行,運行結(jié)束后再回到原位置,繼續(xù)運行循環(huán)中的內(nèi)容。
???????IAP是從Bootloader程序中跳轉(zhuǎn)至APP程序中運行,因此在內(nèi)部Flash中的空間分布略有不同,如下圖所示,在執(zhí)行Bootloader程序的main函數(shù)時,進行APP函數(shù)的跳轉(zhuǎn)過程,最后執(zhí)行APP程序中的main函數(shù)。當中斷請求出現(xiàn)時,棧指針指向Bootloader程序中斷向量表中對應(yīng)中斷向量,并通過該向量及程序偏移值跳轉(zhuǎn)至對應(yīng)的中斷程序中運行,運行結(jié)束后再回到原位置,繼續(xù)運行循環(huán)中的內(nèi)容。
IAP的Bootloader程序?qū)崿F(xiàn)
???????Bootloader程序主要完成APP程序的更新以及跳轉(zhuǎn),其中APP程序的更新即從接口或存儲設(shè)備中獲取后存放在內(nèi)部Flash對應(yīng)區(qū)域中接口(相對首地址有偏移量)。
???????APP程序的跳轉(zhuǎn)可參考以下代碼,其中& 0x2FFE0000并與0x20000000判斷是否相等,表示該地址在0x20000000 ~ 0x2001 0000之間(理論上可修改,在內(nèi)部SRAM中即可)。
void GotoApp(u32 appAddr) {//App復(fù)位中斷服務(wù)函數(shù)void (*appResetHandler)(void); //延時變量u32 delay;//檢查棧頂?shù)刂肥欠窈戏?if(0x20000000 == ((*(u32*)appAddr) & 0x2FFE0000)) {//獲取App復(fù)位中斷服務(wù)函數(shù)地址,用戶代碼區(qū)第2個字為程序開始地址(復(fù)位地址)appResetHandler = (void (*)(void))(*(u32*)(appAddr + 4));//設(shè)置App主棧指針,用戶代碼區(qū)的第一個字用于存放棧頂?shù)刂?/span>SetMSP(*(u32*)(appAddr));//跳轉(zhuǎn)到App__set_FAULTMASK(1);//關(guān)閉所有中斷NVIC_SystemReset();//系統(tǒng)復(fù)位} }???????其中SetMSP為匯編程序編寫的函數(shù),如下所示,其中r0為addr的地址,具體可參考ARM架構(gòu)基本寄存器一文及該專欄。
__asm static void SetMSP(u32 addr) {MSR MSP, r0BX r14 }IAP的APP程序?qū)崿F(xiàn)
???????APP程序為用戶程序,實際上任意程序都可以,但需要進行相應(yīng)的配置,配置步驟如下:
???????在keil中設(shè)置起始地址和存儲空間的大小,如下圖所示,在Options for Target 'Target1’對話框中,打開Target標簽頁,勾選IROM1選項,并將起始地址設(shè)置為0x8010000,大小為0x70000(即448KB,可修改,用于存放APP程序),此時APP程序代碼存放地址即為Flash起始地址加上相對偏移量X(這里將偏移量X設(shè)置為10000),即0x08010000。
2. 設(shè)置中斷向量表偏移量
???????在APP程序的main函數(shù)執(zhí)行硬件初始化前,加入以下代碼,設(shè)置相對偏移量X為0x10000。
nvic_vector_table_set(FLASH_BASE,0x10000);???????通過上面兩個步驟即可生成APP程序,但keil默認生成hex文件,因此需要設(shè)置生成bin文件:如下圖所示,在Options for Target 'Target1’對話框中,打開Target標簽頁User標簽頁,勾選Run#1選項,并在對應(yīng)的User command欄中添加格式轉(zhuǎn)換工具fromelf.exe路徑、bin文件存放路徑和用戶程序路徑,3個路徑之間通過空格隔開。
fromelf.exe路徑在leil安裝路徑中找,bin文件存放路徑任意,用戶程序路徑指APP程序的axf文件路徑。
注意:路徑可以是相對路徑或絕對路徑,并且需要空格隔開。
???????設(shè)置結(jié)束后點擊編譯,即可在上面填寫的bin文件路徑中找到對應(yīng)的bin文件。
總結(jié)
以上是生活随笔為你收集整理的GD32(7)程序烧录及运行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces 706C
- 下一篇: urllib3.exceptions.M