资讯动态

Keil5新建STM32工程全流程:从芯片Pack到编译下载避坑指南

发布时间:2026/10/2 3:48:31 来源:尧图企业网站定制
1. 新建工程之前的准备工作1.1 安装包与芯片支持包缺一不可先说个最常见的坑很多人下载了Keil5 MDK装完打开发现Device列表里空空如也什么都没有。这不是软件坏了而是你少装了芯片支持包Device Pack。Keil5和Keil4最大的区别就在这里。Keil4是集成式装了主程序就自带各种芯片的支持Keil5改成了插件式结构主程序只是一个壳具体支持哪家芯片完全由后装的Pack决定。你把Keil5想象成一个手机刚买回来是裸机装了什么App才能干什么事——想用STM32就得装ST的器件支持包想用NXP就得装NXP的。所以新建工程之前先确认两件事第一MDK主程序已经正确安装并且能正常打开。安装路径建议保持默认的C:\Keil_v5不要装在中文路径或带空格的路径下不然编译链接阶段容易出现莫名其妙的问题。安装最后一步会提示是否安装ULINK驱动如果你用J-Link或者ST-Link调试可以取消省得装一堆用不上的驱动。第二芯片支持包已经安装。最省事的方式是第一次打开Keil5时它会自动弹出Pack Installer窗口在右下角的Pack列表里找到STMicroelectronics这一系列展开对应芯片型号下载。如果没弹出来就点工具栏上那个绿色的方块图标Pack Installer手动打开。下载Pack需要注意Pack Installer对网络要求比较高国内网络经常下载到一半卡住进度条纹丝不动。遇到这种情况推荐直接去Keil官网keil.com/dd2/pack/下载对应的Pack压缩包然后用Pack Installer左下角的File - Import按钮离线导入速度稳定还支持断点续传。STM32F103系列对应的包名是Keil.STM32F1xx_DFP.x.x.x.pack后缀带日期和版本号选最新版就行。1.2 关于C51和MDK的共存问题另一个新手高频问题我装了支持8051的Keil C51又装了MDK能不能共存能不能双击一个图标直接选答案是可以共存但需要手动处理一下。默认情况下C51和MDK的安装目录是不同的比如C51装到C:\KeilMDK装到C:\Keil_v5。两个软件各自独立运行互不影响。麻烦的地方在于一个新建的.uvproj工程文件系统默认用哪个打开取决于文件关联而这个关联经常被后装的版本抢走。如果你想在一台电脑上同时用C51写8051、用MDK写STM32我建议不要折腾文件关联直接各自从开始菜单打开对应的Keil.exe就行。C51的程序入口和MDK完全不同一个叫Keil C51一个叫Keil MDK记忆成本不高反而是最省心的方案。还有一点要提醒千万别想着把C51的插件复制到MDK目录里实现二合一网上有些老教程这么干。MDK5之后核心改动太大老方法基本失效还有可能把环境搞崩。老老实实两个目录分开装各用各的最稳。1.3 选对芯片型号别把F1当F4用新建工程时选择芯片型号一定要精确到具体型号而不是只看内核。STM32F103C8T6和STM32F103ZET6虽然同属F1系列但Flash大小、引脚数完全不同选错了后面配置启动文件、设置Flash容量都会出问题。具体怎么选在Device选项卡里按厂商展开STMicroelectronics - STM32F1 Series - STM32F103 - 找到你的具体型号。选完之后右侧会显示这个芯片的内核、主频、Flash和RAM大小确认和你的实物一致再点OK。顺便说一个细节如果你用的是国产替代芯片比如GD32F103或者APM32F103需要看情况选型号。有些国产芯片和ST完全兼容可以用STM32F103C8T6的型号直接建工程但有些国产芯片的外设寄存器略微不同直接用ST的驱动可能跑不起来。这种情况下建议去芯片厂商官网找对应的Pack或者SDK不要图省事硬用ST的型号。2. 新建工程的完整操作流程2.1 创建工程文件和文件夹结构准备工作做完下面进入正题。整个流程可以分为四步新建工程 - 选芯片 - 添加启动文件 - 配置工程选项。每一步都有知识点我拆开说。先建立一个总文件夹比如LED_Demo这个文件夹是用来放整个工程所有文件的。Keil5的工程文件散落很多如果不提前规划后期找文件能找疯。我习惯在总文件夹下再建几个子文件夹User存放main.c、stm32f10x_it.c等用户代码Core存放启动文件startup_stm32f10x_hd.s和核心寄存器定义FWLIB存放标准外设库源码Hardware存放自己写的硬件驱动比如led.c、key.cDoc存放说明文档这个结构是STM32标准库开发最经典的目录布局。虽然现在很多人用STM32CubeMX生成HAL库工程但在我接触过的实际项目中老项目用标准库的仍然占相当大的比例学会手动建工程你对工程结构的理解会比用CubeMX生成深刻得多。目录建好之后回到Keil5主界面点菜单栏的Project - New uVision Project然后浏览到你建好的总文件夹给工程起个名字比如LED_Demo。此时Keil5会自动创建一个.uvprojx文件这是现代Keil5的工程文件格式和Keil4的.uvproj少了个x不通用。2.2 选择芯片型号与添加设备支持包点击保存后会弹出Select Device for Target窗口这里就是选择芯片的地方。左侧是厂商和系列树形列表展开方式前面说过STMicroelectronics - STM32F1 Series - STM32F103。右侧上半部分会实时显示选中的型号名称和简要说明下半部分有内核信息、片内Flash/RAM容量、主频等参数。如果你的左侧列表里找不到STMicroelectronics十有八九是Pack没装好。别着急关掉这个窗口回到主界面打开Pack Installer看左侧Installed选项卡里有没有STM32F1xx_DFP这个条目。没有就去装装完再回来继续。选中正确的型号后点OK此时会弹出一个对话框问你是否要复制启动文件到工程文件夹Copy ARM Startup and System Files to Project Folder。这一步很关键。启动文件Startup文件是芯片上电后执行的第一段代码负责初始化堆栈、中断向量表然后跳到main函数。在Keil4时代启动文件是手动添加的步骤繁琐容易出错Keil5贴心地提供了一键复制。我建议这里选择“是”让Keil5自动把startup_stm32f10x_hd.s和system_stm32f10x.c复制到工程目录省去手动添加的麻烦。2.3 管理Source Group手动添加源文件选完芯片、复制完启动文件后你会看到主界面左侧的Project窗口里生成了一个叫Target 1的节点下面挂了一个Source Group 1。这个组里现在只有启动文件空空荡荡啥也干不了。接下来要做的是把标准外设库的源文件加进来。标准外设库是个压缩包你需要在工程外把它解压好然后通过Add Existing Files to Group的方式添加到工程。具体操作右键点击Source Group 1选择Add Existing Files to Group...在弹出的文件浏览窗口里文件类型下拉框选择All files (*.*)然后找到标准外设库解压目录下的src文件夹里面全是.c文件比如stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_usart.c等。注意不需要全部添加只加你当前项目用到的功能模块就行。比如做LED实验只需要GPIO和RCC两个文件。每个外设的.c文件都对应一个同名的.h头文件头文件放在inc文件夹里不用添加到工程但要保证编译器能搜到。这里有个新手很容易犯的错误把整个src文件夹所有的文件一股脑全加进去结果编译报出一大堆warning甚至error。其实很多报错不是因为代码有问题而是不同的外设文件之间存在相互依赖少了一个宏定义开关就会导致某些文件编译出错。所以原则是用到哪个模块加哪个模块不要贪多。2.4 STM32标准库的安装时可选问题前面提到从标准外设库添加源文件可能有的读者会问标准外设库要怎么获取这个东西在Keil5里不会自动带需要自己去ST的官网或者通过软件包工具下载。标准外设库的官方名称叫STM32F10x Standard Peripheral Library在ST官网可以搜到装完后是一堆文件夹包括Libraries库源码、Project官方例程、Utilities评估板工具等。国内网络下载ST官网资源有时候比较慢可以去一些知名的电子论坛找网盘转存但注意核对MD5校验值防止下载到损坏或篡改的包。库文件拷到工程目录后Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm里的启动文件、Libraries\CMSIS\CM3\CoreSupport里的核心定义文件、Libraries\STM32F10x_StdPeriph_Driver\src里的外设驱动文件三大块各司其职缺一不可。不过这里要特别说明一下如果前面你选择了让Keil5自动复制启动文件那启动文件这一块就不用管了。如果Keil5没自动复制比如某些非原厂封装的Keil5安装包存在Bug就需要手动从库的路径里把.s文件右键 - Add Existing Files添加进来。2.5 工程保存与文件路径的常见坑建完工程、加完文件先按一下CtrlS保存。这个步骤看似无关紧要但我见过太多人忽略它导致后面改配置时崩溃工程文件损坏无法打开。保存的时候有一个细节Options for Target窗口魔法棒按钮里的很多配置比如Include路径、宏定义、调试器选择都是保存在.uvprojx里的。如果你改完配置忘了保存就直接关闭软件这些改动会全部丢失。所以养成习惯每次改完配置按一次CtrlS。另外整个工程文件夹的路径不要包含中文字符不要包含空格尽量也避免包含桌面这种系统中文路径。Windows系统下Keil5对中文路径的支持一直不完美编译时有时能过有时蹦出一堆匪夷所思的错误排查半天最后发现是路径问题。用纯英文路径从根源上杜绝这个坑。3. 工程配置的每一个选项卡都要弄明白3.1 Target选项卡晶振频率与代码生成配置选中工程点工具栏上的魔法棒图标Options for Target或者菜单栏Project - Options for Target打开配置窗口。默认停留的选项卡是Device这里显示芯片型号基本不用动。我要重点说的是Target选项卡。在这个页面里有两块内容非常重要。第一块是Xtal (MHz)参数。这里的默认值是12.0表示Keil假设你的外部晶振是12MHz。但大多数STM32F103开发板用的是8MHz晶振也有些板子用25MHz。这个值用不用改直接说结论对于使用标准库或HAL库开发的情况这个参数主要影响时间相关的模拟计算功能真正跑程序时用的是你代码里配置的时钟SystemInit函数会自己配置PLL等寄存器所以即使这个值和实际晶振不一致程序也能跑。但如果你的工程里用到了SystemCoreClock相关宏或者依赖这个值计算波特率那就必须改成和硬件一致的数值否则串口乱码。我个人的习惯是拿到开发板先看原理图确认晶振是8MHz就填8是25MHz就填25一劳永逸。右边第二块是Code Generation区域有两个下拉框一个是ARM编译器版本选择这个后面单独说另一个是优化等级选择。默认的优化等级是Level 0 (-O0)调试时用这个编译出来的代码没做优化单步执行时变量实时可见发布程序时才考虑调高优化等级。新手阶段保持默认不要动。3.2 C/C选项卡宏定义和头文件路径的配置逻辑点开C/C选项卡这是整个配置窗口里最容易出错的页面也是检查一个工程师对Keil熟不熟练的关键。先看Define输入框这里要填全局宏定义。STM32F10x标准库工程需要填一个宏USE_STDPERIPH_DRIVER。这个宏的含义作用是告诉标准库你正在使用标准外设驱动库。没有这个宏的话stm32f10x.h里会跳过外设库函数的定义声明编译时各种外设相关的头文件都找不到。然后看Include Paths这里这排就是传说中报错cannot open source file stm32f10x.h的根源。Keil5的Include路径配置比Keil4时代多了一步需要点击右边的三个点按钮在弹出的文本框里每个路径一行地添加。需要添加哪些路径总结下来大部分标准库工程需要包含这几类标准库的inc路径比如Libraries\STM32F10x_StdPeriph_Driver\inc核心CMSIS路径比如Libraries\CMSIS\CM3\CoreSupport设备支持路径比如Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x用户代码路径比如User、Hardware我见过有新手图省事直接把整个库的所有路径都加进去结果编译器各种重复定义。其实Keil5的include path不具有递归性你指定了多少个目录它就在这几个目录里从头到尾搜一遍路径越多编译越慢。所以只加你用得到的路径够用就行。还有一个加分技巧用相对路径。比如在工程文件夹的路径设置里用.\User代替C:\Users\xxx\Desktop\LED_Demo\User。这样做的好处是整个工程文件夹拷给别人或者换台电脑路径不会失效。很多从网上下载的例程打开编译报错十有八九就是写死了绝对路径拷到你电脑上路径对不上。3.3 添加编译后的中间文件目录有人会发现编译之后工程目录下多了一堆*.o文件和*.crf文件看着很乱。这些是编译过程中产生的中间文件属于正常现象但确实杂乱。其实Keil5可以设置中间文件的输出目录。在Target选项卡的右下角有一个Select Folder for Objects...按钮里面指定输出路径为一个新建的obj文件夹。同样在Listing选项卡里可以设置列表文件输出到lst文件夹。设置完之后所有.o、.crf、.hex、.map文件都跑到子文件夹里工程根目录清爽很多打包上传代码时也不会误传一堆无用文件。与之相关的一个坑如果你把Output文件夹设置到和源码相同的目录那么编译时会因为读写冲突偶尔报错集中在Windows defender实时扫描的环境下。所以从第一天就养成把中间文件单独放obj的习惯值得的。3.4 ARM编译器版本选择V5还是V6这是Keil5新手最疑惑的问题之一。在Target选项卡上半部分ARM Compiler下拉框可以选择编译器版本。Keil5.36及之前版本默认带的是AC5即V5但Keil5.37之后默认只带AC6即V6。V5和V6的区别简单地说V5是老牌编译器代码体积小对旧代码兼容好V6是新一代编译器语法检查更严格支持C99和C11标准编译速度更快但对某些老代码的兼容性差一些。很多老工程师习惯用V5因为V5编译标准库代码时的警告数量最少。V6和V5之间最大的坑在于V6默认按新标准处理部分C语法会被视为非法如隐式函数声明、隐式类型转换直接报Error汇编文件对编译器版本敏感启动文件startup_stm32f10x_hd.s有AC5和AC6两个版本用错版本会报一堆汇编错误所以如果你下载的标准库例程是多年以前写的用AC5编译器你的Keil5默认AC6直接编译可能报错。最简单的处理把编译器切回V5。但如果你装的Keil5.37及以后版本默认没有V5编译器需要先在Pack Installer里下载ARM_Compiler_5.06u7组件然后在工具链路径设置里配好才能切换到V5。最省心的方案其实是不用V5直接用V6然后做两个小修改。第一把启动文件换成AC6版本第二在C/C选项卡的Misc Controls里加一条--diag_suppress186屏蔽“pointless comparison of unsigned with 0”这类无用的警告。这样V6编译标准库也能做到几乎没有error。3.5 Output选项卡生成Flash烧录文件点开Output选项卡页面上半部分是Object文件输出设置其中有两个复选框值得注意。第一个是Debug Information默认勾选它是GDB调试所需信息建议保持默认。第二个是Create HEX File默认不勾选这个选项决定了是否生成可供ST-Link/J-Link直接烧录的.hex文件。如果你使用的是ST-Link自带的烧录工具或者用串口ISP下载就必须有这个文件。所以新建工程的第N个习惯动作就是把Create HEX File勾上。虽然现在多数情况下我们直接用MDK的调试器下载但保底有一个hex文件也能在无法连接调试器时用串口工具给芯片下载程序。Output选项卡下方还有一个Browse Information建议勾选它用于生成跟踪信息能让你在调试时右键快速跳转到函数定义。不勾选的话调试时用F12跳转不灵虽然不影响编译但体验很差。3.6 Debug选项卡选择并配置调试器最后看Debug选项卡。左边是Use Simulator使用软件仿真右边是Use使用硬件调试器。实际开发中我们几乎总是用硬件调试器所以选择Use然后在下拉框里选自己的调试器常见的有ST-Link Debugger、J-LINK/J-TRACE、CMSIS-DAP Debugger。选完调试器之后要点旁边的Settings在里面确认连接方式。尤其是ST-Link如果SW Mode调试器没有接对会在这里报Cannot connect to target。STM32F103的SWD只需要四根线SWDIO、SWCLK、GND、3.3V别接反。Debug选项卡右边还有个Flash Download设置。在这个界面里要确认Programming Algorithm里添加了你芯片对应的Flash算法。比如STM32F103C8T6要有STM32F10x Med-density Flash 128K如果是ZET6要有STM32F10x High-density Flash 512K。如果这里没配置好下载时就会报Flash timeout或者No Algorithm found for address。同时勾上Reset and Run下载后自动运行这样程序烧完之后直接跑不用手动按复位键。4. 工程代码框架与启动流程4.1 从哪里开始写主函数文件模板工程配置完成接下来就是创建用户代码文件。新建一个main.c放在User目录里。我给出一个最精简可用的模板#include stm32f10x.h int main(void) { // 开启GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB Pin0 配置为推挽输出 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); while(1) { GPIO_SetBits(GPIOB, GPIO_Pin_0); // PB0输出高电平 // 简单的延时 for(volatile int i 0; i 1000000; i); GPIO_ResetBits(GPIOB, GPIO_Pin_0); // PB0输出低电平 for(volatile int i 0; i 1000000; i); } }面对这个模板新手常问的第一个问题是RCC_APB2PeriphClockCmd是干什么的GPIO模块在STM32里默认不上电所以使用前必须先打开对应的时钟。这就像回家进门前要先开灯不开灯就摸黑进屋什么都干不了。RCC就是控制这些灯的开关APB2是其中一组外设挂在的时钟总线。还有个细节for(volatile int i 0; ...)里的volatile关键字段不是随随便便写的。如果不加volatile编译器可能把这个空循环优化掉导致延时失效程序看起来就像没执行一样。这个细节很多老手在给新人看代码时也不会刻意提但写进去能省下不少排查的功夫。4.2 用标准库函数操作GPIO与硬件寄存器对比有人可能会问直接用寄存器不是更快吗为什么非要套一层标准库函数寄存器操作确实代码执行效率更高但可读性和可维护性极差。比如GPIOB-CRL 0x44444443这一句是什么意思不查手册的人根本看不出来。而GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP哪怕是不懂寄存器的人看到GPIO_Mode_Out_PP也能猜出是推挽输出。工程实践中代码的可读性和可维护性比那几条指令的执行时间重要得多。标准库本质上是对寄存器的封装它把常用的配置组合变成一个个结构体参数屏蔽了底层复杂的位操作。所以在学习阶段我建议先用标准库把外设跑起来以后再去对比反汇编代码体会封装带来的抽象层次这样入门效率更高。当然也别只停留在标准库的调用上。拿到一个外设先看标准库函数里做了什么再查它操作了哪些寄存器两相结合才能做到既能用库快速开发又能看懂底层原理。4.3 中断与系统时钟SystemInit到底做了什么STM32上电后在进入main函数之前还有一段代码在悄悄工作它就是SystemInit。这个函数定义在system_stm32f10x.c里由启动文件在调用main之前自动调用用户不需要手动调用。SystemInit的主要工作是把系统时钟配置到目标主频。在STM32F103上它读取Flash配置、设置PLL倍频最终将SYSCLK设置为72MHz当外部晶振为8MHz时。这意味着如果你不修改SystemInit只要外部晶振是8MHz系统主频就是72MHzAPB1总线 36MHzAPB2总线 72MHz这些频率参数会直接影响串口波特率和定时器溢出时间。简单概括SystemInit是芯片的“开机初始化”它在你看见main之前就完成了最底层的时钟设置。因此你不需要也不应该在main开头去调用SystemInit更不能把它注释掉某些例程为了灵活会在main里重写时钟初始化那是另一种风格。如果你改写了系统时钟比如把主频降到36MHz记得同时改宏定义SYSCLK_FREQ_72MHz否则依赖时钟的延时函数和串口波特率计算会全部错乱。5. 编译、下载与调试的实操要点5.1 第一次编译会碰到什么代码区超限与头文件报错配置完成、代码输入完成后按F7或者点工具栏的Build按钮开始第一次编译。新手大概率会在这里遇到两个典型的报错我这里先打预防针。第一个.\obj\LED_Demo.axf: error: L6220E: Execution region RW_ZI OVERLAPS这类区域重叠错误。但你仔细想刚刚建好的工程哪来这么严重的内存问题很大可能是前面输出文件夹配置不对导致旧的编译中间文件和新编译文件混在一起产生了冲突。解决办法Project - Clean Targets清掉所有中间文件重新编译。还是不行检查Output文件夹是否设置到了和源码相同的目录是的话就改到obj子目录。第二个..\User\main.c(3): error: #5: cannot open source file stm32f10x.h。这是最经典的头文件路径错误。原因90%来自Include Paths路径没配好或者路径写错了层级。检查Include Paths里是否包含了stm32f10x.h所在的目录注意Keil5不支持通配符不会递归搜索子目录所以你必须精确到文件所在的那一层文件夹。5.2 ST-Link下载失败大概率是这几件事没做对编译通过之后连接ST-Link点Download按钮或者调试模式F8。此时常见的失败信息有几种我列个速查表报错信息大概率原因解决方法Cannot connect to target接线错误、目标板供电不足检查SWDIO/SWCLK/GND/3.3V四根线确认目标板独立供电No Algorithm found for addressFlash算法缺失打开Debug选项卡-Flash Download添加与芯片匹配的算法Flash Download failed - Cortex-M3芯片读保护或连接不稳尝试按住复位键再点击下载或在设置里提高连接速度降为低档RDDI-DAP ErrorST-Link固件版本过旧升级ST-Link固件推荐用STM32CubeProgrammer升级关于连接问题我分享一个独家技巧。STM32F103的SWD模式在芯片完全没跑程序时最好连接。但如果芯片里已经跑了个程序而且程序启动后立即关闭了SWD引脚复用功能比如把PA13/PA14配成了普通GPIO那你就再也连不上了。这时候血泪教训是按住开发板的复位键不放点击Download的瞬间松手利用芯片复位后到跑飞之前这一小段时间窗口完成连接。成功率不敢说100%但实测绝大多数情况下能救回来。5.3 断点调试比printf好用百倍的排查手段程序烧进去能跑之后有人就停了直接用LED灯看效果。这没错但一旦程序出现逻辑问题比如灯应该闪却一直在亮只靠肉眼猜就太痛苦了。学会断点调试排查效率翻倍。具体操作在main函数的while循环里在GPIO_SetBits那一行前面点一下行号旁边的灰色竖条会产出一个红色圆形标记这就是断点。然后点CtrlF5启动调试会话。程序会全速跑直到碰到断点停下来。这时左边窗口可以看到局部变量的实时值鼠标悬停在某个变量上也能看到它的当前数值。此时你可以按F10单步执行F11进入函数内部看每一句代码执行后寄存器和变量如何变化。实测下来这种调试方式在排查杂七杂八的逻辑错误时是效率最高的。有一点提醒断点调试一定要用Level 0 (-O0)优化等级。如果你用了Level 3 (-O3)编译器可能把你的代码重排甚至删除断点会失效变量也会看不到预期值。这是新手最容易掉的坑我见过不止一个人调了半天最后发现是优化等级的问题。6. 让Keil5用得更顺手的个人心得6.1 左侧工程树不显示文件结构怎么办有个常见问题建好工程后左侧Project窗口只显示Target 1一个节点下面什么都看不到。这种情况多半是右侧工程树被折叠了或者视图显示被打乱了。解决的入口在菜单栏View - Project Window快捷键是AltP按一下显示工程窗口再按一下隐藏。如果工程树里文件显示不全可以点一下工程窗口上方的“书本”图标Show/Hide folders把文件夹展开模式切换出来。另外工程树的文件顺序可以自由拖动。我习惯把main.c放在第一个位置方便快速双击打开把启动文件放最后——启动文件基本上不用改。鼠标左键按住文件拖到想要的位置就行这个操作不影响编译纯粹是个人整理习惯。6.2 编码格式GBK还是UTF-8写代码时如果注释里用了中文会遇到一个经典问题在Keil里显示正常整个文件复制到其他编辑器就乱码或者代码原本正常打开在别的电脑上却显示一堆乱码。原因是Keil5默认的文件编码格式是GBK/ANSI而现在很多现代编辑器默认是UTF-8。这个问题可以从两个方向上解决。第一让Keil5使用UTF-8编码。在较新的MDK5.37版本及以上Edit - Configuration - Editor - Encoding中可以找到编码设置把默认编码改成UTF-8即可。但注意这只对整个文件新保存生效已经用GBK保存过的文件还是需要先转码再打开否则改了编码反而乱得更厉害。第二既然Keil是老工具生态大家普遍仍用GBK那就顺势保留GBK在与其他同事协作或发布代码到网上的时候先把文件转成UTF-8或者注释里尽量使用英文。对于个人作品来说我建议注释写英文或拼音从源头上规避编码问题不过对于公开的教程类工程图省事的直接中文注释、统一GBK也是一个可接受的选择。第三如果你用STM32CubeMX生成工程注意CubeMX生成的代码默认是UTF-8Keil5在一些版本下会打开显示乱码。新的MDK已经支持UTF-8只需按前面的方法切换编码然后重新加载文件即可。6.3 编译速度慢的解决思路编译慢这个问题主要出现在大型工程或者完全重建的情况下。但有些人的工程明明很小编译起来却让人等到怀疑人生。先说最常忽略的Include Paths没配好或者用了绝对路径Keil在搜索时效率极低。解决方法是把路径收敛到最小范围减少不必要的搜索路径。另外如果你用的Keil5.36及之前版本编译时默认不会使用多核并行编译。可以在Project - Options for Target - C/C选项卡最下方的Misc Controls里加一条--parallel这个参数让AC5编译器并行编译多个文件。实测工程大时编译时间能缩短一半以上加上--cpu Cortex-M3之类的CPU限定可以提高优化程度但新手阶段不太用得上主要记前面的并行编译参数就行。对于AC6编译器并行编译默认开启不需要额外操作。如果你的旧工程切到AC6之后编译报错选择--gnu兼容模式可以解决大部分问题。总的来说编译慢事小耐心排查配置才是正事头上顶着个转圈圈等五分钟的时候也不要着急改代码先看看编译器设置。6.4 科学管理多个工程目标与头文件冲突一个工程文件里可以建多个Target。比如做一个板子调试版想用-O0方便调试发布版想用-O2压缩体积就可以建两个Target各自配置优化等级、宏和一些不同的编译选项切换时只需要在Project窗口顶部的下拉框里选择就行。这个功能很多人直到用Keil很熟练了才会注意到但它确实好用。项目多版本维护、条件编译调试、不同客户定制都靠这个功能。建新Target的方法右键点击工程名 -Manage - Add New Target每个Target实际上是独立的配置共用同一个工程文件切换时自动重建区别部分。头文件冲突则是工程管理里的暗坑。你在不同的Target里引入了不同版本的同一个头文件编译器按照Include Paths的搜索顺序先搜到的那个文件夹里的同名头文件会被使用很容易出现“我明明改的是A文件编译用的却是B路径下同名的老文件”这种灵异事件。解决方案只有一个项目中不要存在同名头文件在不同路径下的情况万一出现了说明工程结构需要重构了。7. 总结一段我的个人体会写到这里Keil5新建工程的完整流程就差不多讲完了。回过头来看与其说这是一篇教程不如说是一份踩坑清单。这么多年来我见过太多人卡在新工程的第一个小时里——要么找不芯片要么编译报错要么下载失败。就我个人的体会Keil5这个IDE的核心学习曲线不在IDE本身而在你对他生态的理解Pack体系解决的是芯片支持问题标准库解决的是驱动效率问题编译器选项解决的是兼容性问题当你把这三样东西都看透新建工程就变成了一件不需要动脑子也能完成的事情。最后再分享一个小技巧新建工程完成后先别急着写功能代码先烧录一个“点亮LED”的最小程序确认“编译 - 下载 - 运行”整条链路通畅再开始你的正式开发。这个习惯能帮你把开发和调试阶段的问题彻底隔离开省下大量排查环境问题的时间。愿你新建的每一个工程都一次点亮。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑