跳轉到主要內容

將 Keil 編譯器 5 專案轉換為 Keil 編譯器 6

簡介

STM32CubeMX 不支援部分 MCU 產生 Keil 編譯器 6/armclang 專案。 為了在這些情境中搭配 TouchGFX 使用 Keil 編譯器 6,應採取以下步驟來轉換專案。

建議在按照本指南操作之前先備份您的專案,以防您必須撤銷變更。

在 STM32CubeMX 中變更工具鏈

首先,將 STM32CubeMX 中「專案管理器」分頁中的工具鏈變更為 MDK-ARM,這樣就會建立 Keil 專案。 然後,產生程式碼。

已選擇 MDK-ARM 工具鏈

在 TouchGFX Designer 中產生程式碼

按下按鈕或鍵盤上的 F4 鍵從 TouchGFX Designer 產生程式碼,以將 TouchGFX 特定程式碼新增至專案。

產生程式碼

修改 Keil Scatter 檔案

Keil 用於連結專案的分散載入檔案需要進行一些調整,以確保 TouchGFX 建立的緩衝區不會被初始化,因為這些緩衝區通常放置在外部 RAM 中,啟動時無法存取。
查看專案 MDK-ARM 子資料夾中的 .sct 檔案,以確定專案使用了哪些緩衝區,並新增「.bss」至 物件名稱之前。
這些物件稱為 TouchGFX_Framebuffer、Video_RGB_Buffer、Nemagfx_Memory_Pool_Buffer 和 Nemagfx_Stencil_Buffer,但它們不一定全部都用於專案中。

更新後 scatter 檔案的範例
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x24000000 0x00080000 { ; RW data
.ANY (+RW +ZI)
}
RW_HYPERRAM 0x70000000 UNINIT 0x00FFFFFF {
*.o (.bss.TouchGFX_Framebuffer)
*.o (.bss.Video_RGB_Buffer)
}
}

LR_EROM1 0x90000000 0x2000000 { ; load region size_region
ER_EROM1 0x90000000 0x2000000 { ; load address = execution address
*.o (ExtFlashSection)
; *.o (TextFlashSection)
; *.o (FontFlashSection)
}
}

修改 Keil 專案選項

在 Keil uVision 中開啟專案,然後前往專案設定 (以滑鼠右鍵按一下清單右側第二項,選擇「目標 xxx 選項」,或按一下頂部的「專案」選單,選擇「目標 xxx 選項」)。
在「目標」分頁中,選擇以下設定:

  • 將編譯器設定為「使用預設編譯器 6」
  • 停用 MicroLIB

目標選項

在 C/C++ 分頁中,選擇以下設定:

  • 將語言 c 設為 c11 並將 c++ 設為 c++11
  • 提用短列舉/寬字元 (wchar)
  • 建議最佳化為 -Oz,以獲得更小的程式碼大小

C/C++ 選項

如果使用 FreeRTOS,需要將連接埠改為 gcc,才能與 Keil 編譯器 6 相容。 TouchGFX 使用 gcc 連接埠,因此它在專案中可用,雖然在選擇 Keil 專案產生時它不是由 STM32CubeMX 產生。
若要進行變更,第一步是變更連接埠的包含搜尋路徑。 按一下包含路徑文字欄位旁邊的「...」。
找到以「../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS」開頭的行。 然後在「..」後面加上「/gcc」,並將「RVDS」改為「GCC」。

修改包含搜尋路徑

請注意,對於 Cortex M7 的部分修訂版,FreeRTOS 建議使用 Cortex M4f 連接埠。 這適用於 STM32H7 系列晶片,並且應反映在原始搜尋路徑中。

修改 Keil 專案包含的檔案

為了能夠連結 TouchGFX 函式庫,需要將專案中包含的函式庫變更為 Keil 編譯器 6 相容版本。 為此,請在檔案樹狀目錄中找到 touchgfx_core.lib 檔案 (應位於「Lib」類別),以滑鼠右鍵按一下父資料夾,然後按一下「將現有檔案新增至群組 xxx」。

按一下新增

導覽至「[專案資料夾]/Middlewares/ST/touchgfx/lib/core/[架構]/Keil6.x」並新增「touchgfx_core_wchar32.lib」。
此處的 [架構] 是指 MCU 的實際架構。 如有疑問,請檢查現有函式庫的位置。

新增 touchgfx_core_wchar32.lib

然後在檔案樹狀目錄中找到舊的函式庫參考,以滑鼠右鍵按一下它,然後按一下「移除檔案 xxx」。

刪除參考

如果使用 FreeRTOS,也需要取代 port.c 檔案。 在「Middlewares/FreeRTOS」下找到該檔案,並按照上述說明把檔案刪除。 接著,匯入位於「[專案資料夾]/gcc/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/[FreeRTOS 架構]」的新 port.c 檔案。

新增 port.c

此時專案應該能夠成功編譯。
建議在此狀態下建立專案資料夾副本作為參考,因為 STM32CubeMX 和 TouchGFX 中的重新產生可能會撤銷某些變更。