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