跳轉到主要內容

編譯與燒錄

本節描述如何完成從TouchGFX應用程式碼到程式執行這一過程,即如何在特定的設置中進行編譯和燒錄。

編譯TouchGFX應用程式

當編譯一個TouchGFX應用程式時,有兩個選項:對PC模擬器進行編譯,或對目標硬體進行編譯。

對PC模擬器進行編譯

對PC模擬器編譯專案時有兩個選項:GCC和Visual Studio。
這兩個選項始終可用,因為它們是由TouchGFX Designer生成的。

GCC

Makefile位於<touchgfx_application_root_folder>/simulator/gcc/Makefile

TouchGFX包含一個MinGW環境,該環境安裝了一個GCC編譯器和GNU Make,可以輕鬆執行對PC模擬器生成的Makefile。

TouchGFX Environment可以從C:/TouchGFX/4.18.0/env/MinGW/msys/1.0/msys.bat啟動,或者從添加到Windows啟動功能表的快捷方式(名為“TouchGFX x.y.z Environment”,其中x、y和z描述版本號)啟動。

在啟動TouchGFX Environment並導航到TouchGFX Application根資料夾後,可以執行下面的簡單指令以生成一個simulator.exe文件。

make -f simulator/gcc/Makefile

然後可以使用以下指令從TouchGFX Environment啟動可執行的模擬器。

./build/bin/simulator.exe

也可以從TouchGFX Designer編譯和啟動PC Simulator,方法是使用Run Simulator指令。

Visual Studio

要使用Visual Studio編譯PC Simulator,只需使用Visual Studio打開位於<touchgfx_application_root_folder>/simulator/msvs/Application.sln的已生成解決檔。

可以直接從Visual Studio啟動PC Simulator,啟用程式碼除錯

Note
在運用GCC或Visual Studio進行編譯之前,從TouchGFX Designer運行Generate指令。

對目標硬體進行編譯

對於基於TouchGFX開發版設置的應用程式來說,對STM32評估套件進行專案編譯是非常簡單的。

每個TouchGFX開發版設置包含對GCC、STM32CubeIDE、IAR和Keil的專案檔案:

  • GCC: <project_root_folder>/gcc/MakeFile
  • STM32CubeIDE: <project_root_folder>/STM32CubeIDE/.cproject
  • IAR: <project_root_folder>/EWARM/Project.eww
  • Keil: <project_root_folder>/MDK-ARM/<STM32_evaluation_kit_name>.uvprojx

活動工具鏈從STM32CubeMX設置,並默認設為STM32CubeIDE。 請注意!所有專案檔案不會同時出現。 生成的專案檔案取決於在STM32CubeMX中選擇的工具鏈

TouchGFX包含一個MinGW環境,該環境已預裝對Arm和GNU Make的GNU嵌入式工具鏈,可以輕鬆執行目標硬體所包含的Makefile。

TouchGFX Environment可以從C:/TouchGFX/4.18.0/env/MinGW/msys/1.0/msys.bat啟動,或者從添加到Windows啟動功能表的快捷方式“TouchGFX x.y.z Environment”啟動

在啟動TouchGFX Environment並導航到專案根資料夾後,可以執行下面的簡單指令,對目標硬體進行專案編譯。

make -f gcc/Makefile
Note
在運用GCC、STM32CubeIDE、IAR或Keil進行編譯之前,從TouchGFX Designer執行Generate指令。

燒錄STM32評估套件

因為專案基於預先完成的TouchGFX開發板設置,將專案燒錄到STM32評估套件是非常輕鬆的。

每個專案在構建之後都會生成一個二進位檔案,該檔可以通過ST Link UtilitySTM32CubeProgrammer燒錄

因此,必須安裝這些工具,才能進行燒錄。

建議將這些工具安裝到默認位置。

  • ST Link Utility默認安裝位置:
    C:/Program Files (x86)/STMicroelectronics/STM32 ST-LINK Utility/ST-LINK Utility
  • STM32CubeProgrammer默認安裝位置:
    C:/Program Files/STMicroelectronics/STM32Cube/STM32CubeProgrammer
Note
TouchGFX開發板設置不提供任何flash loader,用於直接從IAR、Keil、STM32CubeIDE或其他IDE進行燒錄。

GCC與TouchGFX Designer

Makefile包含在位於<project_root_folder>/gcc/MakeFile的TouchGFX開發板設定中,具有如下所示的內建Flash指令,使用ST Link Utility或STM32CubeProgrammer (視TBS而定)燒錄STM32評估套件。

您可使用與TouchGFX Designer相同的指令,從指令行開始進行燒錄:

make -f gcc/Makefile flash

您也可以使用桌面版本的Flash工具,透過產生的.hex檔案燒錄開發板。 .hex檔案位於<project_root_folder>/TouchGFX/build/bin/target.hex

僅燒錄內部Flash

許多開發板及產品使用兩個Flash。 微控制器的內部Flash及外部Flash。 一般來說,內部Flash包含程式碼及小型/常用資料,而外部Flash則包含大型資料項目,例如圖像、影片及字型。

在許多情況下,您需要同時燒錄兩個Flash,因為內部Flash的程式包含位址,指向外部Flash中的資料。 不過在部分情況下,是可以燒錄內部Flash但不燒錄外部Flash,例如對應用程式碼進行小幅度修改時(像是變更方塊的色彩或位置)。 在此情況下,外部Flash的所有資料均未修改,因此無需再次對其進行燒錄。 如果您有大量圖像,這樣可以大大減少燒錄時間。

但您需要確保自從上次寫入外部Flash以來,外部Flash的內容沒有變更。 如果外部Flash的內容已變更,但又沒有重新燒錄,您將會看到不正常的行為。 在這種情況下,需要同時燒錄內部和外部Flash。

make -f gcc/Makefile intflash

內部Flash的.hex檔案位在:<project_root_folder>/TouchGFX/build/bin/intflash.hex

連結器指令碼

intflash會讓目標先編譯及連結應用程式, 然後燒錄intflash.hex檔案。 此檔案會在連結步驟後產生,方式為將ExternalFlashSectionTextFlashSectionFontFlashSection區段從應用程式elf檔案中移除。 這是透過下列指令進行:

arm-none-eabi-objcopy -O ihex --remove-section=ExtFlashSection --remove-section=FontFlashSection --remove-section=TextFlashSection target.elf intflash.hex

此指令的結果為hex檔案,僅包含位於內部Flash的資料。 只有在連結器指令碼將前述三個區段放置於外部Flash的情況下,此項指令才能順利作用。 以下是TouchGFX開發板設定一般的gcc連結器指令碼:

...  /* Details skipped */

MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
QUADSPI (r) : ORIGIN = 0x90000000, LENGTH = 16M
SDRAM (xrw) : ORIGIN = 0xC0000000, LENGTH = 8M
}

SECTIONS
{
... /* Sections for RAM, Flash, SDRAM */

ExtFlashSection :
{
*(ExtFlashSection ExtFlashSection.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >QUADSPI

FontFlashSection :
{
*(FontFlashSection FontFlashSection.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >QUADSPI

TextFlashSection :
{
*(TextFlashSection TextFlashSection.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >QUADSPI
}

連結器指令碼會先定義4個記憶體區域:RAMFLASHQUADSPISDRAMQUADSPI區域為外部Flash。 而ExtFlashSectionFontFlashSectionTextFlashSections等3個區段則連結至QUADSPI區域。 沒有其他項目會置於QUADSPI區域。 這就是我們能夠從包含一切的target.elf檔案中移除前述3個區段,以便為內部Flash產生hex檔案的原因。 如果連結器指令碼將其他資料置於外部Flash,我們也需要移除該資料,以便最後只剩下內部Flash內容。

如果您使用其他Makefile或編譯器建構目標elf檔案,可以重複使用前述技巧為內部Flash建立hex檔案,並由TouchGFX Designer或指令行燒錄該檔案。

TouchGFX Designer設定

TouchGFX開發板設定提供適用於TouchGFX Designer的設定,以便透過Run Target Command (執行目標指令)燒錄專案。 被TouchGFX Designer用於進行燒錄的指令可以在TouchGFX Designer中配置視圖構建部分看見並覆蓋。

STM32CubeIDE

TouchGFX開發板設置使用STM32CubeIDE輸出的.elf檔支援通過STM32CubeProgrammer對用STM32CubeIDE編譯的專案進行燒錄。

.elf文件位於<project_root_folder>/STM32CubeIDE/Debug/<STM32_evaluation_kit_name>.elf

e.g. C:/TouchGFXProjects/MyApplication/STM32CubeIDE/Debug/STM32F746G_DISCO.elf

IAR

TouchGFX開發板設置使用IAR輸出的.hex檔支援通過STM32CubeProgrammer對用IAR編譯的專案進行燒錄。

.hex文件位於 <project_root_folder>/EWARM/<STM32_evaluation_kit_name>/Exe/<STM32_evaluation_kit_name>.hex

例如, C:/TouchGFXProjects/MyApplication/EWARM/STM32F469I-DISCO/STM32F469I-DISCO.hex

Keil

TouchGFX開發版設置使用Keil輸出的.hex檔支援通過STM32CubeProgrammer對用Keil編譯的專案進行燒錄。

.hex文件位於<project_root_folder>/MDK-ARM/<STM32_evaluation_kit_name>/<STM32_evaluation_kit_name>.hex

e.g. C:/TouchGFXProjects/MyApplication/MDK-ARM/STM32F469I-DISCO/STM32F469I-DISCO.hex

燒錄自訂硬體

如果需要燒錄的是自訂硬體,而不是STM32評估套件這樣的預定義硬體設置,則仍然可以使用STM32CubeProgrammer。 STM32CubeProgrammer不一定帶有對特定外部記憶體的flash載入機制。 然而,可以創建一個自訂的flash loader。 參閱關於如何為外部記憶體開發自訂載入器的用戶手冊可瞭解更多資訊。