资讯详情

资讯详情

STM32F103开发环境搭建全攻略:从Keil配置到第一个LED程序

1. 为什么第一课总是卡在环境搭建上搞嵌入式的人有个共识真正劝退新手的从来不是C语言指针也不是中断优先级而是装完Keil、插上ST-Link、点下下载按钮之后弹出来的那个红色报错框。我见过太多人卡在no st-link detected或者target dll has been cancelled这种提示上折腾一整个下午最后怀疑是板子坏了。实际上十有八九是驱动、配置或者接线的问题。这篇内容围绕STM32F103的开发环境搭建和开发板认识展开把Keil MDK的安装、器件包Pack的配置、ST-Link驱动的部署、最小系统板的硬件认知以及第一个工程的编译下载全流程拆开讲清楚。适合刚拿到STM32F103开发板、还没成功点亮第一颗LED的朋友也适合之前用过其他单片机、想快速切到STM32生态的开发者。我不会只告诉你点下一步而是把每一步背后的原因和容易踩的坑一并说透。STM32F103这颗芯片在嵌入式教学和工业控制里的地位类似于编程语言里的C语言——不是最新的但足够经典资料多、生态成熟、价格便宜。它的开发环境搭建涉及几个核心组件Keil MDK作为集成开发环境STM32F1系列的Device Family Pack提供器件支持ST-Link作为调试下载工具再加上一块最小系统板或者开发板作为硬件载体。这几个环节任何一个出问题整个链路就跑不通。2. 开发环境的核心组件与选型逻辑2.1 Keil MDK版本的选择与安装要点Keil MDKMicrocontroller Development Kit是目前STM32开发中使用最广泛的IDE之一尤其在教学和中小型项目中。它的优势在于对ARM Cortex-M系列的支持非常成熟编译器优化做得好调试界面直观。但版本选择有讲究。目前常见的版本有MDK 5.36、5.38、5.39等。我个人的建议是如果你跟着教程走尽量选择和教程一致的版本如果是全新开始选5.38或5.39比较稳妥兼容性好对Win10/Win11的支持也更完善。不建议用太老的MDK 4.x版本虽然它也能开发F103但器件包管理和调试器支持都落后了。安装过程中有几个关键点安装路径不要有中文和空格。这是老生常谈但每年都有人栽在这上面。路径里的中文会导致编译器找不到文件报一些莫名其妙的错误。建议直接用默认路径或者改成D:\Keil_v5这种纯英文短路径。安装时勾选Pack Installer。MDK 5之后的版本把器件包管理独立出来了安装时确保Pack Installer组件被选中后面装STM32F1的DFP包会用到。注册问题。MDK是商业软件未注册版本有32KB代码限制。学习用途下社区版MDK-Community对个人评估是免费的可以合法使用。不建议去网上找所谓的注册机来源不明的可执行文件风险很大而且版本更新后经常失效。安装完成后第一次打开Keil它会自动检测并提示安装一些基础Pack可以先跳过后面手动装我们需要的。2.2 STM32F1器件包DFP的获取与安装Keil MDK本身不包含任何芯片的支持文件你需要单独安装对应系列的Device Family Pack。STM32F103属于STM32F1系列对应的包叫Keil.STM32F1xx_DFP。安装方式有两种方式一通过Pack Installer在线安装。打开Keil点击工具栏的Pack Installer图标在左侧找到STMicroelectronics展开后找到STM32F1 Series点击对应的DFP包右侧点Install。这种方式最省事但下载速度取决于网络状况有时候会很慢甚至超时。方式二离线安装。从Keil官网或者ST官网下载.pack文件双击直接安装。如果在线安装一直失败建议走这条路。下载的时候注意版本号一般选最新的稳定版就行比如Keil.STM32F1xx_DFP.2.4.1.pack。注意如果你在Pack Installer里看到某个包显示offline说明本地缓存里有这个包的记录但文件不完整右键选择Remove再重新Install即可。装完DFP之后新建工程时才能在器件列表里找到STM32F103的具体型号。这一步没做的话Device列表里是空的很多人在这里就懵了。2.3 ST-Link驱动与工具链的部署ST-Link是ST官方推出的调试下载器市面上常见的有两种形态一种是独立的USB调试器俗称U盘版另一种是集成在开发板上的比如Nucleo板载的ST-Link。不管哪种都需要在电脑上装驱动。驱动的安装来源ST-Link UtilityST官方的一个独立工具安装它会自动装上ST-Link的USB驱动。这个工具本身也能用来烧录hex文件、查看芯片内存很实用。STM32CubeProgrammerST现在主推的烧录工具功能更全也自带驱动。如果你已经装了CubeProgrammer驱动一般就不用单独装了。Keil自带的ST-Link驱动Keil安装目录下有ST-Link的驱动文件但版本可能比较旧建议还是用官方最新驱动。装完驱动后把ST-Link插到电脑USB口打开设备管理器应该能在通用串行总线设备或端口下看到ST-Link相关的设备。如果看到黄色感叹号说明驱动没装好需要手动指定驱动路径。还有一个容易忽略的点ST-Link的固件版本。有些老版本的ST-Link固件和新的Keil版本不兼容会报ST-Link firmware upgrade required之类的提示。遇到这种情况用STM32CubeProgrammer里的固件升级功能更新一下就好。2.4 开发板与最小系统的硬件认知STM32F103开发板的形式很多从几十块的最小系统板到几百块的综合开发板都有。作为第一课你需要认识板子上的几个关键部分最小系统板通常包含STM32F103主控芯片常见的是C8T664KB Flash20KB RAM、8MHz晶振外部高速时钟源、32.768kHz晶振RTC用有些板子省了、复位电路、BOOT启动模式跳线、3.3V稳压电路把USB的5V转成3.3V、以及引出所有GPIO的排针。5V转3.3V电路是很多新手会问的部分。STM32F103的供电电压是2.0V到3.6V典型值3.3V。开发板通常通过USB接口取5V电然后用一颗LDO低压差线性稳压器常见型号如AMS1117-3.3把5V降到3.3V给芯片供电。你用万用表量板子上的VCC引脚应该是3.3V左右不是5V。如果你直接给芯片的VDD引脚灌5V芯片大概率当场报废。BOOT跳线决定了芯片上电后从哪里启动。BOOT0接低电平GND时从主Flash启动这是正常运行模式BOOT0接高电平VCC时从系统存储器启动用于串口下载程序。日常调试用ST-Link的话BOOT0保持接GND就行。SWD接口是ST-Link和芯片通信的通道需要连接四根线3.3V供电参考、GND共地、SWDIO数据线、SWCLK时钟线。有些板子还引出了SWO用于trace调试但基础调试用不到。接线的时候特别注意GND一定要接不共地的话ST-Link根本识别不到芯片。3. 从零搭建第一个可编译可下载的工程3.1 新建Keil工程与器件配置打开Keil MDKProject菜单里选New uVision Project选一个纯英文路径存放工程。弹出器件选择窗口在搜索框输入STM32F103展开STMicroelectronics下的STM32F1 Series选择你板子上具体的型号。以最常见的C8T6为例选STM32F103C8。选完器件后会弹出一个Manage Run-Time Environment窗口这是Keil的RTE框架可以快速添加中间件。对于第一个工程我们不需要用它直接关掉手动添加需要的文件。接下来需要往工程里添加启动文件。STM32F103的启动文件是startup_stm32f10x_md.smd表示medium density对应64KB或128KB Flash的型号。这个文件在DFP包的安装目录下路径大概是Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\版本号\Device\Source\ARM\。把它复制到工程目录下然后在Keil里Add Existing Files添加到工程。启动文件的作用是芯片上电后先执行启动文件里的汇编代码设置堆栈指针、初始化中断向量表、调用SystemInit函数配置时钟最后跳转到main函数。没有这个文件程序根本跑不起来。3.2 时钟配置与系统初始化STM32F103的最高主频是72MHz。芯片上电后默认使用内部的8MHz RC振荡器HSI精度不高。要跑到72MHz需要配置外部晶振HSE经过PLL倍频。以8MHz外部晶振为例倍频到72MHz的计算过程是8MHz先经过PLL的预分频通常不分频然后乘以9得到72MHz。这个配置在system_stm32f10x.c文件里的SetSysClockTo72函数中实现。如果你用的是标准外设库SPL这个文件会自动帮你配好如果用寄存器开发就需要自己写时钟配置代码。对于第一个工程我建议先用默认的时钟配置内部HSI8MHz确保程序能跑起来再去折腾72MHz的配置。这样出问题的时候变量少好排查。3.3 编写第一个LED闪烁程序假设你的板子上有一颗LED接在PC13引脚这是最小系统板最常见的接法代码如下#include stm32f10x.h void Delay(unsigned int count) { for (; count ! 0; count--); } 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_50MHz; GPIO_Init(GPIOC, GPIO_InitStructure); while (1) { GPIO_SetBits(GPIOC, GPIO_Pin_13); Delay(500000); GPIO_ResetBits(GPIOC, GPIO_Pin_13); Delay(500000); } }这段代码的逻辑很直白先使能GPIOC的时钟不使能时钟的话GPIO配置不生效这是新手最常犯的错误之一然后配置PC13为推挽输出模式最后在死循环里翻转电平。注意RCC_APB2PeriphClockCmd这一行。STM32的外设时钟默认是关闭的用哪个外设就要先开对应的时钟。GPIOC挂在APB2总线上所以用APB2的使能函数。这个先开时钟再配置的顺序不能反反了配置不生效。3.4 编译配置与ST-Link下载设置代码写完后在Keil的Options for Target里做几项配置Target标签页确认晶振频率填的是你板子上的实际值8MHz或12MHz。这个值影响调试时的时序计算填错了不影响程序运行但调试体验会差。Output标签页勾选Create HEX File方便后续用其他工具烧录。同时注意Browse Information也勾上这样代码跳转和查找功能才能用。Debug标签页选择ST-Link Debugger然后点旁边的Settings。在Debug窗口里Port选SWDMax Clock可以先设低一点比如1MHz确认能识别到芯片后再调高。如果这里显示no target connected检查接线和供电。Utilities标签页勾选Use Debug Driver然后点Settings在Download Function里确认Erase Full Chip或Erase Sectors被选中。如果之前烧过程序导致芯片被读保护可能需要先全片擦除。配置完成后点BuildF7编译。如果编译报错最常见的原因是头文件路径没加。在C/C标签页的Include Paths里把标准外设库的inc目录加进去。如果报cannot open source input file之类的错误检查对应文件是否真的存在于工程目录中。编译通过后点DownloadF8下载。如果弹出no st-link detected按下面的顺序排查ST-Link是否插好、驱动是否正常、SWD四根线是否接对、板子是否上电、BOOT0是否接GND。这五个检查点覆盖了90%的下载失败问题。4. 常见问题排查与避坑经验4.1 下载失败类问题速查报错信息可能原因解决方法no st-link detected驱动未装、USB线松动、ST-Link损坏重装驱动、换USB口、换调试器target dll has been cancelledSWD接线错误、芯片未供电检查SWDIO/SWCLK/GND接线量芯片VDD电压flash download failedFlash算法未选、芯片读保护在Utilities里选对Flash算法全片擦除cannot access target芯片处于低功耗模式、复位电路异常按住复位键点下载再松开检查复位电路error: flash download failed - target dll has been cancelled综合原因多为接线或供电按SWD四线逐一排查这张表里的最后一条就是热词里出现的那个经典报错。我遇到过好几次最后发现都是GND没接或者接触不良。SWD通信是差分信号没有共地参考电平判断就乱了。4.2 Keil使用中的典型坑Pack显示offline前面提过是本地缓存不完整。在Pack Installer里找到对应的包右键Remove然后重新Install。如果在线安装一直失败去官网下离线包双击安装。编译报错undefined symbol通常是源文件没加到工程里或者头文件路径不对。检查Project窗口里是否包含了所有.c文件以及Include Paths是否覆盖了所有.h所在目录。程序下载后不运行先确认BOOT0接的是GND。然后检查启动文件是否选对了型号md/hd/ld对应不同Flash容量。再检查SystemInit里的时钟配置是否和实际晶振匹配。如果用的是内部HSI但代码里配的是HSE程序会卡在时钟初始化里出不来。Keil的periodic window update这个选项在Debug配置里勾上之后调试时Watch窗口的变量值会定期刷新。不勾的话变量值只在暂停时更新。对于查看实时变化的变量勾上更方便但会增加调试通信负担低速调试器可能会卡。4.3 硬件层面的注意事项供电问题ST-Link的3.3V输出电流有限一般几十毫安如果板子上外设多建议用独立电源给板子供电ST-Link只接GND、SWDIO、SWCLK三根线。这样避免因供电不足导致下载不稳定。接线长度SWD的连线不要太长超过20厘米就容易受干扰。如果必须长距离连接降低SWD时钟频率试试。静电防护冬天干燥的时候手摸板子前先碰一下接地的金属物体。STM32的IO口静电耐受能力有限被静电打坏的芯片我见过不少。晶振不起振如果程序跑不起来且确认时钟配置没问题用示波器量一下晶振引脚。不起振的话检查负载电容是否匹配一般8MHz晶振配20pF左右或者换一颗晶振试试。有些便宜的晶振质量确实不行。5. 开发板认识的延伸与后续学习路径5.1 从最小系统到综合开发板最小系统板适合入门但外设少能做的实验有限。当你熟悉了GPIO、串口、定时器之后可以考虑换一块综合开发板上面通常集成了LED、按键、OLED屏、温湿度传感器、红外接收头、SD卡座等外设。这样不用自己接线就能做更多实验。选开发板的时候注意几点资料是否齐全原理图、例程、视频教程、社区是否活跃遇到问题能不能搜到答案、外设是否常用别选太偏门的。STM32F103的综合板市面上很多价格从几十到一两百不等入门选个中等价位的就够了。5.2 串口打印调试环境的搭建热词里出现了stm32f103 串口打印这是调试中非常实用的手段。通过USART把printf重定向到串口可以在电脑的串口助手里看到程序运行时的变量值、状态信息比点灯调试高效得多。实现方法是重写fputc函数int fputc(int ch, FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_TC) RESET); USART_SendData(USART1, (uint8_t)ch); return ch; }然后在Keil的Target选项里勾选Use MicroLIB。这样就能在代码里直接用printf了。串口助手推荐用SSCOM或者XCOM波特率一般设115200。5.3 后续课程的技术路线预告环境搭好、点灯成功之后接下来的学习路线大致是GPIO输入输出按键检测→ 外部中断 → 定时器PWM输出、输入捕获→ 串口通信USART→ I2C/SPI驱动传感器和屏幕→ ADC采集模拟量→ DMA高效数据传输→ RTOS任务调度。每一步都建议先跑通例程再自己从零写一遍最后改参数做实验。嵌入式这东西看十遍不如动手写一遍。环境搭建是第一步也是最容易劝退的一步过了这关后面就顺了。我在实际带新人的过程中发现环境搭建卡住的人八成是因为没有系统地检查问题而是东试一下西试一下。按照驱动→接线→供电→配置→代码这个顺序逐层排查基本没有解决不了的问题。另外遇到报错先复制错误信息去搜大部分坑前人都踩过答案就在那里。
觉得有用,分享给同行:

为您的企业打造数字门面

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

立即咨询 →