日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GD32(7)程序烧录及运行

發布時間:2024/3/24 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);
  • 設置bin文件生成
    ???????通過上面兩個步驟即可生成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)程序烧录及运行的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。