ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32F103C8T6+ST-LINK下载教程:接线驱动Keil配置与报错排查

STM32F103C8T6+ST-LINK下载教程:接线驱动Keil配置与报错排查 玩STM32的朋友绕不开的一块板子就是STM32F103C8T6最小系统板。这块蓝色的小蓝板凭借几块钱的售价和极高的资料覆盖率几乎成了电子爱好者、在校学生和产品原型阶段的第一块开发板。但很多人焊好了板子、写好了代码却卡在最后一步——下载程序。手里明明插着ST-LINKKeil MDK这边却要么报No ST-LINK detected要么烧录时蹦出Unknown device ID折腾一晚上毫无进展。这篇文章就把这件事彻底讲透。从硬件接线、驱动安装、Keil MDK工程配置到常见报错排查我会把每一步的原理和实操细节一起说清楚按这个流程走完你基本不会再在下载这一步浪费超过十分钟。1. 动手前的硬件准备认识最小系统板和ST-LINK1.1 这块蓝色小板子到底什么来头STM32F103C8T6属于意法半导体STM32F1系列内核是ARM Cortex-M3主频最高72MHz。芯片名字拆分来看F103表示主流增强型产品线C表示引脚数48脚8表示Flash容量64KBT表示LQFP封装6表示工作温度范围-40到85摄氏度。最小系统板的核心就是把芯片工作所需的最少外围电路做了出来3.3V电源电路、8MHz晶振电路、复位电路、BOOT启动方式选择跳帽、以及把48个引脚引出的排针。市面上绝大多数小蓝板还额外集成了AMS1117-3.3稳压芯片可以把USB供电的5V转成3.3V给芯片供电部分版本还带一颗电量指示灯和两个按键。有一点需要提一下这两年国产替代芯片大量涌入市场GD32F103C8T6、APM32F103C8T6、MM32F103C8T6等都可以直接替换原型号。它们引脚兼容、代码基本通用。但它们的调试接口同样是标准的SWD协议ST-LINK一样能识别和烧录只是在极个别外设配置上会有细微差异。买板子时如果发现丝印不是ST但用起来异常顺利不用紧张这是好事——说明你体验到的其实是平替真香。反过来如果你的板子标注的是STM32却频繁报错才是真的需要怀疑来源下连ST-LINK的兼容性。1.2 手里的ST-LINK是哪一种ST-LINK是意法半导体官方推出的调试烧录器目前市面上主要能见到的有三种。一种是官方原版的ST-LINK/V2白色外壳、体积稍大有SWIM接口和SWD接口。另一种是ST-LINK/V3支持电压范围和调试速率更高外形也更小巧但价格通常在百元以上学生党用得不多。还有一种是市面上大量流通的兼容版或升级版外壳也可能是蓝色透明或黑色核心方案大多参考原版V2设计成本压低到十元左右功能上烧录F103绰绰有余。兼容版ST-LINK最让人头疼的不是性能而是驱动兼容性。官方版本即插即用兼容版在某些系统下会被识别成未知设备这点后面驱动章节我会重点展开。无论是哪种版本ST-LINK上都印着一排排针用于连接目标板的多为SWDIO、SWCLK、GND、3.3V、5V这几个引脚。部分ST-LINK V2留有SWIM接口那是给STM8单片机用的玩STM32时我们完全用不到。选购时我只有一个建议没必要花高价买原版V2但也别买那种没有任何品牌标识、做工粗糙到引脚歪歪扭扭的版本。需要避开的是某些标注支持STM8和STM32的二合一产品它们实际功能可能没问题但驱动兼容性和升级性往往不如单纯支持STM32的款式。稳妥的选择是找销量高、评价里明确提到Keil识别正常的店铺十几二十块就能搞定。1.3 SWD四线接线法下载程序的黄金法则给STM32F103C8T6下载程序走的是STM32的SWD调试接口。SWD全称Serial Wire Debug核心是两根线SWDIO数据线和SWCLK时钟线再加上共地线GND通常就足够建立通信了。如果你想稳妥起见可以把ST-LINK的3.3V也接到目标板让下载器顺带给板子供电。四根线的连接关系非常固定ST-LINK的SWDIO接目标板的SWDIO引脚也就是PA13ST-LINK的SWCLK接目标板的SWCLK引脚也就是PA14ST-LINK的GND接目标板的GNDST-LINK的3.3V接目标板的3.3V可选但推荐板子上怎么找PA13和PA14呢小蓝板侧面丝印标有PA13和PA14它们通常在板子长边排针的一侧。如果丝印已经模糊你也可以从芯片引脚图反推LQFP48封装中PA13和PA14位于芯片右下角区域顺着两个引脚往外找就能在排针上找到对应位置。还有一个常见问题小蓝板怎么在面包板上固定蓝板两侧排针的间距正好跨在面包板中间的隔离凹槽两侧你只需要把板子两端排针对准面包板上下两个区域轻轻按压到底就能牢固插稳。这一步要注意别把排针插弯找准位置后垂直用力。接线这件事翻车率最高的是把SWDIO和SWCLK接反了。因为这两根线在排针上紧挨着杜邦线一揉就容易错位。接反后Keil报错通常是RDDI-DAP Error或者Connection error。如果遇到了首先检查的不是软件而是这两根线是否对调了。2. 软件环境搭建驱动、Keil MDK和Device Pack2.1 ST-Link驱动安装最容易被卡住的一关很多人以为下载程序失败是接线问题实际有一半情况是驱动没装好。ST-LINK接入电脑USB口后正常状态下设备管理器里会出现一个STMicroelectronics STLink dongle或者MSCS相关的设备。这里有个细节驱动正常安装后设备管理器里出现的不一定是STLink dongle有时还会显示为USB大容量存储设备。判断驱动是否真正可用的方法很简单打开设备管理器展开通用串行总线设备或端口找到带ST或STLink字样的设备右键属性如果提示此设备运转正常那就说明驱动层面没问题。如果在设备管理器里看到的是黄色感叹号或者显示为未知USB设备设备描述符请求失败那就需要手动处理。兼容版ST-LINK最常出问题的点就在这里。许多小作坊版本的设备描述符没有严格按官方规范写Windows认为它不合法就扔到未知设备里。此时千万别在设备管理器里反复点击更新驱动程序因为根本没有可用驱动可以更新。正解是去意法半导体官网下载最新版ST-LINK驱动安装包或者在安装ST官网提供的STM32 ST-LINK Utility时选择安装驱动组件。装完驱动后如果设备管理器里还是一个带感叹号的未知设备可以试试拔掉ST-LINK的USB线然后再插回去让系统重新枚举设备。这一步能解决八成装完驱动依然不识别的问题。如果反复重插不行果断换USB口或者换根数据线。许多ST-LINK 驱动装不上的故障根源是USB线本身只能充电、不能传数据。2.2 安装Keil MDK 5选择版本和配置Device PackKeil MDKMicrocontroller Development Kit是ARM官方工具链的集成开发环境目前主流版本是MDK 5.x最新版本号已经到了5.39左右。5.36是很多教程里推荐的稳定版本界面和配置逻辑也成熟如果你其他工程已经在用某个版本建议保持一致避免工程文件版本兼容问题。安装MDK时没有什么特殊操作一路下一步即可。需要注意的只有两点一是安装路径尽量不要带中文和空格防止编译时出现莫名其妙的路径错误二是激活和License管理不属于本文章讨论范围评论区也不用问我自己想办法解决。MDK 5的一个关键概念是Device Pack的独立管理。MDK 5把不同厂商芯片的支持包拆成了单独的Pack安装完主程序后必须为特定芯片安装对应的Pack工程才能识别到芯片型号。安装Pack有两条途径。一是在MDK里打开Pack Installer自动在线下载安装STM32F1系列的Device Pack。这条路受网络环境限制大概率等得人没脾气。更推荐的方法是去Keil官网下载离线Pack常见的文件名是Keil.STM32F1xx_DFP.2.x.x.pack下载完直接双击安装即可。Pack安装后在Pack Installer里能看到对应版本号已安装工程里Device下拉菜单就会出现STM32F103C8。要注意版本匹配新版MDK 5.3x建议装2.4.0以上版本的STM32F1系列Pack太老版本的Pack在某些系统中会报Auto-detect command failed或者根本没办法添加Flash算法。还有一些人习惯装完Pack后发现编译时提示仍在找旧版本包去Pack Installer的Installed分支里把旧版本Uninstall掉即可。2.3 下载前的两个必查项端口选择和芯片型号在正式进入工程配置之前有两个细节值得你先花两分钟自查能省下大量排查时间。第一项是确认电脑能识别到ST-LINK。建议安装一个STM32 ST-LINK Utility工具同时也叫STM32CubeProgrammer的前身打开后点击右上角Connect to the target如果能读取到芯片型号和Flash大小说明硬件链路完全正常。这个utility既是STM32的官方烧录软件也自带ST-LINK驱动。它的意义在于给你一个纯硬件层面的测试基准如果Utility能连上那你之后的Keil配置问题就纯粹是Keil设置问题如果Utility连不上就需要回到驱动和接线层面排查。第二项是确认Keil MDK中是否真的看得到ST-LINK。Keil里有一个不依赖具体工程全局检查方法打开任意空工程在Options for Target - Debug标签页中先选ST-Link Debugger然后点击旁边的Settings如果弹出窗口里SW Device框出现了目标芯片的IDCODE比如0x1BA01477具体值因芯片而异就说明Keil能通过ST-LINK访问到芯片。这两个工具一前一后一个负责验证ST-LINK本身一个负责验证Keil对调试器的调用。正常情况下这两步都通过了工程烧录就能顺利完成。如果你的任何一个环节卡住就先回到对应章节去查原因不要硬着头皮点下载按钮那只会让你反复看到一堆报错弹窗。3. Keil MDK工程配置从设置调试器到一键下载3.1 新建或打开工程后的四个必改项新建一个STM32F103C8T6的MDK工程通常你会先选好芯片型号。有些例程已经建好工程模板打开就能用但调试下载配置经常是默认的ULINK2需要自己改。打开Options for Target鼠标右键工程名或者快捷键AltF7四个必改项就在这里。第一步是Device标签页确认Selected Device确实是STM32F103C8不是C6、C4或者大容量F103ZE那种。选错型号会导致Flash算法不匹配编译时也可能报MCU identifier not recognized。第二步是Debug标签页把右侧Use框从默认的ULINK2 Cortex Debugger改为ST-Link Debugger。如果列表里找不到ST-Link Debugger说明你的MDK版本里没有这个驱动选项需要重新确认安装的是MDK而不是老版本的C51。这个选项在MDK 5里不需要额外插件自带支持。第三步还是Debug标签页点击Settings在弹出的对话框里确认四件事Debug Adapter显示的是ST-LINK型号Port选SWMax Clock可保持默认4MHz或稍调低至1.8MHzSW Device列表里能看到目标芯片的IDCODE。这里最大的坑就是USB Cable Loss或者No target detected下面错误排查部分细讲。第四步是Utilities标签页勾选Use Debug Driver这样Keil烧录时就调用上面配好的ST-Link Debugger而不是自行寻找烧录工具。很多教程忽略这一步导致程序能进调试但点Download没反应。勾选后点击后面的Settings按钮进入Flash Download配置界面在Programming Algorithm区域点击Add从列表中选择STM32F10x Med-density Flash 128K。3.2 Flash Download配置为什么选128K的算法为什么要给64K Flash的F103C8添加128K的烧录算法这个听起来有点反直觉原理其实不复杂。STM32F103C8T6虽然有64KB Flash但它实际上采用的是与更高容量F103CB相同的128KB Flash颗粒只是出厂时被限制了可访问范围。Keil自带的烧录算法列表里有一个STM32F10x Med-density Flash 128K选项适配的就是这种中密度带128K颗粒的芯片。如果你只添加了STM32F10x Low-density Flash 32K或者STM32F10x High-density Flash 512K下载时会直接报错提示Error: Flash Download failed - Target DLL has been cancelled或者Algorithm列表为空。解决办法只有一条添加Med-density 128K这个算法其他什么都不用动。Flash起始地址保持0x08000000容量Size保留默认值0x20000即128KB。Program和Erase勾上即可Reset and Run建议勾上这样下载完会自动复位运行省去手动按复位键这一步。选择每次下载自动擦除全部Flash还是Eraser sectors这取决于你的需求。少量Demo调试勾选Erase Sectors即可下载速度更快。如果程序是用IAP方式更新的每次下载前需要独自考虑擦除策略这里不做展开。下载程序本身的校验逻辑Keil会在下载完成后自动执行Read Verify检查不需要额外配置。3.3 全默认设置下的下载流程点这一下就够了配置完成后保存工程。此时工程模型通常已经能正常编译如果编辑器里没有代码随便写个点灯程序或者用官方模板的GPIO翻转代码即可。验证流程就三步先点编译按钮F7确认0 Error、0 Warning的输出然后点LOAD按钮英文版界面是Load或小图标下拉的Download to Flash中文版直接显示下载按钮最后看Output窗口的输出信息依次是Erase Done、Programming Done、Verify OK、Application running ...这几条就代表下载彻底成功了。Output窗口的最底下一行如果出现Application running ...说明程序已经跑起来。此时观察板载LED如果代码是点灯逻辑灯应该已经闪烁。如果没反应先去数一下板子上的电源灯是否亮着再用万用表量一下芯片的VDD和GND确认供电正常。排除了供电问题后再检查程序逻辑重点看GPIO时钟和引脚配置。我在调试期间常遇到的另一个情况是点下载按钮没反应Output窗口里什么都没有。有时候的原因是你压根没在正确的工程上操作Keil同时打开了多个工程当前激活的工程不是你想下载的那个。另外一个原因是下载按钮是灰色的——这通常意味着当前编译状态不是最新版本需要先编译一次。4. 常见报错速查识别不到、烧录失败的排查方案4.1 No ST-LINK detectedDrivers不识别到USB线都没通No ST-LINK detected是所有人第一次使用ST-LINK时几乎必报的错。这个报错的直译就是Keil完全没有找到ST-LINK设备即软件层面看不到任何ST-LINK。排查路径有三层。第一层是设备管理器看有没有带感叹号的未知设备。这个我在驱动章节已经提过这层卡住按驱动章节去处理。特别提醒兼容版ST-LINK的USB设备描述符不规范系统可能在插入瞬间识别成未知USB设备这恰恰说明了为什么装驱动这么常见。第二层是换USB口和换线。电脑前面板的USB口有时供电不稳或者主板USB3.0口对老版ST-LINK不友好可以换到后面板的USB2.0口试下。USB线的话优先用传统的安卓数据线但确认它是完成的数据线而不是充电专用线。辨别方法是插上ST-LINK后电脑有插入音效提示如果没有基本可以确定线只能充电。第三层是最容易忽视的有的ST-LINK用多合一设计上面带一个USB转串口芯片、一个JTAG接口、一个SWD接口这类烧录器通常需要安装不止一个驱动。它内部可能包含一个切换开关需要拨到STM32模式而不是STM8模式。如果设备管理器里看到两个新设备但Keil仍说No ST-LINK detected十有八九是模式开关或跳线帽没设置对。4.2 Unknown device ID目标芯片没回应问题更隐蔽No ST-LINK detected说明Keil连ST-LINK都没找到而Unknown device ID则是ST-LINK连上了但和目标芯片之间通信失败。这个问题更值得逐层排查。硬件层面Unknown device ID的最常见原因是电源不足或接触不良。很多小蓝板的3.3V稳压芯片输出能力有限ST-LINK的3.3V供电一旦被拉低芯片就进入不正常工作状态SWD通信就会失败。正确的排查方式是万用表量一下目标板的3.3V引脚对地电压如果明显低于3.2V甚至跌到2V附近就改用外部稳定供电把ST-LINK和目标板的3.3V断开只留GND、SWDIO、SWCLK三根线。还有一种情况是芯片进入了低功耗模式。STM32在调试时如果使能了WDG看门狗或者进入了STOP模式SWD接口可能无法被ST-LINK唤醒。解决办法是把目标板断电重上电然后在芯片上电瞬间快速点击Keil的Download。这个闪电手操作有些玄学但对于堵在另外两种情况都不适用的情况值得一试。软件层面Unknown device ID还可能是MDK版本与ST-LINK固件版本不兼容。老版本MDK比如4.x或早期5.x使用的STLink驱动接口与新版ST-LINK固件不匹配。解决办法有两种升级MDK或者对ST-LINK固件降级。兼容版ST-LINK升级固件的操作有点危险不建议去碰。如果你的ST-LINK是官方版可以直接使用STM32 ST-LINK Utility里的固件升级功能把ST-LINK升级到最新。之后在MDK里重新开关工程多半就能识别到IDCODE。4.3 Flash Download failed算法配置错导致的前功尽弃Flash Download failed是烧录过程中报的错意思是Keil已经把命令发出去了但目标芯片擦除或写入Flash时失败了。这类报错通常是配置层面的问题。首先确认Utilities - Settings里的Flash Download配置。Algorithm区域如果是一片空白或者只有一条Low-density、High-density选项那下载必然失败。解决方案参照第三章添加STM32F10x Med-density Flash 128K选项。有些特殊情况下机器上安装过第三方Flash算法插件这里可能会出一堆乱七八糟的条目认准带Med-density字样的那条就对了。还有一个容易忽略的地方是目标芯片的读保护RDP等级。如果之前用STM32 ST-LINK Utility或者其他工具给芯片设置过读保护Level 1或更高那么SWD只允许连接不允许读写Flash。这种情况下Keil下载会报Error: Flash Download failed - Cortex-M3的关联错误。解决办法是先用STM32 ST-LINK Utility执行一次Option Bytes里的Level 0恢复也就是解除读保护。如果你在下载时用的是独立的5V电源给目标板供电还要检查一下目标板的GND是不是和ST-LINK的GND连通了。如果两块板的GND没有共同点ST-LINK发出的数字信号就没有参考地电平数据肯定传不到或者传错。这种没有共地的问题在调试器连接里被称为地环路缺失而在下载时会表现为极其随机的通讯失败——一会儿提示未知设备一会儿提示擦除失败重新插拔后偶尔又成功。遇到这种神神经经的问题先查共地。4.4 下载成功但程序不运行这和下载器无关的几个盲区还有一种情况最气人Keil显示下载成功Verify OK一行欢快输出但板子上的LED就是不动。很多人第一反应是代码写错了其实多数情况下是硬件配置的问题。首先查BOOT0引脚的跳帽位置。F103的BOOT0默认是低电平也就是跳帽插在靠近芯片一端此时芯片从Flash启动也就是从你烧录进去的程序启动。如果BOOT0是高电平芯片会进入Bootloader模式不会运行用户程序。开机后如果Reset Run没勾选程序虽然烧录进去但不会自动运行。你按一下板上的NRST复位键程序就会跑起来。如果不想每次手按就在配置里勾上Reset and Run。还有一个问题是代码里没有正确配置系统时钟。很多人点灯程序写的是直接操作寄存器GPIO初始化时忘了开GPIO时钟。STM32的外设时钟默认是关闭的IO翻转寄存器写了硬件却不理你。这种情况下载器帮不了你只能逐步检查代码。我建议新手统一从HAL库或标准库的例程改起不要上来就手撕寄存器。稳定后再研究底层心里会踏实很多。4.5 兼容版ST-LINK的特殊问题和自救手段考虑到大家手里绝大多数是兼容版ST-LINK我再单独说一下容易遇到的特有问题。兼容版ST-LINK最常见的两个毛病一个是插上电后亮灯但设备管理器完全没反应另一个是烧录时动不动报ST-Link USB communication error。前者大概率是USB识别电路问题少数可以通过短接板上的调试相关跳线恢复正常但多数意味着这块烧录器报废了几十块钱的东西直接换新比折腾更有性价比。后者ST-Link USB communication error在烧录中段出现常见原因是USB供电不稳定、数据线太长或质量差。解决办法是换短线、换USB口。如果某块电脑频繁报这个错另一个可能性是ST-LINK的固件太老兼容版又没法在线升级。此时可以降低SWD通信速率在Debug Settings里把Max Clock从4MHz降到1.8MHz或更低成功率会明显提升。如果你是动手达人手头有STM32F103C8T6最小系统板也可以自己diy一个ST-LINK网上的开源源码并不少。不过这类DIY方案的稳定性通常不如买现成的老鸟如果想多学点底层可以试试新手还是绕过这个坎吧。5. 写在最后的一些心得下载程序这个动作在开发流程里看起来最简单恰恰是新手最容易被劝退的地方。我见过太多人代码写得没问题最后栽在接线、驱动和配置这三座大山上。个人建议玩STM32的桌面常备三样东西一个万用表用来量电压和通断一根好用的数据线以及一块备用ST-LINK。数据线出问题这件事说出去都没人信但发生频率高得离谱。备用ST-LINK则纯粹是为防突发事件有一次我在工作室烧到一半ST-LINK彻底不工作当场拆了个新的一分钟就续上了那个项目第二天就要演示当时的庆幸感无法言喻。如果你把文章从头看到这里建议现在就动手把手里的板子连一遍。先开STM32 ST-LINK Utility确认链路通不通再配置Keil记住Flash Algorithm一定要选对。真到排查报错那天按设备管理器、USB口/线、SWD接线、Flash配置、复位与BOOT跳帽的顺序来每一步花两分钟绝大多数问题都能定位。最后再多说一句配置过程中每一次断开和重连尽量都让目标板断电重来一遍。调试接口在热插拔状态下经常会出现通信状态不一致表现就是莫名其妙的报错。把断电、接线、上电、连接这个顺序养成肌肉记忆你会少踩很多坑。祝大家烧录顺利早日点亮属于自己的那块小蓝板。
返回列表