一、文檔背景
Keil MDK在實際開發過程中,除了 GUI 操作,Keil 還支持命令行方式執行各種任務,如編譯、鏈接、燒錄、調試和工程管理等。命令行方式的優勢在于能夠與自動化構建系統、腳本工具(如 Batch、PowerShell、CMake)或 CI/CD(如 Jenkins、GitHub Actions)集成,實現無人值守的高效開發流程。
此外,通過Keil 命令行也能在資源受限或遠程開發環境下(如Docker中)提供更靈活的控制方式。通過本文,可以掌握如何利用 Keil 命令行提高開發效率,實現基本的自動化構建和調試流程。如圖1所示。

圖1
亦或者,可以搭配第三方軟件工具,比如:VS Code進行代碼的編寫,然后調試時,在VS Code的終端輸入調試命令,來快速打開原生的KEIL進行調試,詳情請見下方GIF_0。(注意:使用命令行調試,調試退出后,軟件也會自動退出。)

二、KEIL的命令行使用
(1)、Keil MDK 的命令行工具通過 UV4.exe 提供,支持多種命令和選項,但是要想在CMD終端窗口中運行Keil的命令行語句,首先需要我們為UV4.exe這個可執行程序提前設置好環境變量,否則我們將無法在任意目錄下使用Keil的命令行語句(不添加環境變量,就只可以在keil安裝目錄中的UV4文件夾下使用這些命令行語句),設置并添加環境變量的方法如圖2所示:

圖2
(2)接下來,是命令行的基本命令格式,如下代碼塊所示:

這個命令格式一共分為了4部分,逐個解析如下:
①UV4:在這里是命令的標識符;
②command:是后面表中列出的命令之一。(如 -b 構建、-c 清理)如果未指定命令,uVision 將以交互式構建模式(這里交互式構建模式的意思其實就是直接打開keil這個軟件)打開項目文件。
③projectfile:是 uVision 項目文件的名稱,帶有 .uvprojx 擴展名;多項目文件的擴展名為 .uvmpw。如果未指定項目文件,uVision 將打開最近的項目。
④options:是用于指定目標名稱或輸出文件的附加參數。(如 -t 指定目標、-o 輸出日志,后面也有一個對應的命令表)。
(3)command參數可以使用的命令選項:
| 命令 | 描述 |
| -b | 功能:編譯和構建當前目標(target),構建完成后自動退出。 應用場景:可用于自動化構建流程。例如,配合 CI/CD 工具(如 Jenkins)在每次代碼提交后進行編譯驗證。 示例:UV4 -b PROJECT1.uvprojx |
| -c | 功能:清除當前目標的構建產物。(其實就是清理Objects和Listings文件夾) 應用場景:清理舊文件,確保重新構建時沒有殘留文件的干擾。 示例:UV4 -c PROJECT1.uvprojx |
| -cr | 功能:清理并重新構建 應用場景:清理完舊文件后,迅速進行新的構建用以調試等 示例:UV4 -cr PROJECT1.uvprojx |
| -d | 功能:在調試模式下啟動μVision。(調試還是要用IDE界面) 應用場景:將此命令與調試初始化文件一起使用以執行自動化測試過程。使用EXIT命令退出調試會話 。 示例:UV4 -d PROJECT1.uvprojx |
| -f | 功能:下載程序到 Flash,并在下載完成后退出。 應用場景:生產線中的批量燒錄,或開發中的快速固件燒寫。 示例:UV4 -f PROJECT1.uvprojx |
| -r | 功能:僅重新編譯,并在構建過程完成后退出。 應用場景:修改某一模塊后,用以驗證程序是否有誤 示例:UV4 -r PROJECT1.uvprojx |
| -5 | 功能:將μVision 4 uvproj文件轉換為μVision 5 uvprojx文件。該命令的唯一有效選項是-l,用于寫入日志文件。 應用場景:轉換舊項目到新格式,僅此而已。 示例:UV4 -5 myoldproject.uvproj -l log.txt 如果轉換失敗,將返回錯誤代碼20。 |
| -et | 功能:導出目標配置,將項目目標導出到<projectName>.<targetName>.cprj文件。使用選項-t targetname可以指定要導出的目標,否則將使用當前目標。請注意, 帶有選項-t的-et命令不會更改項目中的當前目標配置。該命令不支持其他選項。 應用場景:方便、快速的去移植目標配置給其他的項目。比如跨團隊共享配置,或作為備份模板。 示例:UV4 -et myProject.uvprojx 將myProject.uvprojx中的當前目標導出到myProject.<targetName>.cprj文件。 示例:UV4 -et myProject.uvprojx -t “my-target” 將myProject.uvprojx中的目標“ my-target”導出到myProject.my-target.cprj文件。 (注意:這個選項,沒有被成功調用) |
| -ep | 功能:將所有項目目標導出到相應的 <projectName>.<targetName>.cprj文件。 示例:UV4 -ep myProject.uvprojx (注意:這個選項,沒有被成功調用) |
| -X | 功能:在當前目標的輸出文件夾中,生成預處理符號文件co-arm_<target_name >.h/hpp 。 示例:UV4 -X myProject.uvprojx UV4 -X myProject.uvprojx -T “Target 1” 請注意,生成過程可能需要一段時間。如果要查看進度,請使用uvision.com而不是uv4.exe。 (注意:這個選項,沒有被成功調用) |
| -X1 | 功能:在所有目標的輸出文件夾中,生成預處理符號文件 co-arm_<target_name>.h/hpp 。 示例:UV4 -X1 myProject.uvprojx 請注意,生成過程可能需要一段時間。如果要查看進度,請使用uvision.com而不是uv4.exe。 (注意:這個選項,沒有被成功調用) |
(4)、option參數可以使用的命令選項:
| 命令 | 描述 |
| -j0 | 功能:隱藏 μVision GUI。消息將被抑制。此選項適用于批處理測試。 應用場景:腳本化操作,避免彈窗干擾。 示例:UV4 -j0 PROJECT1.uvprojx |
| -i import_file.xml | 功能:使用 XML 文件中提供的數據創建新項目或更新現有項目。XML 文件需符合位于 ..UV4 目錄下的 project_import.xsd 模式。使用此選項時,GUI 將自動隱藏。 示例: UV4 MyProject.uvprojx -i MyImport.xml (注意:這個選項,暫未經過嘗試) |
| -l logfile | 功能:將命令的輸出保存到指定的日志文件中。 應用場景:方便隨時查看命令的輸出。 示例: UV4 -5 myoldproject.uvproj -l log.txt 如果轉換失敗,將返回錯誤代碼 20。 |
| -n device_name | 功能:使用指定的 device_name 創建新項目。使用此選項時,GUI 將自動隱藏。 應用場景:快速創建指定芯片的項目。 示例: UV4 MyProject.uvprojx -n Device1234 UV4 MyProject.uvprojx -i MyImport.xml -n Device5678 -t FlashDebug |
| -np device_name | 功能:如果項目不存在,則使用指定的 device_name 創建新項目。如果項目已經存在,則更新所有目標的設備選擇為指定的 device_name。使用此選項時,GUI 將自動隱藏。 應用場景:快速創建指定芯片的項目,或快速更新現有目標的芯片型號。 示例: UV4 MyProject.uvprojx -np Device1234 |
| -o outputfile | 功能:指定輸出日志文件。 應用場景:記錄警告和錯誤,或者構建歷史。 示例: UV4 -r PROJECT1.uvprojx -o "listmake.prn" UV4 -r "C:MyProjectsARMExample-mpw.uvmpw" -o "c:templog.txt" |
| -q | 功能:重建多項目文件中所選的目標。確保每個目標有獨立的對象輸出文件夾。可通過菜單 Projects - Options for Target - Output - Select Folder for Objects 進行設置。 示例: UV4 -r "C:MyProjectsARMExample-mpw.uvmpwx" -q -o "c:templog.txt" (注意:這個選項,暫未經過嘗試) |
| -s port | 功能:啟用 UV Socket 端口,并將其分配為指定的端口值。 示例: UV4 MyProject.uvprojx -s 4328 (注意:這個選項,暫未經過嘗試) |
| -t targetname | 功能: 指定目標的名稱。如果未指定,則使用上一次已知的目標。 應用場景:多目標工程中選擇特定構建。 示例: UV4 -r PROJECT1.uvprojx -t "MCB2100 Board" |
| -x | 啟用 DDE 模式并返回完整的命令輸出。此選項僅能與 -d 命令一起使用。 (注意:這個選項,暫未經過嘗試) |
| -y | 啟用 DDE 模式并僅返回命令確認。此選項僅能與 -d 命令一起使用。 (注意:這個選項,暫未經過嘗試) |
| -z | 功能:重建項目或多項目文件的所有目標。 應用場景:確保每個目標有獨立的對象輸出文件夾。可通過菜單 Projects - Options for Target - Output - Select Folder for Objects 進行設置。 示例: UV4 -b PROJECT1.uvproj -z -o "c:templog.txt" UV4 -b "C:MyProjectsARMExample-mpw.uvmpwx" -q -z -o "c:templog.txt" |
| -sg | 功能:禁用來自 uvguix 文件的用戶 GUI 布局。在整個會話期間將使用默認的編輯和調試模式窗口布局,并在關閉項目時不會將布局修改存儲到 uvguix.<user> 文件中。 應用場景:適用于以批處理模式運行 μVision 時,避免對 uvguix 文件的非預期修改。 示例: UV4 -sg myProject.uvproj |
(5)
實戰示例1:
UV4 -b "E:18、文檔預研新建文件夾STM32_ProjectTest0102.uvprojx"
-b構建項目,如果項目里的c文件等沒有改動,生成文件也不會改動。(注意,會彈一下keil軟件然后立馬關閉)如GIF_1所示:(因為沒有需要構建的文件,所以很快,一閃而過)

實戰示例2:
UV4 -r "E:18、文檔預研新建文件夾STM32_ProjectTest0102.uvprojx"
-r 重構項目,所有的文件都會被重新構建一遍。(注意,會彈一下keil軟件然后立馬關閉)如GIF_2所示:(因為需要重新構建,所以會顯示一堆正在編譯的文件,現象較GIF_1更明顯)

實戰示例3:
UV4 -r "E:18、文檔預研新建文件夾STM32_ProjectTest0102.uvprojx" -o "C:newtest.txt"
-r 重構項目,并且-o把構建輸出的結果顯示在txt文件中。(注意,會彈一下keil軟件然后立馬關閉)如GIF_3所示:(重新構建后,將構建窗口中的內容都輸出到文本中進行記錄,現象較GIF_2更明顯)

實戰示例4:
UV4 -j0 -sg -r "E:18、文檔預研新建文件夾STM32_ProjectTest0102.uvprojx" -o "C:newtest.txt"
-j0隱藏μVision GUI界面,-r重構項目,并且不會彈keil軟件(加不加-sg其實都沒事,因為根本就沒打開IDE),并且-o把構建輸出的結果顯示在txt文件中。如GIF_4所示:(重新構建后,將構建窗口中的內容都輸出到文本中進行記錄,且相比于GIF_3,不會再彈出μVision GUI界面,效果會更好一些)

實戰示例5:
UV4 -d "E:18、文檔預研新建文件夾STM32_ProjectTest0102.uvprojx"
-d是調試,其實這里有些失去了命令行的意義,因為終究還是打開了μVision GUI界面,但如果場景是搭配VS Code,那么確實可以在VS Code調一下該命令,借助原生IDE對內核進行調試,調試退出后原生IDE會自動關閉,也很省心,其實也可以。如GIF_5所示:

實戰示例6:
UV4 -f "E:18、文檔預研新建文件夾STM32_ProjectTest0102.uvprojx"
-f是燒錄,預先配置好軟件內的燒錄選項,(或者搭配外部的批量燒錄工具,進行固件的批量燒錄);如GIF_6所示:

三、討論分析
問:都有什么應用場景?
答:
①自動化編譯與構建:在團隊開發中,需要頻繁編譯代碼并驗證是否通過。這時,我們就可以通過命令行工具,可以將構建過程集成到腳本中。
②批量處理與多項目管理:需要同時清理或構建多個項目或目標,如:同時編譯 Debug 和 Release 版本,或者一次生成10個、甚至100個版本的固件(比如Flash燒寫算法,就可以使用該命令行,一次性生成各個Flash大小的FLM文件,不必再逐個、按Flash大小、去生成)。
③在服務器上的Docker中使用,即使沒有GUI界面,也可以依靠此命令行,完成工程的編譯,緩解本地資源。
④批量燒錄,在生產線上結合硬件,通過命令行批量燒錄固件。
四、結論
Keil 命令行工具的核心價值,我覺得其實在于自動化和可集成性,如:①對于繁雜的大型項目,這無疑能提升效率,減少重復手動操作;②進行規模化處理,比如批量編譯、測試或部署;③跨平臺協作,在服務器或無 GUI 環境中運行。
掌握這些場景后,我們可以根據實際需求,再進而去設計更高效的開發流程,甚至探索與其他工具(如靜態分析工具、硬件測試框架)的深度集成,都是有一定可行性的路線。

首頁 > 資源中心 > FAQ
