资讯详情

资讯详情

Keil MDK-ARM 5 嵌入式开发环境搭建与配置实战指南

1. 嵌入式开发环境搭建的起点搞嵌入式开发绕不开的第一个坎就是装工具链。不管你后面是要点灯、调串口、跑RTOS还是搞USB协议栈第一步永远是让编译器和调试器在电脑上跑起来。MDK-ARM 5大家更习惯叫它Keil 5就是ARM Cortex-M系列MCU开发里用得最广的一个集成开发环境没有之一。它把编辑器、编译器、链接器、调试器、烧录工具全部打包在一起装完之后基本可以做到“开箱即用”不需要你再去手动拼凑GCC、OpenOCD、GDB那一套。这篇内容适合谁看如果你是刚入行的嵌入式新手手里拿着一块STM32或者GD32的开发板完全不知道从哪下手那这篇就是写给你的。如果你是从IAR或者老版本Keil 4迁移过来的老手也可以看看里面关于Pack Installer和器件支持包的细节能帮你少走弯路。我会从下载、安装、激活、器件包管理、工程创建、编译配置、调试器设置这几个环节一步步拆开讲把每个步骤背后的原因也一并说清楚让你不只是“照着点”而是真正理解这套工具链是怎么运转的。需要提前说明的是Keil 5和Keil 4最大的区别在于器件支持包Device Family Pack简称DFP的引入。Keil 4时代你装一个版本就固定支持那几家的芯片想换芯片型号往往要重装或者打补丁。Keil 5把内核、编译器、器件支持彻底解耦了IDE本体只负责框架具体芯片的支持通过Pack Installer在线下载。这个设计思路很像现代浏览器的插件机制好处是灵活坏处是新手第一次装完之后发现“怎么找不到我的芯片”其实只是包没装而已。2. 安装前的准备工作与版本选择2.1 安装包从哪里获取Keil MDK-ARM 5的官方安装包只有一个来源就是Keil官网现在归属Arm旗下。搜索“MDK-ARM”就能找到下载页面填写一个简单的表单姓名、邮箱、公司、国家之后就能拿到下载链接。安装包是一个大概800MB到1GB左右的exe文件版本号格式类似MDK537.exe这种前面的5代表Keil 5后面的数字是具体版本。这里有个经验不建议盲目追最新版本。我踩过的坑是某些新版本刚发布时对老器件的支持包兼容性会有问题尤其是那些已经停产的Cortex-M0/M3老芯片。如果你做的是新项目用最新版没问题如果是维护老项目建议用比项目立项时间晚半年到一年的版本稳定性最好。比如项目是2020年做的用MDK 5.30到5.33这个区间通常比较稳。另外要注意官网下载的是MDK-ARM完整版不是那个免费的MDK-Lite。完整版安装后如果不激活会以Lite模式运行代码大小限制在32KB。对于学习点灯、串口收发这种小工程完全够用但一旦你的工程超过32KB编译就会报错。所以后面激活这一步是必须做的。2.2 系统环境要求Keil 5对系统要求不算高但也有几个硬性条件项目最低要求推荐配置操作系统Windows 7 SP1Windows 10/11 64位处理器1GHz2GHz以上多核内存2GB8GB以上硬盘空间2GB可用10GB以上Pack包很占地方显示器1024x7681920x1080特别提醒两点。第一安装路径绝对不要带中文和空格。默认路径是C:\Keil_v5这个就很好别手贱改成D:\我的软件\Keil 5后面编译时各种莫名其妙的路径错误能把你逼疯。第二如果你电脑上已经装了Keil 4或者更早的版本建议先卸载干净再装Keil 5两个版本共存虽然理论上可以但注册表里的编译器路径会打架导致编译时调用了错误的armcc。2.3 安装过程中的关键选项双击安装包之后前面几步都是常规的下一步到了选择组件的界面要留意一下。安装程序会列出几个可选项Core核心组件必装包含IDE本体和ARM编译器。Device Specific器件相关的示例和库可以不装后面用Pack Installer按需下载。Pack Installer器件包管理器必装这是Keil 5的灵魂。CMSISARM官方的一套软件接口标准建议装很多库依赖它。我的建议是Core、Pack Installer、CMSIS三个勾上Device Specific不勾。原因很简单Device Specific里预置的那些示例工程往往版本很老你后面从Pack Installer下载的才是最新的装了反而占地方还容易混淆。安装过程大概需要5到10分钟取决于硬盘速度。装完之后第一次启动IDE会提示你安装Pack这时候先别急着装把激活搞定再说。3. 激活与License管理3.1 为什么必须激活前面说了不激活就是Lite模式32KB代码限制。这个限制在什么概念呢一个简单的HAL库点灯工程编译出来大概6到8KB加上串口打印、定时器、中断可能到15KB一旦你上了RTOS或者USB协议栈轻松突破32KB。所以只要你不是纯粹玩玩激活是必须的。激活需要申请一个License。Keil提供几种License类型个人学习可以申请免费的社区版Community Edition商业用途需要购买。社区版的申请流程很简单在Keil官网注册账号填写用途说明一般几个工作日内会收到License文件。3.2 激活操作步骤拿到License之后打开Keil 5点击菜单栏的File-License Management会弹出一个对话框。对话框里有一个CIDCustomer ID字段这是一串基于你电脑硬件生成的唯一标识。把CID复制出来粘贴到Keil官网的License申请页面提交后会生成一个License字符串再把它粘贴回对话框的New License ID Code输入框点击Add LIC就完成了。注意CID是和电脑硬件绑定的换主板或者重装系统后CID会变需要重新申请License。所以建议把License文件备份好换系统后直接重新添加即可。激活成功后对话框上方会显示License的过期日期和代码大小限制看到Unlimited就说明搞定了。3.3 常见激活问题有时候添加License会提示“Invalid License”大概率是CID复制时带了空格或者换行。解决方法是把CID粘贴到记事本里确认是一串连续的字符再复制过去。还有一种情况是License已经绑定到其他电脑了社区版一般允许绑定两台设备如果超了需要先在官网解绑旧设备。4. Pack Installer与器件支持包管理4.1 Pack Installer是什么Pack Installer是Keil 5区别于Keil 4的核心组件。你可以把它理解成一个应用商店里面按芯片厂商分类列出了各家MCU的支持包。每个支持包DFP里包含该系列芯片的启动文件startup_xxx.s外设寄存器定义头文件系统初始化代码system_xxx.cFlash烧录算法调试配置文件示例工程没有装对应的DFP你在新建工程时就找不到那颗芯片编译也会报错说找不到器件。4.2 如何安装器件包打开Pack Installer工具栏上那个绿色小盒子图标左侧是厂商列表右侧是包列表。找到你用的芯片厂商比如STMicroelectronics展开后找到对应的系列比如STM32F1 Series再找到具体型号的DFP点击Install。这里有个坑Pack Installer的下载服务器在国外国内下载速度可能很慢甚至超时。解决办法是使用离线包。各家厂商的DFP也可以从官网单独下载下载下来是一个.pack文件双击就能安装不需要通过Pack Installer在线下载。我一般会提前把常用的几个系列的pack文件都下载好放在本地换电脑时直接双击安装比在线等快得多。4.3 器件包版本选择同一个系列可能有多个版本的DFP比如STM32F1系列有2.3.0、2.4.0等。选哪个原则是选新不选旧但别选太新。新版本通常修复了bug、增加了新器件支持但偶尔会引入兼容性问题。如果你用的是比较成熟的芯片型号用比最新版早一两个小版本的DFP通常最稳。安装完DFP之后新建工程时在Device选择框里就能搜到你的芯片了。如果搜不到检查一下是不是Pack Installer里没装对应的包或者装完之后没有重启IDE。5. 新建工程与编译配置5.1 从零创建一个工程点击Project-New uVision Project选择一个空文件夹作为工程目录。注意工程路径同样不能有中文和空格。然后会弹出器件选择窗口搜索你的芯片型号选中后点击OK。接下来会弹出一个“Manage Run-Time Environment”窗口这是Keil 5的另一个特色功能叫RTERun-Time Environment。它允许你直接勾选需要的软件组件比如CMSIS Core、Device Startup、HAL库等IDE会自动把对应的源文件和头文件路径添加到工程里。对于新手来说这个功能非常方便省去了手动添加文件的过程。不过我的习惯是不用RTE手动管理文件。原因有两个一是RTE自动添加的文件路径很深工程迁移时容易出问题二是手动添加能让你清楚知道每个文件是干什么的对理解工程结构有帮助。当然如果你只是想快速跑个Demo用RTE也没问题。5.2 手动添加启动文件和库文件一个最简的STM32工程需要哪些文件启动文件startup_stm32f103xb.s根据具体型号选系统文件system_stm32f1xx.c链接脚本STM32F103xB_FLASH.ldKeil用的是.sct分散加载文件在Options里配置库文件标准外设库或者HAL库的.c文件主文件main.c把这些文件添加到工程的不同Group里比如Startup、CMSIS、Library、User结构清晰后面维护方便。5.3 编译选项配置点击Options for Target魔术棒图标有几个关键配置Target标签页设置晶振频率Xtal这个值影响调试时的时序计算填你板子上的实际晶振频率比如8MHz或者12MHz。Output标签页勾选Create HEX File这样编译后会生成hex文件方便用其他工具烧录。Debug Information也勾上调试时需要。C/C标签页在Define里填入宏定义比如STM32F103xB, USE_HAL_DRIVER。在Include Paths里添加所有头文件所在目录。这里有个技巧头文件路径要加到最底层的公共目录而不是每个子目录都加否则路径列表会非常长。Debug标签页选择调试器比如ST-Link Debugger或者J-LINK。旁边的Settings里可以配置烧录算法和调试接口SWD还是JTAG。5.4 编译与常见报错配置好之后按F7编译。常见的报错和解决方法报错信息原因解决方法cannot open source input file xxx.h头文件路径没加在Include Paths里添加对应目录undefined symbol xxx源文件没加到工程把对应的.c文件添加进来region RAM overflowed内存不够优化代码或换更大内存的芯片L6218E: Undefined symbol函数声明了但没实现检查是否漏了.c文件Error: Flash Download failed烧录算法没选对在Debug Settings里选正确的Flash算法编译通过后Output窗口会显示0 Error(s), 0 Warning(s)并给出代码大小信息。如果Warning很多别忽视很多运行时的问题都是Warning积累出来的。6. 调试器配置与程序烧录6.1 调试器选型常见的调试器有ST-Link、J-Link、DAPLink等。ST-Link是ST官方出的便宜好用支持SWD接口配合STM32芯片很稳。J-Link性能更强支持更多芯片但价格贵。DAPLink是开源的性价比高适合DIY。在Keil里配置调试器Options for Target-Debug下拉框里选对应的调试器。然后点Settings在Debug标签页里确认能识别到芯片ID。如果识别不到检查接线SWD需要接SWCLK、SWDIO、GND、VCC四根线有时候还需要接RESET。6.2 Flash烧录算法配置在Settings的Flash Download标签页里需要添加对应的Flash算法。比如STM32F103xB的算法是STM32F10x High-density Flash。如果列表里没有说明DFP没装好或者版本不对。选好算法后下面的地址范围会自动填充确认起始地址是0x08000000STM32的Flash起始地址。提示如果烧录时提示“Flash Download failed - Target DLL has been cancelled”大概率是Flash算法选错了或者芯片处于读保护状态。前者换算法后者需要用工具解除读保护。6.3 在线调试技巧配置好调试器后按CtrlF5进入调试模式。常用的调试操作断点在代码行号旁边点击出现红点就是断点。程序运行到断点会暂停。单步执行F11是Step Into进入函数F10是Step Over跳过函数。查看变量把鼠标悬停在变量上或者把变量拖到Watch窗口。查看寄存器在View菜单里打开Registers窗口可以看R0-R15、SP、PC等。查看内存View - Memory Windows输入地址可以查看内存内容。我个人的经验是调试时优先看外设寄存器的值比看变量更直接。比如串口没输出先看USART的CR1寄存器里UE位和TE位有没有置1再看BRR寄存器的分频值对不对基本就能定位问题。7. 实操心得与避坑指南7.1 工程目录结构规范我见过太多新手把所有的.c和.h文件堆在一个文件夹里工程大了之后根本没法维护。建议的目录结构Project/ ├── CMSIS/ # 内核相关文件 ├── Drivers/ │ ├── STM32F1xx_HAL_Driver/ # HAL库 │ └── CMSIS/ # 器件头文件 ├── Inc/ # 用户头文件 ├── Src/ # 用户源文件 ├── Startup/ # 启动文件 └── MDK-ARM/ # Keil工程文件这样分的好处是换IDE或者迁移工程时只需要改MDK-ARM目录其他源码目录可以原封不动。7.2 编译速度优化Keil默认是单线程编译工程大了之后编译一次要几分钟。可以在Options for Target-Output里勾选Browse Information关掉能省不少时间。另外C/C标签页里的Optimization级别调试阶段用Level 0不优化方便单步跟踪发布阶段用Level 3最高优化代码体积和速度都更好。7.3 常见问题速查问题一编译提示“cannot open source input file core_cm3.h”这是CMSIS核心头文件找不到。解决方法是确认DFP装好了并且在Include Paths里添加了CMSIS/Include目录。问题二烧录后程序不运行先检查启动文件里的堆栈大小是否够用再检查中断向量表是否偏移正确。如果是BootloaderApp的结构App的向量表需要重映射。问题三调试时进不了main函数大概率是启动文件里的Reset_Handler有问题或者时钟初始化卡住了。可以在SystemInit函数里加个断点看能不能走到。问题四Pack Installer下载速度极慢用离线pack文件前面说过了。另外Pack Installer的缓存目录在C:\Users\用户名\AppData\Local\Arm\Packs可以把下载好的pack文件直接拷进去重启IDE就能识别。7.4 版本迁移注意事项从Keil 4迁移到Keil 5最大的变化是器件包管理方式。Keil 4的工程文件.uvproj不能直接在Keil 5里打开需要先转换成.uvprojx格式。转换过程中器件选择、头文件路径、库文件引用都可能需要手动调整。我的建议是不要直接转换而是新建工程把源码文件重新添加一遍这样能顺便清理掉一些历史遗留的冗余配置。从标准外设库迁移到HAL库也是类似的情况。HAL库的API和标准库完全不同函数名、参数、返回值都不一样直接替换文件是编译不过的。需要逐个外设重写初始化代码。这个过程很痛苦但HAL库的跨系列兼容性更好长期来看是值得的。8. 工具链的延伸与扩展Keil 5装好之后其实还有很多可以折腾的地方。比如可以配置外部编辑器VS Code、Sublime Text来写代码Keil只负责编译和调试。方法是在Options for Target-Output里勾选Browse Information然后在VS Code里装Keil Assistant插件就能在VS Code里直接调用Keil的编译命令。还可以配置版本控制把工程里的.uvprojx、.uvoptx、源码文件纳入Git管理但Objects、Listings、DebugConfig这些编译产物目录要加到.gitignore里。这样多人协作时每个人拉下来代码就能直接编译不会因为路径问题打架。另外Keil 5支持命令行编译用UV4.exe -b project.uvprojx -o build.log就能在CI流水线里自动编译。这个对于需要持续集成的项目很有用每次提交代码后自动编译一遍能及早发现编译错误。最后分享一个我个人的习惯每装好一个环境先跑一个最小系统验证。不要急着上复杂功能先写一个空的main函数编译烧录确认能进调试、能看变量、能单步执行。这个最小系统跑通了说明工具链没问题后面再出问题就是代码问题排查范围小很多。这个习惯帮我省了无数次“到底是环境问题还是代码问题”的纠结。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →