尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

STM32F103开发板入门:从开箱点灯到环境搭建与学习路线

STM32F103开发板入门:从开箱点灯到环境搭建与学习路线 快递纸箱在我桌上放了两天今天终于拆开了。里面是一块STM32F103ZET6开发板蓝色PCB板载的按键、LED、USB转串口和排针一应俱全。说实在的拿到手那会儿既有兴奋也有点发慌——这块芯片的资料多到看不过来但真要让它跑起来还是得从最基础的点灯开始一步步走。标题里说了这块STM32-103的开发板买回来了后面我会持续记录学习和踩坑的过程想学STM32的朋友可以跟住这个连载至少我在入门路上的每个坑你都能提前避开。这篇就当作开箱加学习路线定档我把自己为什么选F103、到手怎么搭建环境、第一个工程怎么写以及接下来打算做哪些项目全部摊开讲一遍。如果你手里也有一块刚拆包装的STM32开发板或者正准备入手这篇文章应该能给你省下不少瞎折腾的时间。1. 为什么第一块板子选STM32F1031.1 F103的生态优势是怎么来的很多人问我现在开发板一抓一大把ESP32、K210、全志T113、瑞芯微3588什么的都挺火为什么偏偏选STM32F103这种“老古董”答案其实很现实学习资料密度决定学习成本。STM32F103是意法半导体Cortex-M3内核的代表作出货量极大十几年来积累的中文教程、例程、毕业设计源码、开源项目多到看不完。你随便搜一个问题前面几页基本都能找到对应答案这种“搜得到、看得懂、能复现”的体验对新手来说比芯片性能重要得多。相比之下很多新平台的资料要么是英文原版、要么是厂商SDK里遮遮掩掩的demo啃起来非常痛苦。F103另一个优势是便宜、皮实、耐折腾。核心板几十块钱烧错固件、接错线、甚至把某个引脚烧了换一片芯片也不心疼。我自己的看法是入门阶段最重要的不是算力而是容错率。你不需要一颗能跑神经网络的高性能芯片你需要的是允许你反复犯错还不会打击信心的平台。从51单片机或者Arduino转过来的朋友会特别有感触。51的寄存器少逻辑简单但生态老化Arduino开发舒服但封装层太厚学完还是不太懂底层运行逻辑。F103恰好站在中间寄存器层、标准库层、HAL库层都可以学GPIO、定时器、串口、中断这些核心概念又跟其它ARM芯片通用学完一块板子后面换M4内核的F407、换H7系列甚至去玩企业里常见的FPGA平台很多概念都是平移的。1.2 “会点灯”和“能干活”之间差了什么很多新手有个误区以为点亮一个LED就算入门STM32了。其实点灯只是证明工具链通了离真正“会用”还差了好几步。我给自己定的入门标准是五件事会配置GPIO、会用定时器输出PWM、会用定时器做输入捕获、会用串口收发数据、会读传感器数据手册并驱动一个外部模块。这五件事做完你就能应付绝大多数STM32小项目了。比如超声波测距就是“定时器输入捕获加GPIO触发”的组合驱动OLED屏幕是“I2C或SPI通信”的应用控制步进电机是“GPIO输出脉冲序列”的延伸做一个带温湿度显示的小气象站本质上是串口、I2C、OLED三块知识的拼装。坦白说F103的性能放在今天并不亮眼主频72MHzFlash最大512KB但它能干的活非常多工业控制、仪器仪表、车载电子、消费电子里大量成熟产品至今还在用这颗芯片。所以学它完全不是浪费时间反而是在建立一个比较扎实的嵌入式地基。地基稳了以后学RTOS、学嵌入式Linux、学更复杂的通信协议栈都能顺很多。这也是我最终决定在STM32F103ZET6上扎根的原因。2. 到手第一件事把开发环境一次搭好2.1 Keil MDK和芯片包安装的坑开箱拍照是其次真正要做的第一件事是装开发环境。STM32F103最主流的IDE还是Keil MDK虽然它界面有点老但生态成熟网上找到的例程多半都是Keil工程直接用它能少很多兼容性折腾。Keil MDK装好后有一个步骤特别容易被忽略安装芯片支持包DFP。打开Pack Installer在搜索框里输入STM32F1找到STM32F1 Series Device Support并安装。这一步不做新建工程时根本找不到STM32F103ZET6这颗芯片。这里有个热词提醒很到位很多人问“keil5怎么兼容C51和STM32”。其实关键点在于安装路径和Pack管理器。C51和MDK是两套独立的工具链分别安装到不同目录就行打开工程时Keil会自动切换ARM和C51编译环境。如果打开C51工程报错找不到芯片检查一下C51的License和芯片包是否齐全如果打开STM32工程找不到芯片检查MDK的Pack装没装对。两块互不干扰但很多人同时装完后经常弄混启动的是哪个工具链。芯片包安装时还可能碰到两个问题一是网络原因导致Pack下载失败解决方法是挂代理或者手动从官网下载DFP包后双击导入二是安装完Pack后Keil提示缺少某个组件绝大多数情况是Pack版本和Keil版本不匹配建议把Keil升到5.3x以上别用太老的版本。2.2 编译下载路线Keil还是VSCode搭好Keil只是第一步接下来要决定用什么方式烧录。开发板常见的调试器有三种ST-Link、DAPLink、J-Link。这三种在F103上都很好用实操体验略有差异。保守推荐是ST-Link或者板载的DAPLink。ST-Link是意法半导体官方调试器兼容性最稳Keil里选STM32 ST-LINK Debugger就能直接用。如果你买的开发板板载了DAPLink那更省事一根USB线就把供电、下载、虚拟串口全解决了。如果你习惯用VSCode写代码也有很成熟的路线。用EIDE插件新建STM32工程编译器选ARM Compiler或者GCC调试器配置选pyOCD或者OpenOCD这样能在VSCode里完成编译和烧录。不过新手阶段我不太建议主用VSCode因为它牵扯到工具链配置、调试配置、JSON文件修改任何一个环节出错都会增加挫败感。我的建议是先Keil把流程跑通对工程结构有概念后再迁移到VSCode也不迟。还有一个从热词里看到的高频问题VSCode里编译成功却怎么也烧录不进开发板。这种情况多半不是代码问题而是下载配置问题。常见原因有几种调试器类型选错比如用了ST-Link却选了J-Link下载时板子没上电或者USB线是纯充电线还有复位电路异常导致芯片无法进入下载模式。先检查接线再用调试器自带的工具比如STM32CubeProgrammer确认能不能识别芯片这一招能定位大多数烧录失败。2.3 拿到板子先确认的硬件细节环境装好先别急着点灯把板子硬件摸清楚能省后面一堆排查时间。很多开发板的引脚定义并不完全一样LED接在哪个GPIO、按键接在哪个引脚、板载串口是USART几这些都要看原理图不能想当然。芯片第一脚怎么看也是新手常问的。STM32芯片封装上通常有个圆点或者斜切角有圆点那侧上方就是1脚然后按逆时针方向递增。LQFP封装是逆时针有些其它封装可能是顺时针遇到不确定就查对应型号的数据手册它会明确标出封装顶视图和引脚序号。这块不能靠猜电源和地搞反一次芯片就报废了。还要注意启动模式跳帽。STM32F103有BOOT0和BOOT1两个引脚对应三种启动方式。正常工作必须保证BOOT0跳帽接GND主Flash启动。如果不小心把BOOT0接到了3.3V芯片上电后会进入串口下载模式程序从Flash启动不了表现为“下完程序没反应”这时候很多人会误以为芯片坏了其实就是跳帽位置不对。这属于开箱最容易踩的坑先检查跳帽再怀疑芯片。3. 从点亮一颗LED到玩转串口3.1 时钟树和GPIO到底在配置什么第一个工程我建议还是点灯但点灯前得搞清楚你在配置什么。STM32F103有一个复杂的时钟树。芯片内部的HSI高速内部时钟默认是8MHz经过PLL锁相环倍频后可以跑到72MHz系统主频。Core的时钟、APB1外设总线时钟、APB2外设总线时钟、还有ADC、定时器各自的时钟都是从同一个时钟树上分出来的。很多人点灯成功了好几个工程还是不懂为什么配置GPIO前要先开启GPIOA的时钟其实道理很简单外设就像家里每个房间的灯总闸RCC时钟不推上去单独按房间的开关是没电的。GPIO的配置也不仅仅是设个高低电平那么简单。你要选择引脚模式是推挽输出、开漏输出、浮空输入还是上拉/下拉输入每种模式对应不同的应用场景。点亮LED一般用推挽输出读按键一般用上拉输入模拟I2C总线时则需要开漏输出加上拉电阻。这些概念到后面驱动外部模块时会反复用到。用CubeMX还是直接手写标准库我的观点是入门期两个都要会一点。CubeMX图形化配置时钟和引脚能极大减少查寄存器的痛苦自动生成的初始化代码也不容易漏步骤标准库手写则能帮你理解每个配置背后的含义。建议先用CubeMX生成工程跑通点灯再对照生成的代码逐行去查寄存器手册里对应的位这样既快又不至于完全黑盒。3.2 按键控制和延时函数卡死问题点灯跑通之后第二个练习是按键控制LED翻转。这里面有两个核心点按键消抖和状态切换。按键消抖是硬件层面的问题机械按键在按下和释放的瞬间会产生几毫秒到十几毫秒的抖动信号表现为电平在0和1之间跳变。最简单的方法是检测到电平变化后延时10到20毫秒再确认一次电平。虽然用定时器做扫描更优雅但新手阶段先用延时消抖把逻辑跑通再慢慢优化。延时函数卡死这个也是热词里出现频率极高的问题。标准库里的Delay函数实现方式很多有些依赖SysTick系统滴答定时器有些是纯软件循环。如果你用的是软件循环延时就有一个经典隐患编译器优化等级过高循环被优化掉或者函数内使用了未被volatile修饰的变量导致延时时间不准。更常见的情况是你在中断服务函数里调用了延时函数把中断卡死。延时函数卡住的排查思路是先检查是否被中断打断嵌套再检查SysTick是否配置正确最后看编译器优化等级。我自己的习惯是封装一个基于SysTick的延时函数通过读取SysTick状态位来实现精确延时稳定性比软件循环好太多。按键控制还有一个容易被忽略的细节按键电路怎么设计。低成本的按键模块通常是一端接GND、另一端接GPIOGPIO内部上拉这样按键按下时读到低电平松开时是高电平。如果你的按键模块是高电平触发的逻辑判断就要反过来。拿到模块先看原理图或者用电表量一下不要凭感觉写代码。3.3 串口通信和printf重定向的完整方案点灯和按键只是接触了GPIO输出和输入真正让你感受到“芯片在跟我对话”的是串口。串口是STM32最基础也最常用的通信接口UART管脚定义在不同型号上不一样F103的USART1通常挂在PA9TX和PA10RX上USART2在PA2和PA3上具体以原理图为准。串口学习的重点是三个波特率配置、收发逻辑、重定向。波特率决定通信速率默认习惯19200或者115200收发双方必须一致否则就会出现乱码。乱码还有一种情况是系统时钟没在72MHz晶振不匹配导致计算出来的波特率偏差太大。我遇到过不少次改主频后串口乱码最后检查发现是CubeMX里时钟配置改错了。printf重定向是串口调试的利器。标准库中的printf输出到控制台如果你想在串口助手里看到printf打印的内容需要重定向fputc函数。用标准库时在代码里加上这样一块int fputc(int ch, FILE *f) { while (!(USART1-SR USART_SR_TXE)); USART1-DR (uint8_t)ch; return ch; }这样一来printf就能直接往串口发数据了。调试时打印变量值、打印运行状态比读取寄存器直观得多。从串口这条路继续往下走还能延伸出串口控制协议、Modbus通信、与ESP32/ESP8266的AT指令交互、K210等AI芯片的串口通信都属于同一条路线的进阶。串口这块建议达到的熟练程度是能不看参考手册独立完成一个串口初始化和收发缓冲区的配置。做到这一点你对外设的理解就已经超过很多只会抄例程的人了。4. 学习路线规划从外设到完整项目4.1 定时器、传感器和执行件串口玩明白后STM32学习就进入了一个快速扩张期。接下来最值得深入的是定时器因为它是一个“多功能瑞士军刀”输出PWM控制电机转速和舵机角度、输入捕获测量脉冲频率和脉宽、编码器模式读取旋转编码器、时间基准实现精确延时。热词里“stm32定时器捕获测频率”“stm32超声波测距”都属于这个方向。超声波测距的原理很简单给Trig脚发一个10us以上的高电平脉冲等待Echo脚返回高电平用定时器输入捕获测量高电平持续时间再乘以声速340m/s的一半就是距离。头一回看到这个流程跑通的人普遍会获得巨大的成就感因为这是一个完整的“传感器输入到数值输出”的闭环。传感器方面我推荐的练习顺序是先做数码管显示再做DS1302或者DS3231实时时钟再做OLED屏幕。数码管能让你理解段选位选和动态扫描的时序DS1302让你接触SPI类的三线通信和BCD码OLED则让你进入I2C/SPI驱动的显示世界。热词里提到ILI9341读ID读出来是a1a1这种情况多半不是ID错误而是SPI时序不对或者复位引脚配置不对读ID本身就是一个很经典的寄存器调试练习。执行件方面步进电机和伺服电机是绕不开的。五线四相步进电机的驱动逻辑是依次给四相线圈通电控制脉冲序列就能控制转速和转角带上DRV8323这类驱动芯片后还能驱动无刷电机。如果往工业方向走Modbus RTU协议配合RS485总线控制伺服电机就是很多设备常见的运动控制方案。工业现场用得很广学习曲线也比较陡但掌握了就是实打实的技能。4.2 通信协议的总线思维当你的板子上同时接了OLED、传感器、多个执行器时会发现一个问题GPIO不够用了。这时就会理解为什么要有I2C、SPI、UART、CAN这些总线协议。I2C用两根线挂多个设备每个设备有地址SPI用一主多从的片选方式实现高速通信CAN则用在多节点、长距离、高抗干扰的工业控制场景。STM32F103内置了bxCAN控制器配合外部CAN收发器芯片就能组一个CAN网络。热词里“stm32 can通信突然连不上”是CAN用户的高频噩梦排查重点通常是终端电阻是否匹配、波特率是否一致、总线电平是否正常。CAN总线两端必须各接一个120欧终端电阻少一个都会导致通信不稳定。如果对外设通信的基础打得够好可以尝试“STM32如何做USB设备”这个方向。F103自带USB外设可以做USB转串口、USB鼠标键盘、HID设备甚至可以用它去模拟一个U盘。它的学习难度比串口高不少因为涉及描述符、端点、枚举等概念但非常有价值。掌握USB协议栈的思维后理解大部分PC外设的工作方式都会轻松很多。通信这块的学习方式我强烈建议从一个具体项目出发比如做一个“STM32 传感器数据通过CAN上传到上位机”的小系统。边做边学总线协议比对着数据手册空看效率高得多。4.3 物联方向把STM32连上网很多人学完基础外设后觉得不过瘾想让开发板联网。STM32F103本身没有WiFi模块但这不影响接入物联网常见方案是串口挂一个ESP8266/ESP32模块用AT指令或者SDK方式进行通信。F103和ESP32之间通过UART交换数据F103负责采集传感器和处理本地逻辑ESP32负责连接WiFi和上云。这个组合便宜又实用。上云方式可以直接对接巴法云这类物联网平台用HTTP或者MQTT协议上传数据、下发控制指令。F103端需要处理的只是HTTP协议格式拼接和串口转发难度不高但完整度很好。做完这个项目你对“设备端采集-网络传输-云端存储-APP展示”的物联网全链路会有一个整体认知。如果想做成更完整的作品可以做“STM32鱼缸”温度传感器定时采集水温DS18B20或者NTC都行OLED显示实时数据ESP8266定时上传到云平台超过设定温度时自动控制加热棒或风扇继电器。这类项目看起来简单但实际涉及ADC采集、传感器校准、PID控温思路、继电器驱动、物联网上报做完之后你会发现自己已经能独立设计一个产品原型了。还有更偏向应用的项目比如公交报站器、打印机控制板、智能门禁都是STM32的典型应用场景。选择标准就一条对你来说有真实需求或兴趣的。兴趣是最好的老师这句话在嵌入式领域格外成立。5. 烧录和调试问题排查实录5.1 常见烧录失败的定位方法写代码最憋屈的时刻不是编译报错而是编译通过了却下载不进板子。烧录失败我也遇到过很多次总结下来绝大多数逃不过这几类识别不到芯片。先看调试器有没有被电脑识别再看Keil的Settings界面里能否扫描到芯片。如果扫描不到检查USB线是不是只能充电不能用插上后设备管理器里有没有出现对应的调试器设备。还有一个很隐蔽的问题调试器驱动没装或者被系统识别成了未知设备。重新安装驱动能解决一半问题。下载超时或者校验失败。多数是SWD时钟频率太高或者接线太长。SWD只需要四根线SWDIO、SWCLK、GND、3.3V接线尽量短下载速度先降下来试试。如果用的是ST-Link把速度从10MHz降到1MHz再试能解决不少诡异问题。烧录后程序不运行。这个问题分两种一种是我前面说的BOOT0跳帽不对另一种是代码里把SWD引脚禁用掉了。如果你配置GPIO时不小心把PA13和PA14SWDIO和SWCLK当普通GPIO用了再下载就会找不到芯片。解决办法是按着板子的复位键在Keil点击下载的瞬间松开复位键或者用ST-Link的connect under reset模式能让芯片在复位状态下重新建立连接然后把代码改回来。热词里的“stm32禁用jtag”也和这个相关调试口被禁用后通常就要进入复位模式恢复。5.2 引脚确认与硬件排查的实战技巧硬件层面的排查需要借助万用表和示波器。我见过不少人板子不工作首先怀疑芯片坏了结果最后发现是电源没接对。上电后用万用表量一下芯片供电引脚对地电压3.3V就正常再量一下晶振两脚如果有波形说明时钟没问题。用示波器可以直接看GPIO翻转输出波形Keil的逻辑分析仪也能查看IO输出波形确认代码确实在跑。芯片第一脚怎么确认我再多强调一次。对于LQFP100封装芯片表面左上角有个圆点或者凹坑它旁边的引脚是1脚然后按逆时针方向依次编号。如果你在PCB上发现印丝边框边框上也有个圆点或缺口辅助定位。拿不准的时候最靠谱的做法是查数据手册的封装尺寸图上面会标得很清楚。板子到手先花十分钟确认电源、地、复位脚、启动脚的位置收益远大于风险。还有一个容易被忽略的点外部晶振不起振。F103内部有RC振荡器可以运行但串口波特率精度和USB通信依赖外部晶振。如果程序卡死在系统时钟初始化多半是外部8MHz晶振没起振或者负载电容不匹配。排查时可以把外部时钟切换到内部时钟如果程序正常那问题就锁定在晶振电路上。为了方便存档我把新手最容易撞上的问题和排查方向整理成了一个表现象优先排查方向常见解法下载时识别不到芯片USB线、调试器驱动、连接线换数据线重装驱动降速下载烧录成功但程序不跑BOOT0跳帽、供电BOOT0接地量3.3V供电下载一次后再也无法下载SWD引脚被复用按住复位键进connect under reset恢复串口输出乱码波特率、晶振频率核对两边波特率确认主频是72MHz延时时间不对SysTick配置、优化等级检查时钟源和中断优先级IO电平一直不对模式配置错误、上下拉对照数据手册重新配置GPIO模式CAN通信时通时断终端电阻、总线电平两端各接120欧电阻先降波特率测试这张表我建议截图存起来。遇到问题时先对应表排查效率会高很多。6. 资料筛选和学习节奏建议6.1 怎么从海量资料里找到靠谱的STM32的资料多到什么程度呢多到很多新手直接看晕。我自己的资料筛选原则是官方文档优先其次是有完整工程的开源项目最后才是零碎的博客碎片。官方参考手册RM0008是F103最权威的文档遇到任何寄存器层面的疑问翻它准没错。数据手册用来查引脚定义、电气参数和封装信息是硬件设计时必须看的。例程方面正点原子、普中、野火这几家的开发板配套资料质量都很高工程结构完整注释也算详细。不要贪多选定一家跟着学就够。很多新手最大的问题是今天看A家的教程明天看B家的例程两边代码风格和封装思路完全不一样反而是干扰。跟着一家走通以后再看其它家的代码会轻松很多因为它们底层都是同一颗芯片只是封装不同。遇到不懂的术语不要急着跳过。寄存器、中断向量、位带操作、DMA这些概念会反复出现第一次看不懂很正常先记下来完成几个项目后再回来看会有豁然开朗的感觉。嵌入式学习是螺旋上升的同一概念在不同阶段理解深度完全不一样。6.2 用最小项目保住学习热情学习嵌入式最大的敌人不是难度而是中断。很多人卡在环境搭建那一步就因为遇到一会儿问题没解决就搁置了。我的方法是给自己设定最小项目节点第一周点灯第二周按键加串口第三周驱动OLED显示文字第四周做一个综合小项目。每完成一个节点就发一条记录给自己正反馈。做项目时不要急着原创先复刻一个完整的例程把代码烧进去看到效果再一句一句读懂。读懂之后试着改参数、改逻辑最后再脱离例程从空白工程写出来。这个过程是从“会抄”到“会写”的必经之路。等你能独立从CubeMX新建工程、配好时钟、驱动一个传感器、把数据打到串口上你已经可以开始做自己的毕业设计或者个人作品了。我自己也还在路上这块STM32F103开发板接下来会被我反复折腾。最后分享一个开箱后最实用的习惯每买一块新板子第一时间把原理图和引脚映射表存到手机里建一个“板卡信息”的备忘后续每一次接线、写代码前先查一遍原理图。这个小习惯能让你避开至少一半的硬件连线错误比任何调试技巧都管用。后面这个板子的学习记录我会持续更新从环境搭建到项目实战一个坑都不落感兴趣的话可以跟住咱们一块儿把这颗F103玩明白。
返回列表