環(huán)境搭建:MDK-ARM v5.43a安裝配置與調(diào)試指南)
在嵌入式圈子里有一個(gè)組合到今天依然是“入門必選、量產(chǎn)常見”的經(jīng)典搭配Keil MDK-ARM 配 STM32F103。尤其 v5.43a 這個(gè)版本在 2024 年到 2025 年這段時(shí)間里幾乎成了芯片資料、開源項(xiàng)目、舊工程維護(hù)的默認(rèn)基準(zhǔn)。不少人回頭去裝 5.43a不是因?yàn)樽沸露且驗(yàn)樾掳姹靖悴欢ɡ瞎こ?、舊庫、第三方插件反而是這個(gè)版本兼容性最穩(wěn)。這篇文章就圍繞“MDK-ARM v5.43a STM32F103 開發(fā)環(huán)境”這條主線把從軟件安裝、器件支持包部署、License 授權(quán)、工程創(chuàng)建、編譯燒錄到常見問題排查的完整流程過一遍。文章里的每一步都來自我實(shí)際搭建和教學(xué)過程中反復(fù)確認(rèn)過的做法照著走基本不會(huì)被卡住。適合剛開始學(xué) STM32 的同學(xué)也適合從其他 IDE比如 IAR、Eclipse轉(zhuǎn)過來的工程師。1. 為什么是 v5.43a選這個(gè)版本的三個(gè)理由很多人在選 Keil 版本時(shí)會(huì)糾結(jié)到底用 MDK v4、v5 還是最新的 v6我的建議很直接——如果你搞 STM32F103直接固定在 v5.43a 或者差不多時(shí)期的 v5 版本即可不需要追新。1.1 版本譜系和工程生態(tài)的匹配關(guān)系Keil 的 MDK-ARM 從 v4 跳到 v5 之后最核心的變化是編譯器和器件支持包Device Family Pack簡(jiǎn)稱 DFP徹底分離。v4 時(shí)代芯片型號(hào)直接內(nèi)嵌在安裝包里到了 v5你需要單獨(dú)裝一個(gè)對(duì)應(yīng)廠商和芯片系列的 Pack比如 STM32F1 系列就需要安裝 Keil.STM32F1xx_DFP。MDK v5.43a 這個(gè)版本的特殊之處在于它處在 AC5 編譯器仍被大量使用、AC6 編譯器開始普及的過渡期。ARM Compiler v5AC5在 STM32F103 這種 Cortex-M3 內(nèi)核上編譯出來的代碼穩(wěn)定、成熟很多老工程師習(xí)慣用 AC5 編譯正式項(xiàng)目。而 v5.43a 默認(rèn)同時(shí)支持 AC5 和 AC6你既可以在 Option 里切換編譯器版本也不會(huì)因?yàn)榘姹咎邔?dǎo)致某些舊版 DFP 加載不了。1.2 STM32F103 和 MDK v5.43a 的兼容性為什么好STM32F103 是基于 Cortex-M3 內(nèi)核的經(jīng)典芯片ARM 官方對(duì)這顆內(nèi)核的編譯器支持非常成熟。MDK v5.43a 自帶的調(diào)試器驅(qū)動(dòng)、FLASH 下載算法、CMSIS 組件基本是圍繞 F1 系這種老芯片做過大量?jī)?yōu)化的。我在實(shí)際比對(duì)過 v5.36、v5.38、v5.43a 之后發(fā)現(xiàn)針對(duì) STM32F103 而言5.43a 在編譯速度、燒錄穩(wěn)定性上和三方調(diào)試器ST-Link、J-Link、CMSIS-DAP的適配都是最穩(wěn)的一檔。另一個(gè)很現(xiàn)實(shí)的原因是網(wǎng)上大量現(xiàn)成工程、正點(diǎn)原子、野火等開發(fā)板的配套例程很多直接標(biāo)注“Keil MDK v5.43a 打開”如果你版本不一致打開工程時(shí)輕則警告、重則變量定義沖突或者語法錯(cuò)誤。1.3 電腦環(huán)境的基本要求MDK-ARM v5.43a 對(duì)電腦的要求不高實(shí)測(cè)在 4GB 內(nèi)存的舊筆記本上跑 STM32F103 工程都沒問題。操作系統(tǒng)建議 Windows 10 或 Windows 11 64 位Windows 7 雖然也能裝但調(diào)試器驅(qū)動(dòng)方面偶爾會(huì)有兼容性問題。需要注意的是MDK 這個(gè) IDE 對(duì)中文用戶名或者中文路徑比較敏感安裝路徑和工程路徑里最好全用英文字符。1.4 哪些情況可以考慮其他版本如果你要搞的是 STM32H7、STM32MP1 這類高端芯片或者需要 Cortex-M7 內(nèi)核的深度優(yōu)化那建議用更新的 MDK v5.40 以上版本如果你要兼容 2009 年左右的老工程那可以考慮 MDK v4.74 配合舊庫。但如果你就是老老實(shí)實(shí)搞 STM32F103v5.43a 幾乎是一個(gè)不需要思考的選擇。2. 第一步獲取、安裝 MDK-ARM v5.43a2.1 軟件獲取的正規(guī)渠道獲取 MDK-ARM 的唯一正規(guī)渠道是 ARM 官網(wǎng)keil.arm.com 或者 www.keil.com。下載頁面里選擇 MDK-ARM 的 Downloads 區(qū)域找到 5.43a 版本的安裝包即可。這里要特別提醒一句下載和授權(quán)走官方渠道是最省心的做法。網(wǎng)上很多“破解工具”、“注冊(cè)機(jī)”不僅違反軟件授權(quán)協(xié)議而且常會(huì)攜帶惡意程序。MDK 本身提供功能完整的評(píng)估版對(duì)學(xué)習(xí)來說基本夠用后續(xù)如果做商業(yè)項(xiàng)目購買正版授權(quán)也是成本可控的正路。評(píng)估版Evaluation Version的限制主要是代碼編譯量不超過 32KB對(duì)于 STM32F103 的基礎(chǔ)入門、外設(shè)驅(qū)動(dòng)學(xué)習(xí)、Modbus 通信、小型 RTOS 移植這些場(chǎng)景來說32KB 其實(shí)相當(dāng)寬裕一個(gè)精簡(jiǎn)的 FreeRTOS 點(diǎn)燈工程編出來也就 10~20KB。先評(píng)估、后購買是非常合理的學(xué)習(xí)路徑。2.2 安裝流程中的關(guān)鍵選項(xiàng)安裝過程不算復(fù)雜但有三個(gè)細(xì)節(jié)直接影響后面的使用體驗(yàn)。第一個(gè)是安裝路徑。默認(rèn)路徑一般是 C:\Keil_v5建議保持默認(rèn)不要改到帶有空格或中文的目錄否則部分編譯器和調(diào)試腳本在尋找絕對(duì)路徑時(shí)可能出錯(cuò)。第二個(gè)是組件選擇。安裝向?qū)?huì)讓你勾選要安裝的組件默認(rèn)全選即可但如果電腦空間緊張可以去掉 32 位支持、不需要的 License Management 文檔之類的項(xiàng)目。核心組件是 MDK Core 和 ARM Compiler。第三個(gè)是器件支持包的處理。官方安裝包在最后一步會(huì)詢問是否立即運(yùn)行 Pack Installer這里可以先跳過等到后面單獨(dú)裝 DFP。2.3 安裝目錄結(jié)構(gòu)看一眼裝完之后建議打開安裝目錄掃一眼理解它的布局ARM/ARMCC這里存放的是 AC5 編譯器也就是 armcc 那套工具鏈。ARM/ARMCLANG這是 AC6 編譯器基于 Clangv5.43a 會(huì)自帶。ARM/PACK這個(gè)文件夾是器件支持包的大本營(yíng)DFP 裝好之后會(huì)出現(xiàn)在這里。UV4Uvision 主程序目錄啟動(dòng)入口是 UV4.exe。TOOLS.INIIDE 的配置文件記錄安裝路徑、PACK 路徑等信息。以后如果遇到“無法打開某個(gè) Pack”的報(bào)錯(cuò)大概率是 ARM/PACK 路徑不對(duì)或者 Pack 損壞。2.4 License 授權(quán)的配置方式安裝完成后打開 uVision在菜單 File - License Management 里能看到當(dāng)前的授權(quán)狀態(tài)。如果顯示 Evaluation則代表評(píng)估版。激活方式有兩種第一種如果你有正版激活碼直接在 License Management 界面填入 License ID CodeLIC即可這種方式最方便。第二種如果只有激活文件.lic需要點(diǎn)擊 Licenses 選項(xiàng)卡然后通過 Browse 加載對(duì)應(yīng)的 .lic 文件。針對(duì) STM32F103 學(xué)習(xí)場(chǎng)景建議先不急著激活直接用評(píng)估版跑通全流程等確認(rèn)開發(fā)環(huán)境沒問題再考慮正式授權(quán)。這樣你在排查問題時(shí)也不會(huì)把“授權(quán)異?!边@個(gè)變量混進(jìn)來。3. 第二步部署 STM32F103 器件支持包DFP3.1 Pack Installer 到底在干什么MDK v5 之后芯片型號(hào)、啟動(dòng)文件、Flash 下載算法、SVD 調(diào)試描述文件全部打包在 DFP 里。如果沒有對(duì)應(yīng)的 DFP你在 uVision 的 Device 列表里根本找不到 STM32F103C8T6 這個(gè)型號(hào)更別提建立工程了。所以裝完 MDK 之后第一件事就是裝 Pack。3.2 在線安裝最省事的方式打開 uVision點(diǎn)擊工具欄上的 Pack Installer 圖標(biāo)在 Devices 選項(xiàng)卡里展開 STMicroelectronics - STM32F1 Series可以看到不同子系列的 Pack 版本。直接點(diǎn)擊 Install 按鈕即可。在線安裝會(huì)自動(dòng)匹配 MDK 版本一般不會(huì)出現(xiàn)兼容性問題。需要提醒的是Pack Installer 有時(shí)候會(huì)卡在 Checking for new packs 的界面這通常是因?yàn)榫W(wǎng)絡(luò)連接官方服務(wù)器不穩(wěn)定。此時(shí)可以關(guān)掉重試或者直接改用離線安裝。3.3 離線安裝網(wǎng)絡(luò)受限時(shí)的備用方案在 ARM 官網(wǎng)的 PACK 下載頁面找到 Keil.STM32F1xx_DFP.2.4.1.pack 這樣的文件版本號(hào)可能更新下載后直接雙擊或者用 Pack Installer 的 File - Import 菜單導(dǎo)入。離線 Pack 的好處是一次下載之后可以反復(fù)安裝適合內(nèi)網(wǎng)開發(fā)環(huán)境。安裝完成后可以在 Pack 區(qū)域看到 STM32F1 系列的組件列表包括CMSISDevice:StartupDevice:STM32F103 系列的外設(shè)定義Flash 編程算法這里要注意 DFP 版本并不是越新越好。有些過于新的 DFP 會(huì)默認(rèn)啟用一些新的 CMSIS 頭文件規(guī)范對(duì)老工程不友好。STM32F1 系列的話2.3.0 到 2.4.x 這個(gè)區(qū)間都適合。3.4 確認(rèn) Pack 安裝成功最簡(jiǎn)單的方法在 uVision 中點(diǎn)擊 Project - New uVision Project在彈出的芯片選擇對(duì)話框中直接輸入 STM32F103C8如果能看到對(duì)應(yīng)型號(hào)并支持點(diǎn)選說明 Pack 已經(jīng)生效。如果沒有回到 Pack Installer 里再確認(rèn)一遍安裝狀態(tài)。4. 第三步創(chuàng)建一個(gè)可編譯、可燒錄的 STM32F103 工程4.1 工程結(jié)構(gòu)選型標(biāo)準(zhǔn)庫、HAL 庫還是 LL 庫STM32F103 的軟件開發(fā)方式通常有三種標(biāo)準(zhǔn)外設(shè)庫StdPeriph、HAL 庫、LL 庫。在 MDK v5.43a 下這三種都能用但取舍差別不小。如果你看的是 ST 官方或較老的教程大概率用的標(biāo)準(zhǔn)外設(shè)庫如果是從 STM32CubeMX 起步用的是 HAL 庫。我的觀點(diǎn)是新學(xué)的人建議直接上 HAL 庫因?yàn)?CubeMX 生成的代碼可以直接在 MDK 中打開省去手寫初始化配置的大量時(shí)間比如 SPI 通過 DMA 讀取傳感器數(shù)據(jù)這種外設(shè)組合CubeMX 圖形化配置完再導(dǎo)入 MDK 編譯效率高很多。如果你在維護(hù)老項(xiàng)目、或者需要對(duì)寄存器級(jí)別的操作有絕對(duì)掌控力標(biāo)準(zhǔn)庫依然能打。無論選哪種MDK 工程的文件組織邏輯是一樣的都要包含啟動(dòng)文件、系統(tǒng)時(shí)鐘文件、外設(shè)驅(qū)動(dòng)、用戶主程序。4.2 用 uVision 創(chuàng)建一個(gè)空白工程在菜單 Project - New uVision Project輸入工程名比如 STM32F103_Demo選擇保存路徑。這時(shí)會(huì)彈出 Device 選擇窗口按芯片具體型號(hào)選擇比如STM32F103C8T6選擇 STMicroelectronics - STM32F1 Series - STM32F103 - STM32F103C8。STM32F103ZET6對(duì)應(yīng) STM32F103ZE。選好型號(hào)后會(huì)彈出 Manage Run-Time Environment 窗口。在這里可以勾選需要的軟件組件比如 CMSIS:CORE、Device:Startup這兩個(gè)是必須的。其他外設(shè)組件可以按需勾選如果不想用 MDK 自帶的組件也可以后面手動(dòng)添加庫文件。4.3 芯片選型與啟動(dòng)文件的關(guān)系選完芯片后uVision 會(huì)自動(dòng)為工程添加對(duì)應(yīng)的啟動(dòng)文件比如 startup_stm32f103xb.s和系統(tǒng)文件system_stm32f1xx.c這是初學(xué)者最容易忽略的部分。很多人編譯報(bào)錯(cuò)原因就是工程里少了這兩個(gè)基礎(chǔ)文件。啟動(dòng)文件的作用是定義中斷向量表、初始化堆棧、調(diào)用 SystemInit、跳轉(zhuǎn)到 main 函數(shù)。system_stm32f1xx.c 則負(fù)責(zé)把系統(tǒng)時(shí)鐘配置到目標(biāo)主頻比如 72MHz。如果不小心刪了啟動(dòng)文件整個(gè)工程必然編譯失敗。4.4 配置編譯輸出與調(diào)試器選項(xiàng)建立工程后在 Project - Options for Target 里有幾個(gè)選項(xiàng)必須確認(rèn)Output 選項(xiàng)卡勾選 Create HEX File這樣編譯后能生成用于燒錄的 .hex 文件。Debug 選項(xiàng)卡右側(cè) Use 下拉框里選擇調(diào)試器類型常用的是 ST-Link Debugger 或 J-LINK。如果用的是開發(fā)板自帶的 CMSIS-DAP這里選 CMSIS-DAP Debugger。Utilities 選項(xiàng)卡勾選 Use Debug Driver 或選擇 ST-Link這一步負(fù)責(zé)燒錄時(shí)調(diào)用下載算法。C/C 選項(xiàng)卡如果用了 HAL 庫或者標(biāo)準(zhǔn)庫需要在這里添加 Include Paths也就是頭文件路徑。4.5 一個(gè)最小可運(yùn)行的工程源文件要準(zhǔn)備多少以標(biāo)準(zhǔn)庫為例一個(gè)最小點(diǎn)燈工程源文件大概需要這些main.c主循環(huán)控制 GPIO。stm32f10x_gpio.c / stm32f10x_rcc.c外設(shè)驅(qū)動(dòng)源文件按需從標(biāo)準(zhǔn)庫拷貝。stm32f10x_it.c中斷服務(wù)函數(shù)文件。system_stm32f10x.c時(shí)鐘初始化。startup_stm32f10x_hd.s啟動(dòng)文件。用 HAL 庫的話CubeMX 生成工程后會(huì)把這些都替你組織好你只需要在 MDK 里打開 .uvprojx 工程文件。4.6 從 CubeMX 生成的工程導(dǎo)入 MDK 的注意事項(xiàng)用 CubeMX 生成工程時(shí)Toolchain 選擇 MDK-ARM V5生成的 .uvprojx 直接雙擊就能用 MDK 打開。這里有一個(gè)常見坑如果 CubeMX 版本較新生成的工程可能默認(rèn)使用 AC6 編譯器。雖然 v5.43a 能編譯 AC6 代碼但如果你想把工程切回 AC5需要在 Options - Target - ARM Compiler 里切換為 Version 5并且把相應(yīng)的啟動(dòng)文件、宏定義重新檢查一遍。我個(gè)人的習(xí)慣是新工程用 AC5因?yàn)楹芏嚅_源代碼、老驅(qū)動(dòng)都基于 AC5 的語法習(xí)慣切換到 AC5 后省去一堆編譯告警。5. 第四步編譯、燒錄、調(diào)試的完整閉環(huán)5.1 第一個(gè)程序建議從點(diǎn)燈開始硬件上最簡(jiǎn)單的方式是一塊 STM32F103 最小系統(tǒng)板外接 ST-Link然后板載一個(gè) LED 接在 PC13比如常見的 STM32F103C8T6 藍(lán)色 pill 板。程序邏輯很簡(jiǎn)單開啟 GPIOC 時(shí)鐘配置 PC13 為推挽輸出然后延時(shí)翻轉(zhuǎn)電平。用庫函數(shù)寫法大致如下#include stm32f10x.h void Delay(void) { for (volatile int i 0; i 800000; i); } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_2MHz; GPIO_Init(GPIOC, GPIO_InitStructure); while (1) { GPIO_ResetBits(GPIOC, GPIO_Pin_13); Delay(); GPIO_SetBits(GPIOC, GPIO_Pin_13); Delay(); } }這段代碼在 MDK 里直接編譯正常情況下 0 Error 0 Warning生成的 .hex 大小只有幾 KB。5.2 Flash 下載算法配置與燒錄流程在開始燒錄之前打開 Options for Target - Utilities - Settings這里會(huì)列出當(dāng)前調(diào)試器的信息。核心要確認(rèn)的是 Flash Download 列表里是否自動(dòng)識(shí)別了 STM32F10x Med-density Flash 這種編程算法。如果列表為空需要手動(dòng) Add 對(duì)應(yīng)的算法。對(duì)于 STM32F103C8T6 這種中容量產(chǎn)品64KB Flash算法是 STM32F10x Med-density Flash對(duì)于 ZET6512KB Flash算法是 STM32F10x High-density Flash。選錯(cuò)算法輕則燒錄失敗重則把整個(gè) Flash 內(nèi)容擦掉但寫不進(jìn)去。實(shí)際燒錄操作有兩種方式方式一進(jìn)入 Debug 模式點(diǎn)擊菜單 Flash - Download或者直接按 F8 快捷鍵MDK 會(huì)通過調(diào)試器把程序?qū)懭?Flash然后自動(dòng)復(fù)位運(yùn)行。方式二把工程編出來的 .hex 文件用 ST-Link Utility、STM32CubeProgrammer 或第三方 Flash 燒錄工具單獨(dú)燒錄。在調(diào)試階段直接按 F8 最方便程序下載完成即可進(jìn)入硬件調(diào)試。這里有一個(gè)實(shí)際體會(huì)初次燒錄時(shí)一定確認(rèn)接線ST-Link 的 SWDIO、SWCLK、GND、3V3 對(duì)應(yīng)好接反了大概率識(shí)別不到目標(biāo)芯片甚至可能燒壞調(diào)試器。5.3 Debug 調(diào)試模式下的幾個(gè)實(shí)用操作進(jìn)入在線調(diào)試后經(jīng)常用到的窗口有Register 窗口觀察 R0-R15、PSP、MSP 等寄存器值做異常分析時(shí)非常有用。Memory 窗口直接查看指定地址的內(nèi)存內(nèi)容比如檢查 SPI DMA 接收緩沖區(qū)的原始數(shù)據(jù)。Watch 窗口右鍵變量名 Add to Watch實(shí)時(shí)觀察變量的變化。Peripherals 窗口可以直接查看 GPIO、USART、SPI 外設(shè)寄存器的當(dāng)前值很多外設(shè)問題在這里一眼就能看出來。關(guān)于調(diào)試模式下的一個(gè)技巧性內(nèi)容熱搜詞里有人問“keil調(diào)試助手里面的 debug 模式如何顯示結(jié)構(gòu)體變量”這里順帶講一下在 Watch 窗口添加結(jié)構(gòu)體變量時(shí)先展開結(jié)構(gòu)體然后在成員變量的后面輸入要監(jiān)視的表達(dá)式比如輸入數(shù)組名加 [0] 可以逐項(xiàng)查看數(shù)組元素如果結(jié)構(gòu)體含有指針成員直接展開指針指向的內(nèi)存即可查看具體數(shù)值。另外在 Call Stack Locals 窗口可以自動(dòng)顯示當(dāng)前函數(shù)內(nèi)的局部變量包括結(jié)構(gòu)體。調(diào)試中還經(jīng)常遇到的問題就是程序跑飛。當(dāng)單步執(zhí)行時(shí)如果程序跳到了一個(gè)全是 0xFFFFFFFF 的地址通常說明芯片進(jìn)入了 HardFault_Handler。這時(shí)打開 Processor Fault Status 窗口查看 CFSR、HFSR 寄存器大概能看出是總線錯(cuò)誤還是棧溢出如果棧溢出優(yōu)先檢查啟動(dòng)文件中 Stack Size 是否太小或者主程序里是否有超大的局部數(shù)組。6. 常見問題與排查技巧實(shí)錄6.1 編譯報(bào)錯(cuò)“cannot open source input file ... 或 No such file”這種報(bào)錯(cuò)八成是 Include Paths 路徑?jīng)]有配置對(duì)。檢查 C/C 選項(xiàng)卡里 Include Paths 是否包含所有頭文件所在目錄尤其用 HAL 庫時(shí)至少需要包含固件包根目錄下的 Drivers/CMSIS/IncludeDrivers/CMSIS/Device/ST/STM32F1xx/IncludeDrivers/STM32F1xx_HAL_Driver/Inc標(biāo)準(zhǔn)庫同理需要把每個(gè)外設(shè)驅(qū)動(dòng)的頭文件目錄都加進(jìn)去。出現(xiàn)這類問題不要慌把路徑逐條捋一遍基本能解決。6.2 下載失敗No Target Connected 或 RDDI-DAP Error這個(gè)問題的高頻原因是接線、驅(qū)動(dòng)、供電三選一。先檢查 ST-Link 與板子的接線是否牢靠再用電腦的設(shè)備管理器查看驅(qū)動(dòng)是否被正確識(shí)別。如果設(shè)備管理器里 ST-Link 顯示黃色感嘆號(hào)重新安裝驅(qū)動(dòng)。另一個(gè)常見原因是開發(fā)板供電不足。某些小系統(tǒng)板依靠 ST-Link 供電但 ST-Link 輸出的 3.3V 電流有限如果板上有傳感器、OLED、WiFi 模塊同時(shí)取電一進(jìn)入燒錄過程電壓被拉低調(diào)試器就掉線了。解決方法是給開發(fā)板單獨(dú)接 USB 供電同時(shí)共地。6.3 編譯通過、燒錄成功但程序不運(yùn)行先檢查 Boot0 引腳的啟動(dòng)模式。STM32F103 的 BOOT0 接低電平時(shí)從主 Flash 啟動(dòng)接高電平時(shí)進(jìn)入系統(tǒng)引導(dǎo)或串口下載模式。如果你之前用串口下載過程序把 BOOT0 跳線跳回 0 再看。再一個(gè)常見原因是看門狗或者時(shí)鐘配置問題。比如初始化時(shí)把獨(dú)立看門狗IWDG使能了但主程序里沒有及時(shí)喂狗導(dǎo)致芯片一直復(fù)位。排查方法是先注釋掉所有看門狗相關(guān)代碼確認(rèn)程序能跑起來再說。6.4 中文亂碼問題MDK 默認(rèn)編輯器對(duì)中文的支持并不好。如果你在代碼注釋里寫中文或者用 OLED 顯示屏顯示中文經(jīng)常遇到亂碼。建議在 Edit - Configuration - Editor - Encoding 里把默認(rèn)編碼改為 UTF-8。但這里有個(gè)坑改編碼后之前用 GB2312 編碼保存的舊文件可能直接變成亂碼注意切換編碼時(shí)的備份。如果只是串口打印亂碼排查方向是代碼里的字符串編碼、串口波特率、目標(biāo)板晶振是否與你程序設(shè)置的時(shí)鐘一致。6.5 關(guān)于 License、授權(quán)和版本的一些提醒每次打開 MDK 時(shí)如果日志里出現(xiàn) FLEXlm Error 或 License 到期提示說明授權(quán)異常。評(píng)估版不需要額外激活但會(huì)有代碼量限制和彈窗提醒不影響學(xué)習(xí)使用。再次強(qiáng)調(diào)市面上流傳的注冊(cè)機(jī)類工具無論從合規(guī)性還是安全性上都不值得碰而是建議直接通過 ARM 官網(wǎng)購買 Node-Locked License。除非你只是用評(píng)估版做學(xué)習(xí)32KB 限制對(duì) STM32F103 常用外設(shè)實(shí)驗(yàn)完全夠用。6.6 其他高頻問題速查表現(xiàn)象常見原因處理建議編譯時(shí) AC6 報(bào)錯(cuò)老代碼依賴 AC5 語法切換編譯器到 Version 5下載算法不匹配DFP 缺失或選錯(cuò) Flash 算法更新 DFP在 Flash Download 里重新選調(diào)試時(shí)無法設(shè)置斷點(diǎn)編譯優(yōu)化等級(jí)太高將 Optimization 改為 -O0 或調(diào)試等級(jí)編譯變量未定義頭文件包含不全使用 Go To Definition 追蹤定位程序復(fù)位后時(shí)鐘不對(duì)外部晶振失效改用內(nèi)部時(shí)鐘確認(rèn)問題是否在晶振電路打開老工程報(bào)錯(cuò)缺少舊版 DFP安裝對(duì)應(yīng)的器件支持包7. 一些值得一提的典型應(yīng)用場(chǎng)景7.1 串口控制與 Modbus 通信STM32F103 配上 MDK 開發(fā)環(huán)境最常見的工業(yè)應(yīng)用就是串口控制和 Modbus 通信。很多傳感器、電表、PLC 都支持 Modbus-RTU而 ModbusPoll 這類上位機(jī)軟件可以直接與 STM32 下位機(jī)聯(lián)調(diào)。在 MDK 工程里串口接收最好配合中斷或 DMA否則高速率通信丟包會(huì)非常嚴(yán)重。拿 SPI 通過 DMA 方式讀取芯片數(shù)據(jù)為例用 CubeMX 配置 SPI 外設(shè)和 DMA 通道后生成的代碼里既有初始化流程也有 DMA 中斷回調(diào)之后用 MDK 編譯燒錄讀取 sensor 數(shù)據(jù)時(shí)效率比輪詢方式高幾個(gè)量級(jí)。類似的配置比如 AD7190 這種高精度 ADC 通過 SPI 讀取也可以用同一個(gè)套路。7.2 在 STM32F103 上移植 FreeRTOS很多人在 MDK 環(huán)境下把 FreeRTOS 移植到 STM32F103C8T6。核心步驟是在工程里加入 FreeRTOS 源碼中的 kernel 相關(guān)文件tasks.c、queue.c、list.c、portable 里的 GCC/ARM_CM3 移植文件然后配置 FreeRTOSConfig.h 里的宏定義。v5.43a 的編譯環(huán)境對(duì) FreeRTOS 非常友好只要把時(shí)鐘節(jié)拍源選好普通點(diǎn)燈演示基本一次成功。注意一點(diǎn)用 AC5 編譯 FreeRTOS 時(shí)棧對(duì)齊方式要符合 ARM AAPCS 標(biāo)準(zhǔn)開發(fā)頭文件里的 configTOTAL_HEAP_SIZE 不要開得太大C8T6 只有 20KB RAM給系統(tǒng)留足空間。7.3 音頻解碼和第三方庫移植熱搜詞里還有像“stm32f103移植minimp3解碼庫”這種需求。在 MDK 中移植第三方庫的思路幾乎一致將源碼文件加入工程把頭文件路徑和宏定義配置好然后處理與硬件相關(guān)的數(shù)據(jù)輸入輸出接口。minimp3 的特點(diǎn)是單文件、依賴少在 MDK 中移植時(shí)重點(diǎn)在于內(nèi)存分配解碼 MP3 至少需要幾十 KB 的 RAM 緩沖區(qū)所以不建議在 C8T6 這種小內(nèi)存芯片上解碼高碼率文件ZET6 這類大內(nèi)存型號(hào)會(huì)更合適。7.4 跨廠商芯片的工程移植有的項(xiàng)目要求把 STM32F103 的 HAL 庫工程移植到其他廠商同內(nèi)核芯片上比如 APM32。在 MDK 環(huán)境中做這件事大體思路是保留用戶應(yīng)用層代碼替換 CMSIS 設(shè)備頭和啟動(dòng)文件編譯鏈接層面則切換對(duì)應(yīng)的 DFP。這需要你對(duì)工程的每一個(gè)外設(shè)初始化代碼都做一次篩查因?yàn)椴煌瑥S商的寄存器和外設(shè)布局不是全部兼容。8. 關(guān)于環(huán)境搭建這件事的一些真心話從零搭一套 MDK-ARM v5.43a STM32F103 開發(fā)環(huán)境對(duì)老手來說也就十分鐘的事但對(duì)新手來說中間可能踩的坑確實(shí)不少。我在幫同事和學(xué)員排錯(cuò)時(shí)見過太多人卡在安裝路徑中文、DFP 版本不匹配、調(diào)試器驅(qū)動(dòng)這些并非不可逾越的問題上。我的實(shí)際體會(huì)是搭建開發(fā)環(huán)境這件事最重要的是“固定”和“最小化”。固定指的是選定一個(gè)版本組合之后不要再頻繁升級(jí)尤其不要在生產(chǎn)項(xiàng)目做到一半時(shí)去換編譯器或 DFP 版本。最小化指的是出了問題不要一下子懷疑編譯器、懷疑庫、懷疑電腦先用最小工程驗(yàn)證硬件通路再逐步添加代碼。如果你剛開始接觸 STM32F103建議從一塊最小系統(tǒng)板加一個(gè) ST-Link 開始不要去碰那些功能復(fù)雜的大板子先把點(diǎn)燈跑通再逐步加串口、SPI、DMA、FreeRTOS。環(huán)境穩(wěn)定之后你會(huì)發(fā)現(xiàn) MDK v5.43a 這個(gè)“老版本”反而是讓你最安心能出活的工具。