將 Keil 編譯器 5 專案轉換為 Keil 編譯器 6
簡介
STM32CubeMX 不支援部分 MCU 產生 Keil 編譯器 6/armclang 專案。 為了在這些情境中搭配 TouchGFX 使用 Keil 編譯器 6,應採取以下步驟來轉換專案。
建議在按照本指南操作之前先備份您的專案,以防您必須撤銷變更。
在 STM32CubeMX 中變更工具鏈
首先,將 STM32CubeMX 中「專案管理器」分頁中的工具鏈變更為 MDK-ARM,這樣就會建立 Keil 專案。 然後,產生程式碼。
在 TouchGFX Designer 中產生程式碼
Generate code from TouchGFX Designer by pressing the button or the F4 key on your keyboard, to add the TouchGFX specific code to the project.
修改 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,以獲得更小的程式碼大小
如果使用 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 的實際架構。 如有疑問,請檢查現有函式庫的位置。
然後在檔案樹狀目錄中找到舊的函式庫參考,以滑鼠右鍵按一下它,然後按一下「移除檔案 xxx」。
如果使用 FreeRTOS,也需要取代 port.c 檔案。 在「Middlewares/FreeRTOS」下找到該檔案,並按照上述說明把檔案刪除。 接著,匯入位於「[專案資料夾]/gcc/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/[FreeRTOS 架構]」的新 port.c 檔案。
此時專案應該能夠成功編譯。
建議在此狀態下建立專案資料夾副本作為參考,因為 STM32CubeMX 和 TouchGFX 中的重新產生可能會撤銷某些變更。