资讯动态

STM32F103开发环境搭建全攻略:Keil MDK、ST-Link驱动与器件包安装指南

发布时间:2026/10/29 10:12:32 来源:尧图企业网站定制
1. 为什么第一课不是点灯而是搭环境很多人拿到STM32F103开发板的第一反应是赶紧写个点灯程序跑起来觉得环境搭建这种杂活随便搞搞就行。我带过不少刚入门的同学十个人里有八个卡在环境上真正写代码的时间反而不到两成。这个现象很普遍也很正常——嵌入式开发和纯软件开发最大的区别就在于你的代码要经过编译、链接、下载、运行四个环节才能看到效果任何一个环节出问题你面对的都是一堆看不懂的报错。所以第00课的核心任务不是教你写代码而是把从电脑到芯片这条链路彻底打通。这条链路包括PC端的集成开发环境IDE、芯片支持包、编译器工具链、下载调试器驱动、以及开发板本身的硬件认知。任何一环缺失后面的学习都是空中楼阁。我见过太多人因为环境问题放弃嵌入式的例子。有个同学买了板子三个月一直卡在no target connected这个报错上最后发现是ST-Link驱动没装对。这种问题在懂的人眼里五分钟解决在不懂的人手里能耗掉一整个周末。所以这篇文章我会把环境搭建的每个环节拆开讲透包括为什么这么选、怎么装、装完怎么验证、出问题怎么排查。STM32F103这颗芯片值得单独说一下。它是ST公司基于ARM Cortex-M3内核的32位微控制器主频72MHz片上资源丰富价格便宜资料铺天盖地。国内几乎所有嵌入式培训机构的入门课程都选它不是没有道理的。你把这颗芯片玩明白了后面换F4、F7、H7系列甚至换其他厂商的芯片迁移成本都很低。这篇文章适合谁看如果你是电子、自动化、计算机相关专业的学生或者想转行做嵌入式开发的工程师又或者只是对单片机感兴趣想自己做个智能小车、鱼缸控制器之类的小项目那这篇内容就是为你准备的。不需要你有任何STM32基础但最好有一点C语言基础知道什么是变量、函数、指针就够了。2. 开发环境的三件套选型逻辑2.1 Keil MDK为什么是大多数人的第一选择嵌入式开发的IDE选择其实不少Keil MDK、IAR EWARM、STM32CubeIDE、还有用VSCode加各种插件自己搭的。为什么我推荐新手从Keil MDK开始原因很实际教程多、坑少、社区活跃。你遇到任何问题百度一搜大概率能找到中文的解决方案。IAR虽然编译器优化更强但正版授权贵破解版安装麻烦STM32CubeIDE是ST官方出的免费工具基于Eclipse功能全但界面复杂新手容易被各种配置项搞晕VSCode方案灵活但需要自己配工具链对新手来说学习曲线太陡。Keil MDK的全称是Keil Microcontroller Development Kit注意不是Keil C51。这两个东西经常被搞混。Keil C51是给8051单片机用的Keil MDK是给ARM Cortex-M系列用的。你如果搜keil c251或者keil uvision 4 c51那是另一个产品线跟STM32没关系。下载的时候认准MDK-ARM版本目前主流的是MDK 5.x系列比如5.36、5.38这些版本。关于版本选择我的建议是不要追最新版。新版本可能引入一些兼容性问题而且网上大部分教程是基于5.20到5.30这个区间写的。5.36是个比较稳定的版本用的人多遇到问题好搜。安装包大概七八百兆装完之后还需要单独安装器件支持包Device Family Pack简称DFP或Pack这个后面会详细说。注意Keil MDK是商业软件有代码大小限制的评估版。对于学习用途评估版的32KB限制其实够用但如果你要跑大一点的工程可能需要考虑正版授权或者转向STM32CubeIDE。这个话题比较敏感我就不展开说了大家根据自己的实际情况选择。2.2 ST-Link调试器的角色和驱动问题ST-Link是ST官方的调试下载器负责把编译好的程序烧录到芯片里同时支持在线调试。市面上常见的ST-Link有几种形态一种是ST官方开发板板载的ST-Link电路比如Nucleo板子另一种是独立的USB加密狗形态淘宝上十几块钱就能买到一个。还有一种是山寨的ST-Link V2外观是个U盘样子这种性价比最高但质量参差不齐。为什么强调驱动问题因为ST-Link在Windows上需要安装驱动才能被识别。很多人插上ST-Link设备管理器里显示一个黄色感叹号这就是驱动没装好。驱动装好之后设备管理器里应该能看到STMicroelectronics STLink dongle或者类似的条目。如果用的是山寨ST-Link有时候需要手动指定驱动路径或者用Zadig工具替换驱动。除了驱动还需要装ST-Link Utility或者STM32CubeProgrammer。这两个工具的作用是独立于Keil之外直接连接芯片进行烧录、读保护、选项字节配置等操作。ST-Link Utility比较老但轻量STM32CubeProgrammer是新一代工具功能更全。我建议两个都装上有时候Keil里下载失败用独立工具反而能连上方便排查问题。2.3 器件支持包到底装了什么器件支持包Device Family Pack是Keil MDK的一个特色机制。Keil本身只是个壳它不知道STM32F103的寄存器地址、中断向量表、启动文件长什么样。这些东西都在Pack里。你新建工程的时候Keil会让你选择芯片型号如果你没装对应的Pack列表里就找不到STM32F103。Pack包里包含哪些东西启动文件startup_stm32f103xb.s、外设寄存器定义头文件stm32f103xb.h、系统初始化代码system_stm32f1xx.c、以及一些示例工程和中间件。这些东西你写代码的时候会直接或间接用到。比如你写GPIOA-ODR 0x01;这个GPIOA的定义就是从Pack里的头文件来的。Pack的安装方式有两种一种是在Keil里通过Pack Installer在线安装另一种是去Keil官网下载.pack文件离线安装。在线安装方便但速度慢尤其是国内网络环境有时候会卡住。离线安装需要手动下载但更可靠。如果你搜stm32f103 pack包下载能找到很多网盘链接下载下来双击就能装。提示Pack Installer里有时候会显示offline这是因为Keil在尝试连接服务器获取Pack列表但失败了。不影响已安装Pack的使用但如果你想在线安装新的Pack需要检查网络或者改用离线安装。3. 从零开始的环境搭建实操3.1 Keil MDK的安装细节与常见卡点下载好MDK安装包之后双击运行。安装路径建议用默认的C:\Keil_v5不要放在中文路径下也不要有空格。我见过有人把Keil装在D:\我的软件\单片机开发\Keil这种路径下结果编译的时候各种找不到文件。嵌入式工具链对路径中的中文和空格支持很差这是历史遗留问题别去挑战它。安装过程中会弹出几个对话框一个是询问是否安装ULINK驱动一个是是否安装Pack Installer。ULINK是Keil自家的调试器如果你不用ULINK可以跳过但建议还是装上不占多少空间。Pack Installer一定要装后面装器件包全靠它。安装完成后第一次打开Keil会提示你注册。评估版有32KB代码限制对于STM32F103来说简单的点灯、串口、定时器程序都不会超过这个限制。但如果你要跑FreeRTOS或者带网络协议栈的工程可能就超了。注册的事情大家自己想办法我不多说了。还有一个常见问题是Keil的编译器版本。MDK 5.36默认用的是ARM Compiler 5AC5但新版本可能默认用AC6。AC5和AC6的语法兼容性有差异很多老教程的代码在AC6下编译会报错。如果你发现编译报错说某个语法不对可以检查一下编译器版本。在Options for Target - Target标签页里有个ARM Compiler下拉框可以切换AC5和AC6。如果你搜keil 如何安装ac5说明你遇到了这个问题。3.2 ST-Link驱动的正确安装姿势ST-Link驱动安装有个坑如果你先插了ST-Link再装驱动Windows可能已经给它分配了一个错误的驱动。这时候你需要先在设备管理器里卸载那个设备勾选删除驱动程序软件然后再重新插拔让系统重新识别。正确的顺序是先装驱动再插ST-Link。驱动可以从ST官网下载搜ST-Link driver就能找到。下载下来是个压缩包解压后根据你的系统版本32位还是64位运行对应的安装程序。装完之后插上ST-Link设备管理器里应该能看到两个设备一个是STMicroelectronics STLink dongle在通用串行总线设备下面另一个是STMicroelectronics STLink Virtual COM Port在端口下面。第二个是虚拟串口如果你用ST-Link的串口功能会用到。如果设备管理器里显示的是未知设备或者带黄色感叹号右键选择更新驱动程序然后手动浏览到驱动解压的文件夹。如果还是不行试试用Zadig工具选择ST-Link设备替换成WinUSB驱动。这个方法对山寨ST-Link特别有效。3.3 器件支持包的离线安装流程去Keil官网的Pack下载页面搜索STM32F1系列。你会看到好几个Pack比如Keil.STM32F1xx_DFP.2.4.0.pack。下载下来之后双击这个.pack文件它会自动调用Pack Installer进行安装。安装过程很快几秒钟到几十秒不等。装完之后怎么验证打开Keil点击Project - New uVision Project随便选个路径然后会弹出器件选择对话框。在搜索框里输入STM32F103如果能看到STM32F103C8、STM32F103RB这些型号说明Pack装好了。如果列表是空的或者搜索不到说明Pack没装成功需要重新装。有时候你会遇到Pack版本冲突的问题。比如你之前装过STM32F1xx_DFP的旧版本现在装新版本Keil可能会提示已存在。这时候可以在Pack Installer里先卸载旧版本再装新版本。Pack Installer的入口在Keil的Pack菜单里或者工具栏上有个小图标。4. 开发板硬件认知与最小系统4.1 STM32F103最小系统板上有哪些东西最小系统板顾名思义就是让STM32F103能跑起来的最少外围电路。一块典型的最小系统板通常包含以下部分主控芯片STM32F103C8T6或者C6T6LQFP48封装48个引脚。晶振电路8MHz高速晶振HSE和32.768kHz低速晶振LSE。HSE给系统提供主时钟LSE给实时时钟RTC用。复位电路一个按键加一个电容按下按键芯片复位。启动模式选择BOOT0和BOOT1两个跳线帽决定芯片从Flash启动、从系统存储器启动还是从SRAM启动。电源电路5V转3.3V的LDO稳压芯片比如AMS1117-3.3。调试接口SWD接口通常是4个排针3.3V、GND、SWDIO、SWCLK。LED指示灯一个电源指示灯一个用户LED接在某个GPIO上通常是PC13。USB接口有些板子带USB转串口芯片比如CH340方便串口通信。你搜stm32f103最小系统或者stm32f103 5v转3.3v电路能看到很多原理图。建议你对着原理图把板子上的元件认一遍知道哪个是晶振、哪个是复位按键、哪个是BOOT跳线。这个认知过程很重要后面你写代码配置时钟的时候脑子里要有硬件的样子。4.2 BOOT跳线的正确设置BOOT0和BOOT1的组合决定了芯片上电后从哪里开始执行代码。这个知识点很多人忽略但它是下载程序失败的头号原因之一。BOOT0BOOT1启动模式用途0X主Flash启动正常运行模式10系统存储器启动串口下载模式11内置SRAM启动调试用很少用正常使用ST-Link下载程序时BOOT0应该接GND即设置为0。如果你用串口下载比如用FlyMcu通过串口烧录需要把BOOT0接3.3V下载完再改回GND。我见过有人BOOT0一直接3.3V结果程序下载进去了但不运行折腾半天才发现是跳线问题。注意有些最小系统板把BOOT0通过一个电阻下拉到GND默认就是Flash启动不需要手动跳线。但有些板子需要你自己用跳线帽短接。拿到板子第一件事就是确认BOOT0的状态。4.3 SWD接口的接线方式SWDSerial Wire Debug是ARM Cortex-M系列常用的调试接口只需要两根信号线SWDIO和SWCLK加上电源和地一共四根线。相比JTAG的20针接口SWD简洁得多。ST-Link和开发板的连接方式ST-Link的3.3V接开发板的3.3VST-Link的GND接开发板的GNDST-Link的SWDIO接开发板的SWDIO通常是PA13ST-Link的SWCLK接开发板的SWCLK通常是PA14有些ST-Link上标注的是DIO和CLK对应SWDIO和SWCLK。接线的时候注意不要接反接反了不会烧芯片但连不上。如果连接正常ST-Link上的LED会闪烁或者常亮。如果你搜st-link no ulink/me device found或者no st-link detected大概率是接线问题或者驱动问题。先检查线有没有接对再检查驱动有没有装好最后检查Keil里的调试器设置有没有选对。5. 第一个工程的创建与下载验证5.1 新建工程时容易忽略的选项打开KeilProject - New uVision Project选一个纯英文路径的文件夹。工程名也建议用英文比如test_led。然后选择芯片型号搜索STM32F103C8选中STM32F103C8T6。接下来会弹出一个Manage Run-Time Environment对话框。这个对话框是让你选择要不要自动添加一些软件组件比如CMSIS的Core和Device Startup。对于新手我建议至少勾选CMSIS - CORE和Device - Startup。这样Keil会自动帮你把启动文件和系统初始化文件加到工程里省得你手动添加。但要注意自动添加的启动文件可能和你实际用的芯片型号不完全匹配。比如STM32F103C8的Flash是64KB启动文件应该是startup_stm32f103xb.sxb表示中容量。如果你选错了编译可能不报错但运行不正常。所以工程建好之后检查一下启动文件的名字对不对。5.2 添加用户代码与编译工程建好之后右键Source Group 1选择Add New Item to Group添加一个main.c文件。然后在main.c里写一个最简单的程序#include stm32f10x.h int main(void) { // 使能GPIOC时钟 RCC-APB2ENR | RCC_APB2ENR_IOPCEN; // 配置PC13为推挽输出最大速度2MHz GPIOC-CRH ~(0x0F 20); GPIOC-CRH | (0x02 20); while(1) { // 点亮LED低电平点亮 GPIOC-ODR ~GPIO_ODR_ODR13; for(int i 0; i 1000000; i); // 熄灭LED GPIOC-ODR | GPIO_ODR_ODR13; for(int i 0; i 1000000; i); } }这段代码直接操作寄存器不依赖任何库。为什么第一课用寄存器而不是库函数因为寄存器操作能让你看清楚底层发生了什么。库函数虽然方便但把细节都封装起来了新手容易知其然不知其所以然。等你对寄存器有感觉了再用标准库或者HAL库会顺畅很多。编译之前检查Options for Target里的Output标签页勾选Create HEX File。这样编译后会生成.hex文件方便用独立工具烧录。然后点击编译按钮如果一切正常Build Output窗口会显示0 Error(s), 0 Warning(s)。5.3 下载配置与常见报错处理点击Options for Target - Debug标签页在右上角的下拉框里选择ST-Link Debugger。然后点击旁边的Settings按钮会弹出ST-Link的配置窗口。在Debug标签页里Port选择SWMax Clock可以选4MHz或者1.8MHz。如果连接正常右侧会显示芯片的IDCODE和Device Name。切换到Flash Download标签页确认Download to Flash被勾选Programming Algorithm里应该有STM32F10x Medium-density Flash。如果没有点击Add按钮手动添加。配置好之后点击下载按钮一个向下的箭头图标。如果一切顺利Build Output窗口会显示Programming Done. Verify OK.。如果报错no st-link detected检查ST-Link是否插好、驱动是否正常。如果报错flash download failed - target dll has been cancelled通常是Flash算法没选对或者芯片被读保护了。我遇到过一次load ... project.axf no st-link detected的报错折腾了很久最后发现是USB线的问题。有些USB线只能充电不能传数据换一根线就好了。这种问题最坑人因为软件层面看不出任何异常。6. 环境搭建后的验证与排查思路6.1 用ST-Link Utility做独立验证Keil里下载成功不代表ST-Link和芯片的通信就没问题。有时候Keil的配置有误但恰好能下载换一个工程就不行了。所以我建议装一个ST-Link Utility用它来独立验证连接。打开ST-Link Utility点击Target - Connect。如果连接成功下方会显示芯片的Flash大小、ID等信息。然后你可以点击Target - Program Verify选择一个.hex文件烧录进去。如果ST-Link Utility能正常连接和烧录说明硬件链路没问题Keil那边的问题就是软件配置问题。ST-Link Utility还能做一件很有用的事读芯片的选项字节Option Bytes。如果你不小心把芯片读保护打开了Keil下载会失败但ST-Link Utility可以解除读保护。在Target - Option Bytes里把Read Out Protection改成Disabled然后应用。6.2 串口打印的验证方法点灯验证的是GPIO输出串口验证的是GPIO复用功能和时钟配置。如果你搜stm32f103 串口打印能找到很多例程。串口验证的好处是你可以打印变量值、调试信息比点灯直观得多。串口验证的步骤配置USART1的TXPA9和RXPA10设置波特率115200然后在PC端用串口助手接收。如果你用的是ST-Link的虚拟串口需要在代码里配置USART1然后把ST-Link的TX/RX接到开发板的RX/TX。注意TX和RX要交叉连接。串口打印乱码是最常见的问题原因通常是波特率不对或者时钟配置错误。STM32F103的USART1挂在APB2总线上时钟是72MHz。如果你配置的波特率是115200但实际时钟不是72MHz算出来的分频系数就不对打印出来就是乱码。检查SystemInit函数里有没有正确配置时钟。6.3 环境问题的通用排查链路环境搭建过程中遇到的问题90%集中在以下几个环节。我按排查顺序列出来你遇到问题可以按这个顺序检查供电是否正常开发板上的电源指示灯亮不亮用万用表量一下3.3V引脚是不是稳定的3.3VST-Link驱动是否正常设备管理器里有没有识别到ST-Link有没有黄色感叹号接线是否正确SWDIO、SWCLK、GND、3.3V四根线有没有接对有没有松动BOOT跳线是否正确BOOT0是不是接GNDKeil调试器配置是否正确Debug标签页里有没有选ST-Link DebuggerSettings里能不能看到芯片IDFlash算法是否正确Flash Download标签页里有没有添加STM32F10x Medium-density Flash芯片是否被读保护用ST-Link Utility连接看看能不能读到芯片信息。如果读不到可能是读保护开了。这个排查链路是我自己踩坑总结出来的按这个顺序走基本能定位到问题所在。最怕的是跳着排查一会儿怀疑驱动一会儿怀疑代码效率很低。7. 一些过来人的经验之谈环境搭建这件事说难不难说简单也不简单。我见过有人半小时搞定也见过有人折腾一周。差别不在于智商而在于有没有人告诉你哪些地方容易踩坑。第一个经验不要同时装多个版本的Keil。有些人电脑里装了Keil C51又装了Keil MDK两个版本会互相干扰。如果你两个都要用建议装在不同的路径下或者用虚拟机隔离。我见过Keil C51的安装把MDK的注册表覆盖了导致MDK打不开的案例。第二个经验工程路径不要有中文和空格。这个坑我踩过不止一次。Keil的编译器对中文路径的支持很差有时候编译报错说找不到文件你去看文件明明就在那里。把工程放在D:\stm32_projects\这种纯英文路径下能省很多事。第三个经验养成备份工程的习惯。环境搭建好之后建一个空的工程模板配置好时钟、GPIO、串口这些基础功能然后复制一份存起来。以后新建工程直接复制这个模板改改就能用不用每次都从头配置。这个习惯能帮你节省大量时间。第四个经验遇到报错先看Build Output窗口。很多人遇到报错就慌了到处问人。其实Keil的报错信息很详细告诉你哪个文件哪一行出了什么问题。把报错信息复制到搜索引擎里大概率能找到答案。如果搜不到把报错信息发到论坛或者群里别人也能更快帮你定位。第五个经验不要迷信教程。网上的教程质量参差不齐有些是抄来抄去的里面的配置可能已经过时了。你要学会看官方文档STM32F103的参考手册RM0008和Keil的官方文档是最权威的。虽然英文看起来费劲但看多了就习惯了而且能避免被错误教程带偏。环境搭建只是嵌入式的第一步后面还有时钟树、中断、定时器、串口、SPI、I2C、ADC、DMA等等一大堆东西要学。但这一步走稳了后面的路会顺很多。我见过太多人因为环境问题放弃真的很可惜。希望这篇内容能帮你把这一步走扎实。

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

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

免费获取报价 →
↑