尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

KEIL MDK-ARM下载安装与STM32开发环境配置全攻略

KEIL MDK-ARM下载安装与STM32开发环境配置全攻略 拿到新电脑的第一件事我通常不是装桌面美化而是把 KEIL MDK-ARM 装好。这个软件在嵌入式圈子里几乎是 ARM Cortex-M 开发的默认起点但它的下载安装却不像名字看起来那么简单有人装了 Keil C51 之后建不了 STM32 工程有人装完 MDK 却发现设备列表里找不到 STM32F103C8T6还有人明明编译成功却下载不进芯片。这篇文章以 STM32 为主线把 MDK-ARM 从官网下载、安装、授权处理、Pack 安装、调试器配置到最小工程跑通的完整链路拆开讲清楚适合刚开始接触 ARM 开发、正准备搭开发环境的新手也适合每次配新机器都想少踩坑的老手。1. 先搞明白MDK-ARM、C51和AC5/AC6之间是什么关系1.1 同品牌不同套件C51 与 MDK-ARM 的区别如果你直接搜索“Keil 下载”大概率会看到一个叫 Keil C51 的版本。这个名字很容易让人误解以为下载它就能开发 STM32。实际上Keil 只是一个 IDE 外壳品牌uVision 是同一个外壳但内部分成了多条产品线Keil C51 面向 8051 系列MDK-ARM 面向 ARM Cortex-M/A/R 系列。两边的编译器、设备支持包、License 都是独立的。做 STM32、GD32、NXP 这些 ARM Cortex-M 芯片必须使用 MDK-ARM而不是 C51。之前有一个朋友装的是 C51建工程时 Type 下拉列表里只有 8051甚至没有 ARM 编译器选项折腾了半天。其实只要找到正确的 MDK-ARM 安装包重装问题就解决了。如果电脑里已经装了 C51再装 MDK-ARM 也不需要卸载两个套件可以共存但安装路径建议分开比如一个放在C:\Keil_C51一个放在C:\Keil_v5避免工具链配置互相干扰。很多网上的“一键安装”版本也会把两者打包在一起看起来省事实际上容易造成 IDE 关联混乱我建议还是分别去官网下载需要的套件。1.2 编译、链接、下载MDK 帮你干的活一个嵌入式工程从源码到芯片内的运行需要经过编译、链接、烧写、调试。MDK-ARM 把这些步骤全部集成在 uVision5 里但这并不代表配置可以乱点。每个环节都会用到不同的配置编译阶段需要编译器ARM Compiler 5 或 6链接阶段需要芯片的启动文件和分散加载文件烧写阶段需要调试器驱动和 Flash 算法调试阶段需要调试协议和 SVD 外设描述。MDK-ARM 的安装包默认只提供 IDE、编译工具链和一些基础补丁目标芯片的具体支持包往往需要单独安装。这也是很多人“明明装好了却发现用不了”的根源。安装配置时心里有这根链路后面每一步报错都能快速定位到具体环节。比如编译报错先怀疑编译器版本下载报错先怀疑 Flash 算法和调试器设置。有了这个全局观接下来的操作就不是机械点击而是有的放矢。2. 下载 MDK-ARM官网、版本和安装前准备2.1 从官网下载还是第三方网站到官网 keil.arm.com 的 Download 页面找到 MDK-ARM下载最新的 Windows 版本。现在 MDK 安装包体积动辄几百 MB文件名类似mdk_539.exe下载时要看清名称别下成了 C51 的c51v961.exe。有些第三方下载站会把它和 C51、老版本混在一起还存在捆绑软件或者被修改过的风险我个人不建议为了省几步点击去用那些打包好的“一键安装版”。如果官网访问速度慢可以去各大芯片厂商的资料页下载ST、NXP、Renesas 的官网都会放 MDK 的下载入口和配套 Pack渠道同样正规。下载完最好核对一下文件大小和官网标称是否一致差异过大就果断删除重下。这个习惯看似多余但能避免很多安装中途解压失败的问题尤其是公司网络不稳定的时候。2.2 选哪个版本MDK 5 还是老版本AC5 还是 AC6MDK 4 早已停止更新新项目直接选 MDK 5 就好。MDK 5 从 5.35 以后逐渐开始把 AC5 标记为“旧编译器”到了 5.37 之后安装包默认只装 AC6。AC6 基于 Clang编译速度更快、诊断信息更贴近 GCCAC5 是老牌编译器很多老工程和延时函数基于 AC5 的优化行为直接切到 AC6 可能会遇到一些 warning 甚至 error。这就带来一个非常现实的坑你下载的网课或开发板例程可能是两年前用 AC5 写的打开后工程设置里写着“ARM Compiler 5”而你的 MDK 里根本没有 AC5编译第一轮就报“Target uses ARM-Compiler 5 but not installed”。解决办法有两种一是在安装 MDK 时勾选 Legacy 相关组件把 AC5 一起装上二是打开工程后手动将编译器切换为 AC6然后根据报错逐一修改。新手建议直接学 AC6老例程作为参考阅读即可不要被旧工具链拖住。2.3 安装前的三个准备动作第一个准备动作是右键安装包“以管理员身份运行”避免写入 Keil 目录时权限不足。第二个准备动作是路径规划直接使用默认路径C:\Keil_v5不要放在桌面或带中文的路径下。MDK 的编译器、下载算法和 Pack 很多都是按默认路径去查找的路径一旦有中文或空格轻则工程无法打开重则导致一些第三方组件找不到文件。第三个准备动作是提前下载目标芯片的离线 Pack。如果你已经知道自己用的是 STM32F103C8T6那就去官网 Pack 页面搜STM32F1xx_DFP先把.pack文件下载到本地。后面安装 Pack 时可以离线双击导入省去在线刷列表的等待时间。这三个准备动作看着不起眼但能直接决定安装过程是顺滑还是艰难。3. 安装向导与 License这些细节决定成败3.1 安装过程中三步关键操作安装向导本身很简单基本是 Next 到底。但有几个地方值得留意。第一选择安装目录时不要改成C:\Program Files (x86)\Keil_v5之类带空格和权限限制的路径默认的C:\Keil_v5就够了。第二如果安装界面出现了和“Legacy Support”或“ARM Compiler 5”相关的组件建议勾选。很多网上流传的老例程还是 AC5 写的先装上能省去后面找编译器的麻烦。第三安装完成后会自动弹出 Pack Installer第一次启动会联网刷新 Pack 列表。这时候不要急着关掉但也别让它长时间挂在那边下载一个巨大的全部 Pack。正确做法是看到列表刷出来后只搜索自己需要的芯片型号点击 Install 安装。如果这一步卡住没反应可以直接跳过后面用离线包安装。不要在正在更新时报错时强制结束进程那样容易留下损坏的缓存文件下一次启动又得清理。3.2 License评估版、正版授权和合规选择MDK-ARM 是商业软件安装后第一次编译时会有 License 提示。如果你没有正版授权可以选择评估模式。官方评估版对代码体积有限制一般是 32KB 左右具体以官网当前说明为准。对于学习 STM32 的基础外设这个限制完全够用但工程稍微膨胀就会遇到编译错误。个人学生可以查询学校是否有校园授权公司开发者正常走采购流程。预算有限的朋友也可以直接考虑 STM32CubeIDE、VS Code arm-none-eabi-gcc 这套免费方案它们几乎能覆盖 MDK 的日常功能。我的态度是工具可以换但别用非官方激活手段。嵌入式开发每天要接触大量芯片资料和代码保持工具链干净能少掉很多奇怪问题。那些来路不明的“激活补丁”不仅可能破坏工具链还可能引入恶意代码得不偿失。3.3 安装后目录结构认识 Keil_v5安装完成后的目录值得花两分钟熟悉一下。C:\Keil_v5\UV4是 uVision 主程序C:\Keil_v5\ARM\ARMCLANG是 AC6 编译器C:\Keil_v5\ARM\ARMCC是 AC5 编译器如果你安装了C:\Keil_v5\ARM\PACK是所有设备支持包C:\Keil_v5\ARM\Flash是 Flash 编程算法的默认位置。这些目录在解决编译、下载问题时会反复用到。比如打开一个旧工程却报找不到启动文件先看看 PACK 目录下有没有对应厂商的版本文件夹报找不到编译器的错误路径就去 ARM 目录下面确认编译器是否存在。很多人遇到问题第一反应是重装 MDK其实把目录结构搞清楚很多问题都能精确定位到具体文件根本不用重装。4. 配置设备支持包与调试器让工具链认识你的芯片4.1 用不用 Pack区别非常大MDK 5 的核心变化就是 Pack 机制。一个 Pack 文件本质上是一个压缩包里面包含芯片型号定义、内存布局配置、启动文件、Flash 下载算法、SVD 外设描述文件以及示例工程。没有正确安装 Pack你会在 Select Device 里找不到芯片或者下载时提示 Flash Algorithm 缺失。正确操作是打开 Pack Installer在 Search 框输入芯片型号比如STM32F103C8T6点击右侧 Install。如果在线刷新列表失败就采取离线安装在官网 Pack 页面找到Keil.STM32F1xx_DFP最新版下载.pack文件关闭 uVision双击安装。安装完成后重新打开工程Device 列表里就能看到对应 ST 系列了。这个步骤是安装配置过程中最容易忽略的也是“装好了但用不了”的头号原因。4.2 调试器配置ST-Link 还是 J-Link打开工程后按下 AltF7 进入 Options for Target在 Debug 页签里选择调试器。板上如果集成 ST-Link就选ST-Link Debugger如果是 J-Link 就选J-LINK还有一些开发板用 CMSIS-DAP就选对应的选项。选完之后点旁边的 Settings如果可以正常探测SW Device 区域会显示类似0x1BA01477的 IDCODE 或调试器序列号。如果这里显示空白问题往往出在硬件连接而不是软件。SWDIO、SWCLK、GND 三根线是否接对目标板是否独立供电复位引脚有没有被外部电容拉低这些都需要逐一排查。另外老版本 ST-Link 在部分 Windows 10/11 系统上可能需要安装专用驱动能在 ST 官网找到。调试器能识别到芯片之后后面下载程序才谈得上。4.3 Utilities 与 Flash 下载算法Debug 页签旁边的 Utilities 页签同样关键。下载烧写时MDK 会调用调试器接口和 Flash 下载算法。很多“Flash Download failed - Cortex-M3”报错都是因为 Utilities 页中的编程算法没有选到对应芯片的型号。正确做法是Utilities - Settings - Flash Download检查 Programming Algorithm 列表里是否有STM32F1xx 256KB Flash这种对应算法。没有就点 Add从 Pack 带来的列表里加进去。勾选 Erase Full Chip 或 Erase Sectors一般选 Erase Sectors 更快。完成配置后下载成功率会大幅提升。这个算法文件就是理解成“烧录器给芯片 Flash 用的驱动程序”如果驱动不对IDE 当然不知道如何把你的 hex 写进芯片。4.4 顺手配置编码避免中文注释乱码嵌入式程序员不可能不在注释里写中文。MDK 默认的编辑器编码是 ANSI如果你习惯 UTF-8 保存文件注释会显示乱码甚至编译警告。建议在 Edit - Configuration - Editor - Encoding 里选择UTF-8。但要注意如果你打开的是一个老工程源文件本身就是 GB2312/ANSI 保存的这时把 IDE 改成 UTF-8老文件反而会乱码。所以编码设置要根据工程来源决定新工程统一用 UTF-8老工程保持 ANSI。这个细节虽然和下载安装无关但每次配新电脑都会遇到顺手设置一下能省很多事。5. 从装好到跑通STM32F103C8T6 最小工程实操5.1 新建工程并添加启动文件启动 uVision点 Project - New uVision Project选择保存目录和工程名。随后弹出的 Device 窗口按路径选择STMicroelectronics - STM32F1 Series - STM32F103C8。弹窗询问是否复制启动文件到工程目录时选“是”。这一步会自动添加startup_stm32f103xb.s启动文件。很多新手不理解为什么工程里必须有一个.s文件它是芯片上电后的第一段代码负责设置堆栈、调用 SystemInit最后跳转到 main。没有它C 代码根本跑不起来。启动文件由 Pack 提供所以你前面 Pack 装没装对在新建工程这一步就能看出来。如果 Device 列表里找不到 STM32F103C8大概率就是 Pack 没有装好回头补装即可。5.2 写一个能点灯的 main.c创建一个main.c并添加到 Source Group 1输入下面的代码。这里用寄存器操作不依赖任何库最适合作安装完成后的“冒烟测试”。#define RCC_BASE 0x40021000U #define GPIOC_BASE 0x40011000U #define RCC_APB2ENR (*(volatile unsigned int *)(RCC_BASE 0x18)) #define GPIOC_CRH (*(volatile unsigned int *)(GPIOC_BASE 0x04)) #define GPIOC_ODR (*(volatile unsigned int *)(GPIOC_BASE 0x0C)) void delay(void) { volatile unsigned int i; for (i 0; i 500000U; i) {} } int main(void) { RCC_APB2ENR | (1U 4); // 开启 GPIOC 时钟 GPIOC_CRH ~0x0000000FU; // PC13 设为推挽输出 GPIOC_CRH | 0x00000001U; while (1) { GPIOC_ODR ^ (1U 13); delay(); } }这里用 PC13 是因为很多 STM32F103 最小系统板板载 LED 接在 PC13如果板子不同调整引脚和时钟即可。代码简单只验证工具链是否正常不涉及库的兼容问题也是最容易排查问题的写法。5.3 编译、生成 Hex 和下载打开魔法棒Options for Target在 Output 页签勾选 Create HEX File。在 Target 页签确认 ARM Compiler 是 AC6 或你期望的版本。C/C 页签的优化建议先选 -O0便于调试观察变量。按 F7 编译看到0 Error(s), 0 Warning(s)后把 ST-Link 连到开发板点击 Download。正常情况下会弹出 “Flash Download: Programming 8 KB ...” 的信息随后提示成功。复位板子LED 开始闪烁。到这里软件的下载、安装、配置、编译、下载、运行这一整条链路都通了。以后再踩坑时至少能确认基础环境没问题问题出在代码或工程配置上。5.4 下载失败时按这个思路去查下载失败往往不是某一个点而是整个链路中哪一环断了。按这个顺序查Debug 设置里是否选对调试器和驱动Settings 是否能探测到设备接线是否正确GND 是否共地Utilities 里的 Flash 算法是否正确板子供电是否足够部分 USB 口供电不足也会导致连接不稳定最后再怀疑芯片锁死或复位问题。先按这五步走80% 的问题都能解决。不要一上来就怀疑芯片烧了绝大多数下载失败都是调试器设置和接线问题。6. 装完后遇到的高频报错与查看结构体的技巧6.1 Pack Installer 报错怎么离线安装热词里出现“keil pack install 硬件错误”这个词很有迷惑性听起来像芯片烧了其实通常是软件层面的网络或缓存问题。我遇到过的几种表现打开 Pack Installer 后列表刷新不出来点安装到一半停止或者弹出一个很模糊的错误框。这时候不要反复点安装先做三件事第一关闭杀毒软件的实时防护以管理员身份重新打开 uVision第二删除 Pack 下载缓存目录C:\Keil_v5\ARM\PACK\.Download和.Web下残留的临时文件第三到 Keil 官网 Pack 页面手动下载对应芯片厂商的 DFP 离线包关闭 uVision双击.pack文件安装。离线包安装是最稳妥的尤其是企业网络有访问限制或者家里网络不稳定的场景。手动放置解压文件这种操作尽量别做容易漏文件且难排查。6.2 找不到编译器或头文件的处理思路老工程打开后编译报 “Target uses ARM-Compiler 5 but not installed”别急着改代码。这是工程当初用 AC5 创建而当前 MDK 只装了 AC6。两种选择一是安装 ARM Compiler 5二是在 Options for Target 里把编译器切换为 AC6然后根据报错修改代码。切到 AC6 会有一些警告比如#pragma语法差异、__attribute__书写形式不同但都相对好改。另一类报错是找不到core_cm3.h等 CMSIS 头文件。这个问题从工程层面基本解决不了回到 Pack 检查你是不是装了对应芯片系列的 DFPCMSIS 核心文件在 DFP 内部DFP 没装自然找不到。装完 Pack 后把工程关闭再重新打开然后清理一下编译输出再 Build基本能好。6.3 调试模式下怎么看结构体变量“keil调试助手里面的debug模式如何显示结构体变量”也是不少人问的问题做嵌入式开发几乎天天遇到。先说结论在 Debug 模式下打开 View - Watch Window - Watch 1然后把变量名拖进去或直接输入变量名。如果结构体是当前作用域可见且没有被优化掉变量名前面会有展开箭头点开即可看到每一个成员值。但很多人遇到在 Watch 窗口里显示not in scope或数值不对绝大多数是编译器优化导致的。解决办法是在 Options for Target - C/C - Optimization 里把优化级别降到 -O0重新编译后再调试如果变量只在某函数内使用把断点停在该函数的内部行给变量加上volatile修饰避免被优化成寄存器变量后无法观察。如果想直接看某个结构体指针指向的内容可以在 Watch 窗口添加表达式比如*(MyStruct*)0x20000000这种地址强制转换的方法在排查复杂指针时非常有用。6.4 配新机器时保留一个模板工程每次配新电脑都会重新下载 MDK、装 Pack、配调试器工程配置也经常丢。现在我习惯在网盘里存一个“最小工程模板”包括启动文件、一个最简单的 main.c、配置好的 Debug/Utilities、甚至带一个 LED 闪烁例程。新环境装完 MDK 后直接打开模板工程改一下芯片型号就能用。这个习惯帮我省了不少时间也推荐给你。模板工程别选太复杂的库能跑通下载和调试就够了等到真正做项目时再按需往里面加外设、库和中间件。哪怕只是一年一次的电脑更换这个模板也能让整个环境搭建时间从几小时压缩到半小时以内。
返回列表