境配置到AC6編譯器切換)
1. 為什么5.39這個版本值得單獨寫一篇安裝指南搞嵌入式開發(fā)的人電腦里基本都躺著一個Keil MDK。但版本這東西真的是“甲之蜜糖乙之砒霜”——有人用5.36穩(wěn)如老狗有人升到5.39發(fā)現(xiàn)編譯器報錯一堆還有人裝完發(fā)現(xiàn)Pack Installer打不開、器件包下載龜速。我前后在四臺機器上裝過5.39踩過的坑足夠?qū)懸黄芸邮謨粤恕O日f清楚這篇東西適合誰看如果你是剛?cè)胄械那度胧叫氯说谝淮谓佑|Keil MDK那這篇可以當“從零到點亮LED”的完整路線圖如果你是從Keil C51或者老版本MDK遷移過來的老手那重點看第3節(jié)的共存配置和第4節(jié)的編譯器差異能幫你省下不少折騰時間。5.39這個版本是ARM官方在2023年底到2024年初推的一個比較穩(wěn)定的版本它最大的變化是默認集成了Arm Compiler 6AC6的更新版本同時對Windows 11的兼容性做了優(yōu)化但恰恰是AC6的默認切換讓很多習慣了AC5的老項目一編譯就炸。我見過太多人裝完Keil就急著新建工程結(jié)果卡在“Device not found”或者“Cannot access target”上然后開始懷疑人生。其實這些問題90%都出在安裝配置階段——器件包沒裝對、調(diào)試器驅(qū)動沒識別、Flash算法沒選對。這篇就把這些環(huán)節(jié)一個一個拆開講每一步都告訴你為什么這么做不這么做會出什么問題。2. 安裝前的準備工作別急著點下一步2.1 版本選擇與下載渠道的取舍Keil MDK目前官方主推的是MDK-ARM也就是我們常說的Keil5 MDK它和Keil C51是兩條產(chǎn)品線。很多人搜索“keilc51和mdk同時安裝”說明大家手里可能既有51項目又有STM32項目。這里先給結(jié)論兩者可以共存但安裝順序有講究。下載渠道我只推薦一個Keil官網(wǎng)keil.com。網(wǎng)上那些“keil注冊機”“2032版keil最新注冊機.7z”之類的資源我不做評價但從安全角度和長期使用角度官方渠道下載的安裝包最干凈不會夾帶奇怪的東西。官網(wǎng)下載需要填一個簡單的表單姓名、郵箱、公司填完就能拿到下載鏈接整個過程兩分鐘。下載的時候注意選對安裝包類型。官網(wǎng)會提供MDK539.EXE這種在線安裝器也有完整的MDK539.ZIP離線包。我的建議是優(yōu)先用離線包因為在線安裝器在下載器件包的時候經(jīng)??ㄗ∮绕涫菄鴥?nèi)網(wǎng)絡環(huán)境下那個進度條能讓你等到懷疑人生。離線包雖然大大概1GB左右但一次下載完后面裝器件包的時候會順暢很多。2.2 系統(tǒng)環(huán)境檢查與依賴確認5.39對系統(tǒng)的要求其實不高Windows 10/11的64位版本都能跑。但有幾個細節(jié)容易被忽略磁盤空間安裝目錄加上后續(xù)的器件包建議預留至少15GB。器件包這東西你裝一個STM32F1的包可能就幾百MB如果后面要裝GD32、瑞薩的包空間消耗很快。路徑不要有中文和空格這是老生常談但每年都有人栽在這上面。安裝路徑默認是C:\Keil_v5我建議保持默認或者改成D:\Keil_v5這種純英文短路徑。中文路徑會導致某些編譯器調(diào)用失敗報錯信息還特別隱晦。關(guān)閉殺毒軟件不是讓你裸奔而是在安裝過程中臨時關(guān)閉。Keil安裝時會往系統(tǒng)目錄寫驅(qū)動文件某些殺軟會攔截導致調(diào)試器驅(qū)動裝不上。裝完再打開就行。管理員權(quán)限右鍵安裝包選擇“以管理員身份運行”。這個不用多解釋不這么做后面寫注冊表會失敗。2.3 安裝順序先MDK還是先C51如果你兩個都要裝先裝Keil C51再裝MDK。原因是MDK的安裝程序會檢測已有的Keil環(huán)境如果先裝了MDK再裝C51C51的安裝程序可能會覆蓋掉一些共享的注冊表項導致MDK的器件包路徑錯亂。反過來先裝C51再裝MDKMDK會自動識別并整合兩者共用一個Pack Installer和License管理界面。裝完之后你會在開始菜單看到兩個快捷方式Keil uVision5這是MDK的和Keil uVision5C51的。實際上它們指向的是同一個可執(zhí)行文件只是啟動時加載的配置不同。如果你發(fā)現(xiàn)啟動后只有ARM的器件沒有51的別慌檢查一下安裝順序和License配置。3. 安裝過程詳解每一步都別想當然3.1 主程序安裝與路徑設置雙擊安裝包后第一個界面是License Agreement勾選同意下一步。然后是選擇安裝路徑這里我建議不要裝在C盤默認路徑倒不是C盤空間不夠而是后面器件包默認也會往這個目錄塞C盤容易爆。我一般用D:\Keil_v5。接下來會彈出一個窗口讓你填個人信息隨便填就行不影響使用。然后就是漫長的文件復制過程大概需要5-10分鐘取決于你的硬盤速度。安裝完成后不要勾選“Launch uVision”先點Finish因為我們還有器件包和License要處理。這里有個細節(jié)安裝程序最后會問你要不要安裝“Pack Installer”和“Legacy Support”。Pack Installer必須裝這是后面管理器件包的核心工具。Legacy Support是給老項目用的如果你確定不碰AC5的老工程可以不裝但建議還是裝上反正占不了多少空間。3.2 器件包Device Family Pack的安裝策略這是整個安裝過程中最容易出問題的環(huán)節(jié)。Keil MDK本身只是一個IDE外殼它不認識任何芯片所有的芯片支持都來自器件包DFP。你新建工程時看到的器件列表就是Pack Installer從本地和網(wǎng)絡拉取的。打開Pack Installer后你會看到左側(cè)是廠商列表右側(cè)是具體的器件系列。這里有個關(guān)鍵操作不要一次性把所有包都下載下來。我見過有人圖省事全選然后點Install結(jié)果下了幾十GB而且很多包根本用不上還拖慢IDE啟動速度。正確的做法是按需安裝。比如你手頭是STM32F103的項目就只裝STMicroelectronics下的STM32F1系列包。如果你用的是GD32L235那就去GigaDevice下面找對應的包。這里注意GD32的包有時候在Pack Installer里搜不到需要去官網(wǎng)下載離線包然后通過“File - Import”手動導入。器件包下載慢是常態(tài)因為服務器在國外。我的經(jīng)驗是早上6-8點下載速度最快能到幾MB/s其他時間可能只有幾十KB/s。如果實在等不了可以找同事拷貝已經(jīng)下載好的包Pack默認存放在C:\Users\你的用戶名\AppData\Local\Arm\Packs目錄下直接復制過去就行。3.3 License管理與版本確認安裝完成后打開Keil uVision5點擊“File - License Management”你會看到一個空的License窗口。這里需要填入License Key。關(guān)于License的獲取方式我不展開討論只說操作層面的注意事項CID碼是唯一的每臺機器的CID不同License不能跨機器混用。管理員權(quán)限運行添加License時必須以管理員身份運行Keil否則會提示“License寫入失敗”。版本確認在“Help - About”里確認版本號是5.39。有時候你下載的是5.39的安裝包但裝完發(fā)現(xiàn)是5.38那是因為安裝程序沒有完全覆蓋舊版本。這種情況需要先卸載舊版本清理注冊表殘留再重新安裝。4. 編譯器配置AC5與AC6的切換邏輯4.1 為什么你的老工程一編譯就報錯5.39默認使用Arm Compiler 6AC6這是基于Clang/LLVM的現(xiàn)代編譯器而很多老工程是用AC5基于ARMCC寫的。兩者在語法檢查、優(yōu)化策略、內(nèi)聯(lián)匯編處理上都有差異。最典型的表現(xiàn)是一個在5.36下編譯零警告的工程在5.39下AC6編譯出一堆“warning: implicit declaration of function”或者“error: unknown type name”。這不是你的代碼有問題而是編譯器變了。解決辦法有兩個一是把工程切換到AC5二是修改代碼適配AC6。對于維護老項目的場景我建議直接切AC5省時省力。4.2 切換編譯器的具體操作在Keil中打開工程點擊“Project - Options for Target”在彈出的窗口中選擇“Target”標簽頁。這里有一個“ARM Compiler”下拉框默認顯示的是“Use default compiler version 6”。把它改成“Use default compiler version 5”然后點OK。但這里有個坑AC5的安裝包需要單獨下載。5.39的安裝程序默認只帶AC6AC5需要去Keil官網(wǎng)的“Arm Compiler 5”頁面單獨下載下載后安裝到Keil的安裝目錄下通常是D:\Keil_v5\ARM\ARMCC。裝完之后重啟Keil下拉框里才能看到AC5的選項。如果你不想裝AC5想直接用AC6跑老工程那需要改代碼。常見的修改點包括把__align改成__attribute__((aligned))把#pragma arm section改成__attribute__((section(name)))檢查所有隱式函數(shù)聲明AC6對此是error級別4.3 編譯優(yōu)化選項的取舍AC6的優(yōu)化等級和AC5不完全對應。AC5的-O0到-O3在AC6里變成了-O0、-O1、-O2、-O3、-Ofast等。對于調(diào)試階段我建議用-O0或者-Og后者是專門為調(diào)試優(yōu)化的能在保持調(diào)試信息完整的同時做一些不影響調(diào)試的優(yōu)化。有一個參數(shù)特別值得注意-fshort-enums。這個選項控制枚舉類型是否用最小字節(jié)存儲。AC5默認開啟AC6默認關(guān)閉。如果你的代碼里有枚舉和結(jié)構(gòu)體對齊相關(guān)的邏輯切換編譯器后行為可能不一致導致通信協(xié)議解析錯誤。這種問題極其隱蔽我當年調(diào)一個Modbus協(xié)議就因為這個參數(shù)折騰了一整天。5. 調(diào)試器配置與硬件連接5.1 常見調(diào)試器驅(qū)動安裝Keil支持多種調(diào)試器ST-Link、J-Link、DAPLink、ULINK等。不管你用哪種驅(qū)動必須先裝好否則Keil的Debug設置里根本看不到設備。以ST-Link為例你需要安裝ST-Link的官方驅(qū)動STSW-LINK009。裝完之后把ST-Link插到電腦上在設備管理器里應該能看到“STMicroelectronics STLink dongle”或者類似的設備。如果顯示黃色感嘆號說明驅(qū)動沒裝對右鍵更新驅(qū)動手動指向Keil安裝目錄下的ARM\STLink\USBDriver文件夾。J-Link的驅(qū)動在SEGGER官網(wǎng)下載安裝后會附帶一個J-Link Commander工具可以用來測試連接。DAPLink通常是免驅(qū)的插上就能識別為HID設備。5.2 Debug設置中的關(guān)鍵參數(shù)打開“Options for Target - Debug”標簽頁在右上角的下拉框里選擇你的調(diào)試器。然后點旁邊的“Settings”按鈕進入詳細配置。這里有幾個參數(shù)必須確認PortSWD還是JTAG?,F(xiàn)在絕大多數(shù)Cortex-M芯片都用SWD兩根線搞定省引腳。除非你的板子只引出了JTAG否則一律選SWD。Max ClockSWD時鐘頻率。默認可能是1MHz或者更高如果連接不穩(wěn)定把它降到500kHz試試。線越長、干擾越大時鐘就要越低。Reset復位方式。通常選“SYSRESETREQ”或者“VECTRESET”。如果調(diào)試時總是連不上可以試試改成“Autodetect”。在“Flash Download”標簽頁里確認“Programming Algorithm”里已經(jīng)添加了對應芯片的Flash算法。比如STM32F103C8T6就要添加“STM32F10x Med-density Flash”算法。如果這里為空點“Add”按鈕從列表里找到對應的算法添加進去。這一步漏了下載程序時會報“Flash Download failed”。5.3 串口調(diào)試助手的配合使用調(diào)試嵌入式系統(tǒng)串口輸出是最基本的調(diào)試手段。Keil本身不帶串口終端你需要一個獨立的串口調(diào)試助手。市面上有很多選擇我常用的是SSCOM和XCOM功能都差不多支持HEX顯示、定時發(fā)送、多條發(fā)送等。配置串口時注意波特率、數(shù)據(jù)位、停止位、校驗位要和代碼里UART初始化的參數(shù)完全一致。我見過有人代碼里設的是115200串口助手開的9600然后對著亂碼看半天。另外如果用的是USB轉(zhuǎn)串口模塊記得裝CH340或者CP2102的驅(qū)動。6. 常見問題排查與避坑經(jīng)驗6.1 安裝類問題速查問題現(xiàn)象可能原因解決方法安裝程序卡在“Rolling back”殺毒軟件攔截關(guān)閉殺軟清理臨時文件后重裝Pack Installer打不開網(wǎng)絡代理設置問題檢查IE代理設置或改用離線包器件列表為空器件包未安裝打開Pack Installer下載對應DFPLicense添加失敗非管理員權(quán)限以管理員身份運行Keil編譯報錯“cannot open source input file”路徑含中文或空格把工程移到純英文路徑下6.2 調(diào)試類問題排查思路問題一Keil提示“No Cortex-M Device found”這是最經(jīng)典的調(diào)試連接問題。排查順序如下先確認調(diào)試器驅(qū)動是否正常設備管理器里有沒有感嘆號再確認SWD線有沒有接反SWDIO和SWCLK別搞混然后檢查目標板有沒有供電有些調(diào)試器不供電板子需要單獨供電最后降低SWD時鐘頻率試試。問題二程序下載后不運行先檢查復位電路有些板子的復位引腳被電容拉死導致芯片一直處于復位狀態(tài)。然后檢查BOOT引腳配置STM32的BOOT0和BOOT1決定了啟動模式如果BOOT0拉高芯片會進入Bootloader而不是運行你的程序。最后檢查中斷向量表偏移如果你用了IAP或者Bootloader需要在代碼里設置SCB-VTOR。問題三調(diào)試時變量值顯示不對這通常是優(yōu)化等級太高導致的。編譯器把變量優(yōu)化到寄存器里調(diào)試器讀不到內(nèi)存中的值。解決辦法是把優(yōu)化等級降到-O0或者把變量聲明為volatile。6.3 那些文檔里不會寫的經(jīng)驗經(jīng)驗一Pack Installer的緩存機制。Pack Installer下載的包會緩存在本地但有時候緩存會損壞導致安裝失敗。這時候去C:\Users\你的用戶名\AppData\Local\Arm\Packs\.Web目錄下把對應的緩存文件刪掉重新下載。經(jīng)驗二Keil的工程文件是XML格式。.uvprojx文件本質(zhì)上是XML你可以用文本編輯器打開它直接修改里面的編譯器版本、器件型號等參數(shù)。批量修改多個工程時這招比一個個打開GUI快得多。經(jīng)驗三用命令行編譯。Keil提供了UV4.exe的命令行接口可以配合CI/CD做自動化構(gòu)建。命令格式是UV4.exe -b project.uvprojx -o build_log.txt-b表示批量構(gòu)建-o指定日志輸出文件。這個在搭建持續(xù)集成環(huán)境時特別有用。經(jīng)驗四調(diào)試窗口的監(jiān)控模式。很多人不知道Keil的Watch窗口可以設置監(jiān)控模式在Watch窗口右鍵選擇“Periodic Window Update”這樣變量值會實時刷新不用每次暫停再查看。對于調(diào)試PID控制這類需要觀察動態(tài)變化的場景這個功能很實用。經(jīng)驗五堆棧溢出檢測。Keil沒有內(nèi)置的堆棧溢出檢測工具但你可以通過填充魔數(shù)的方式手動檢測。在啟動文件里把堆棧區(qū)域填充為0xDEADBEEF程序運行一段時間后查看堆棧末尾的魔數(shù)是否被覆蓋就能判斷是否溢出。具體操作是修改.s啟動文件在Stack_Size定義后面加一段填充代碼。7. 進階配置讓Keil更順手7.1 主題與編輯器優(yōu)化Keil默認的白色主題看久了眼睛累。網(wǎng)上有“mdk 模仿vscode one dark pro 主題”的配置文件本質(zhì)上是修改global.prop文件。這個文件在Keil安裝目錄的UV4文件夾下用文本編輯器打開把里面的顏色值改成你喜歡的配色方案即可。改之前記得備份原文件。編輯器方面建議開啟“Show Line Numbers”和“Highlight Current Line”這兩個選項在“Edit - Configuration”里。另外把Tab鍵設置為4個空格避免不同編輯器打開時縮進混亂。7.2 外部工具集成Keil支持在Tools菜單里添加外部工具。我通常會加兩個一個是Git Bash方便在工程目錄下執(zhí)行g(shù)it命令另一個是串口助手調(diào)試時一鍵打開。添加方法是“Tools - Customize Tools Menu”填入工具名稱、可執(zhí)行文件路徑和參數(shù)。如果你用VS Code寫代碼、Keil做編譯調(diào)試可以配置VS Code的tasks.json把Keil的命令行編譯集成進去。這樣在VS Code里按CtrlShiftB就能觸發(fā)編譯編譯錯誤會直接顯示在VS Code的問題面板里體驗比在Keil里看Build Output窗口好很多。7.3 工程模板的建立每次新建工程都要重新配置編譯器、調(diào)試器、頭文件路徑太浪費時間。我的做法是建立一個“空白模板工程”把所有通用配置都設好然后復制這個工程來創(chuàng)建新項目。模板工程里包括編譯器版本和優(yōu)化等級調(diào)試器配置和Flash算法常用的頭文件包含路徑基本的啟動文件和系統(tǒng)初始化代碼串口重定向的printf實現(xiàn)這樣新建工程時只需要改一下器件型號和添加業(yè)務代碼就行省去了大量重復配置。8. 關(guān)于版本升級與多版本共存8.1 什么時候該升級什么時候不該升Keil MDK的版本升級不像手機系統(tǒng)那樣“越新越好”。我的原則是新項目用新版本老項目不動。5.39對新的芯片支持更好比如GD32L235、瑞薩RA系列這些老版本可能沒有對應的器件包。但如果你的老項目在5.36下跑得好好的沒有特殊需求就不要升升級帶來的編譯器差異可能讓你花大量時間改代碼。8.2 多版本共存的目錄規(guī)劃如果你確實需要同時保留多個版本的Keil建議這樣規(guī)劃目錄D:\Keil_v5_36老版本用于維護老項目D:\Keil_v5_39新版本用于新項目D:\Keil_Packs共享的器件包目錄安裝第二個版本時安裝程序會提示“已檢測到Keil安裝”選擇“Install to a different folder”。裝完后兩個版本的快捷方式會同時存在互不干擾。器件包目錄可以在Pack Installer的設置里統(tǒng)一指向D:\Keil_Packs這樣兩個版本共用同一份器件包節(jié)省空間。8.3 卸載與清理的注意事項卸載Keil時安裝程序不會自動清理器件包和用戶配置文件。如果你打算徹底重裝需要手動刪除以下目錄C:\Users\你的用戶名\AppData\Local\Arm\PacksC:\Users\你的用戶名\AppData\Roaming\Keil安裝目錄下的UV4文件夾如果保留安裝目錄的話另外注冊表里HKEY_CURRENT_USER\Software\Keil和HKEY_LOCAL_MACHINE\SOFTWARE\Keil這兩個鍵值也需要清理否則重裝后可能會讀到舊的配置。我在實際使用中發(fā)現(xiàn)Keil 5.39在Windows 11上的表現(xiàn)比5.36穩(wěn)定不少尤其是Pack Installer的響應速度明顯提升。但AC6的默認切換確實給老項目遷移帶來了額外的成本建議大家在升級前先在一個分支上測試編譯確認沒問題再全面切換。另外如果你手頭有GD32或者瑞薩的芯片5.39的器件包支持比老版本完善很多值得升級。