资讯动态

STM32F103入门指南:从环境搭建到项目实战的完整学习路线

发布时间:2026/10/31 6:22:12 来源:尧图企业网站定制
STM32F103这块板子我是蹲了大半年才下决心买的说实话周围的人挺不理解——iPhone都出到16了我还在掏钱买一颗2006年发布、主频只有72MHz的Cortex-M3单片机。但你真去翻一圈嵌入式招聘JD或者看两眼毕业设计的选题清单会发现F103这三个字依旧高频出现。这篇文章不卖课、不写广告纯粹从一个刚拆箱的新手视角把“开发板到手之后怎么学STM32”这件事从头到尾捋一遍环境怎么搭、第一段代码跑什么、哪些坑十个新手九个踩、以及最后怎么靠这块板子练出能拿得出手的项目。我尽量把话说人话能上代码的上代码能给出排查步骤的给步骤你看完照着走就行。1. 为什么我劝你第一步先玩F103这块“老古董”依然是入门最优解1.1 F103在生态里的位置资料多到能淹死人反而不是坏事F103是意法半导体基于Cortex-M3内核的经典MCU系列常见的STM32F103C8T6有64KB Flash、20KB RAM旗舰的ZET6是512KB Flash、64KB RAM。单看性能它连现在一颗手机处理器零头的零头都赶不上但它占了两个无法替代的优势一是外设齐全到离谱USART、SPI、I2C、ADC、定时器、CAN、USB全都有你能想到的嵌入式基本功它都能练二是生态成熟得像老城区搜索引擎一搜从报错到例程到毕业设计源码几万条资料铺在你面前。很多人觉得资料多是好事但刚入门时恰恰会被“多”淹没。我的建议很直接把F103当成你的第一块板子是因为你搜到的10条教程里至少有8条能直接跑通。你学I2C时搜“STM32 I2C例程”出来的多半是F103的代码你学定时器输入捕获B站和博客上铺天盖地也是F103的演示。这种“几乎所有问题都有人踩过并写下了答案”的确定性是新手最稀缺的东西。1.2 同价位开发板横评ESP32、Arduino、3588凭什么被我排除下单之前我也纠结过要不要上别的板子毕竟现在选择太多了。如果你正面临同样的纠结听我说说排除理由ESP32-C3等无线MCUWi-Fi和蓝牙是它的强项做IoT项目确实方便但它的开发资源高度依赖平台管理器光是“esp32开发板包下载”就能卡住新手一晚上。而且ESP32很多外设的驱动封装太“黑盒”你很难从寄存器层面理解单片机到底在干什么。Arduino系列五分钟点亮LED确实爽但Arduino把GPIO、中断、定时器全部抽象成了digitalWrite和delay。用它做作品非常合适用它学单片机底层就是在给自己埋坑——你要是只会调用封装换到裸机环境依然无从下手。RK3588这类高算力开发板它是跑Linux的应用处理器难度层级完全不一样。你连MCU的裸机逻辑都没建立直接上Linux板卡只会变成“照着教程敲命令”内核设备树、交叉编译、驱动模型一堆概念砸过来心态直接崩。所以我最终锁定了F103的开发板。它那种“笨拙感”恰恰是优点寄存器要自己查、时钟要自己配、中断要自己设计你把每一步都搞清楚后再回去看ESP32和Arduino一眼就能看穿它们底下的封装逻辑。1.3 挑开发板时看哪几个硬件细节买开发板也别闭眼乱选同一个F103系列板子和板子的差距比你想的大。我看中三件事芯片型号优先选STM32F103C8T6或ZET6C8T6便宜ZET6引脚多、外设资源全。像“STM32F103VET6”这种大芯片后续做项目尤其是带LCD屏或者多路PWM不用换板。调试下载方式最好带板载ST-Link或SWD接口没有的话至少要带USB转串口芯片。千万别买只留一个下载口、连原理图都不给的板子后患无穷。板上资源LED、按键、可拆卸跳线帽、引出全部GPIO排针最好预留TFT-LCD接口。F103玩到中后期一定会碰屏幕板载接口能省一堆杜邦线。价格方面几十块到一百出头都是合理区间。省下的钱不如买一个独立ST-Link V2下载器那玩意儿才是陪你最久的工具。2. 开箱后第一小时别急着敲代码先把这三件事做对2.1 工具链和驱动别把顺序搞反了我记得自己第一次踩坑就是环境安装先装了各种杂七杂八的插件结果芯片包没装编译报错一堆折腾到怀疑人生。正确顺序应该这样安装Keil MDK建议5.x版本安装时勾选需要的组件这一步绕不开。装完先别急着建工程。安装STM32F1系列器件支持包。Keil 5以后的版本芯片支持包和IDE是分开的你需要在Pack Installer里找到“STM32F1xx Device Support”或者到官网下载离线pack包手动双击安装。这一步对应“stm32芯片包安装”的高频问题注意是离线包而非在线等他慢慢转。装ST-Link驱动。插上ST-Link后系统如果识别不了去官网下最新的驱动包重装一遍。装CH340等USB转串口驱动。如果你的板载下载器是国产物料大概率要手动安装。顺序反了的典型症状是Keil能打开但“Device”里找不到STM32F103或者Download时报“No ST-Link detected”。遇到别慌按这个顺序倒回去重装十有八九能解决。如果你习惯用现代编辑器VSCode EIDE或PlatformIO也能搭STM32开发环境但那更适合已经有基础的人。刚开始学我强烈建议留在Keil里网上十个教程九个是Keil界面你有任何操作失误都更容易对照排查。2.2 芯片第一脚怎么确认新手烧板高发区的正确姿势你可能觉得“第一脚”这种问题很弱智但把它拿出来说真不是废话——我见过不止一个新手把SWD的四根线插反或者杜邦线接到相邻引脚上然后对着冒烟的板子发呆。确认第一脚的办法有三个按优先级排序看丝印芯片表面的圆形凹点或缺角旁边就是1脚。F103大多在左上角。看原理图开发板卖家都会给原理图找到MCU封装的引脚序号和实物丝印一一对应。看板载标识开发板丝网上通常会用小圆圈标注1脚排针附近也有文字编号。接到ST-Link时遵循SWDIO、SWCLK、GND、3V3“四线法”芯片3V3接下载器3V3。接到开发板的USB串口下载时TXD接芯片的RX1RXD接芯片的TX1交叉接别同名单接。2.3 标准库还是HAL库先把这个选择题做了现在的STM32教程分两大流派老一点的教学多用标准库Standard Peripheral Library新一点的用STM32CubeMX HAL库。我刚开始学的时候也是犹豫了半天最后的结论是先把标准库学会再切换到HAL。为什么标准库是对寄存器的轻量封装你写GPIO_SetBits时脑子里还能隐约想到背后有个ODR寄存器在变。HAL库封装层次更深隐藏了寄存器和寄存器映射新手容易“会用但不懂”。标准库虽然官方不再更新但F103的老项目、老代码、绝大多数教材都还是它你能搜到的经典例程基本还是这个套路。下面这段代码就是标准库点亮板载LED的核心逻辑你先跑通它再往后走#include stm32f10x.h void Delay(volatile uint32_t n) { while (n--); } 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的时钟、把PC13配成推挽输出、然后循环拉高拉低。跑通它你就理解了“寄存器外设驱动”的基本套路——任何外设无非就是在做“开时钟、配模式、操作它”三步。3. 从点灯到实用外设学习顺序决定你三个月后的水平3.1 GPIO点灯只是入场券中断是第一道分水岭很多新手点完灯就以为自己会单片机了这是最大的错觉。点灯只证明你学会了GPIO输出离入门还差一个关键概念中断。CPU在一个死循环里翻转LED和在工作时随时响应外部事件这是两个境界。中断是什么通俗讲就是你正在做饭门铃响了你放下锅去开门拿完快递再回来接着炒菜。门铃就是中断源接快递的过程就是中断服务函数。F103里有个NVIC中断控制器专门管理这些“门铃”的优先级和开关。学完GPIO输出紧接着学GPIO输入按键检测和外部中断EXTI。拿F103的PA0做按键实验按下触发一次中断LED翻转一次。中断服务函数不要放耗时操作否则会卡住主程序这是所有MCU工程师都懂的铁律。你把中断学会后面定时器、串口、ADC全都会顺很多。3.2 定时器、串口、ADC这三个外设串起来才算入门F103最值得花时间的就是它的定时器资源。别看这颗芯片老它有多个高级定时器能做定时中断、PWM输出、输入捕获。我的学习顺序是这样的定时器定时中断替代delay让程序能在精确时刻做事情比如每1ms翻转一次IO。定时器PWM输出控制电机转速、舵机角度、LED亮度。对应“stm32控制伺服电机485”这种需求本质就是PWM信号加通信协议。定时器输入捕获测量外部信号的频率和脉宽。你做“stm32超声波测距”就是发一个触发脉冲然后利用输入捕获测Echo引脚高电平的持续时间距离就等于声速乘以时间除以2。然后就是串口UART。别只是收发字符串要会重定向printf到串口。在Keil里勾选MicroLIB后写这几行代码就能用printf调试int fputc(int ch, FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); USART_SendData(USART1, (uint8_t)ch); return ch; }这一步务必搞懂后面的PID调试、数据打印全靠它。printf不仅能打印“hello world”还能把传感器数值、PWM占空比、温度曲线全部输出到上位机配合VOFA或者匿名助手你能以图形化方式看到变量的实时变化。串口调试PID就是这么玩的一边让小车电机转一边用串口打印速度反馈观察曲线如何收敛。3.3 超声波、屏幕这类项目习题正好用来消化外设我见过很多人学完外设最后忘了原因是只做“实验”不做“项目”。我的经验是点灯只是认识GPIO你至少要用两块模块做点小东西知识才会焊死。比如HC-SR04超声波测距模块这其实是定时器输入捕获的经典练习。你不需要理解声波物理只要搞明白Trig引脚拉高10us触发Echo引脚会返回一个高电平高电平的持续时间就是超声波往返时间。用定时器输入捕获去量这个时间算出来距离再通过串口打印出来一个最简单的测距仪就完成了。再比如stm32使用ILI9341驱动的TFT屏最典型的问题是读ID读回来是0xA1A1。这通常说明数据线和电源没问题但初始化序列不对或者读ID指令和屏厂不匹配。遇到这种问题真正的锻炼价值是你得学会看数据手册、查初始化参数、用逻辑分析仪确认时序。这不比背一百个API有用多了还有DS3231这种I2C高精度时钟模块用来做万年历、时钟屏。I2C的学习本身就涉及时序、上拉电阻、应答位配合DS3231现实场景学起来非常快。我建议把“超声波测距OLED显示”或者“DS3231时钟TFT屏”作为中期目标这两个小项目能覆盖中断、定时器、I2C、USART四大核心外设。4. 新手期最容易卡住你的四个坑我当年每个都踩过4.1 delay卡死主频配置与优化等级的爱恨情仇“stm32延时函数delay卡死”绝对是热搜级别的坑我当年也卡了整整一晚上。现象很诡异代码编译下载成功后LED不闪板子像死了一样。排查链路是这样的先看时钟配置F103上电默认走HSI内部8MHz时钟如果你没在系统启动时切换到HSE外部8MHz晶振并PLL倍频到72MHz而你的delay是拿72000000这种参数算出来的那么延时会变成实际时间的9倍看起来就像卡死。再看delay实现方式如果用简单while(n--);变量请写成volatile uint32_t。被优化后的空循环可能直接被编译器删掉变成无限循环或干脆不延时。再看优化等级Keil里Options - C/C的Optimization如果开到-O2某些循环会被优化出问题。新手阶段先保持默认-O0排除一个变量再加优化。最后看delay是否和中断冲突如果在中断服务函数里调用了一个依赖全局变量的非重入delay会发生不可预知的卡死。中断里面不要用delay要用标志位或定时器。如果点灯程序只是“不闪”别一上来怀疑芯片坏了从时钟、编译优化、循环变量这三个位置查起九成问题出在这。4.2 芯片包安装失败、ST-Link连不上开发环境三个隐形雷环境问题是劝退新手的第一大杀手很多人在“还没开始学”就已经放弃了。常见症状和根因如下症状根因解决思路Keil里找不到STM32F103器件支持包没装手动安装离线pack包注意版本Download时报No Target ConnectedST-Link驱动异常重装驱动换USB口下载时提示“Cannot access target”SWD接线松、目标板没上电检查四根线顺序给板子单独供电下载经常失败但重启就好线太长、接触不良换短杜邦线或直接焊接keil5安装后C51工程也打不开兼容包未装若需要51和STM32共存安装C51支持包我唯一想强调的点是ST-Link的SWD线能短就短。曾经我被一根30厘米的杜邦线坑了三天总是下载到一半失败最后换了一根15厘米的线立刻稳定。高速信号在长导线上的信号完整性问题新手阶段感受不到但迟早会懂。4.3 SWD和JTAG被禁用后程序下不进去新手的终极噩梦“stm32禁用jtag”这个话题跟着F103一直热到现在。原因也很简单PA13、PA14、PA15这几个引脚默认是SWD/JTAG调试口很多人学到GPIO复用后想解放这几个引脚于是调用了GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);全禁用了。然后——再也连不上调试器了。解决办法分两种情况如果你还有串口ISP能力把板上的BOOT0跳线拉高BOOT1拉低重新上电芯片会进入系统存储器启动模式。此时用串口下载工具擦除Flash全片擦除即可调试口就恢复了。擦完记得把BOOT0跳回低电平。如果你用的是ST-Link在Keil的Flash Download设置里把“Reset under Reset”或“Connect under Reset”勾上有时候能救回来。但最稳妥的还是ISP擦除。所以我的建议是学GPIO复用时可以试着重映射但先别把SWJ全部禁用。你至少要保留SWD口否则每次调试都要跳BOOT0会崩溃的。想释放那几个引脚成熟的板子一般会把调试口通过排针单独引出来或者在试用完JTAG之后只禁JTAG而保留SWDGPIO_Remap_SWJ_JTAGDisable。4.4 USB设备、CAN这种高级外设别在错误时机硬刚热词里有个“stm32 如何做usb设备”很多人拿到板子第一件事就想把它模拟成鼠标键盘。想法很好但F103的USB是全速设备要求系统的48MHz时钟必须精准而48MHz通常由PLL输出分频得到——这意味着你得先把RCC时钟树彻底搞明白否则USB要么枚举失败要么疯狂掉线。我的建议是排在“点灯、串口、定时器、中断”之后再做USB。一旦永安串口都熟了再做USB HID鼠标或者虚拟串口你只需要对着官方例程改改描述符就行。类似的还有“stm32 can通信突然连不上”这类问题CAN总线的坑主要在于末端要有120Ω终端电阻、收发器要正常供电、CANH和CANL不能接反、波特率必须和大家一致。连不上时按这个顺序用万用表和示波器排查几分钟就能定位。很多新手觉得CAN、USB这些名字听着高级就想先学但它们的调试难度完全建立在前面的基础功底上。如果你连定时器的时钟分频都算不利索去调USB的48MHz只会雪上加霜。5. 把F103玩到能独立做项目的程度我的进阶路线图5.1 从开发板到自制板最小系统设计的几个硬指标开发板的作用是让你低成本学习但真正找工作或者做产品你不可能带着一块大开发板出门。玩到第二个月我开始自己画F103的最小系统板。一个能稳定跑起来的最小系统包括STM32F103C8T6主控、8MHz外部晶振和两个20pF负载电容、复位电路、BOOT0下拉电阻、3.3V电源电路一般用AMS1117-3.3、SWD调试接口以及分布在VDD附近的0.1uF去耦电容。这套组合下来板子就能跑。有几个细节值得多说一句晶振离芯片越近越好走线短而直。每个电源引脚旁边都要放去耦电容C8T6的VDD和VDDA一个都不能漏。漏了可能出现工作不稳定、ADC读数飘的怪问题。复位脚要加上拉电阻和接地电容不要悬空。想画四层板就尽量双层起步市面上的开发板布局就是最好的参考。PCB工艺用嘉立创几块钱就能打样完全不是门槛。做完最小系统板之后你会发现之前学的外设全都串起来了你用定时器PWM驱动电机用串口下载调试用ADC采集电流一个真正属于自己的“产品原型”慢慢成型。5.2 从标准库迁到HAL/CubeMX的正确时机标准库学到能看懂GPIO_Init这些结构体配置并且能独立写一个串口收发程序后我建议开始接触STM32CubeMX和HAL库。为什么要转因为新出的STM32系列比如G0、H7官方只支持HAL库而且CubeMX能根据你想用的外设自动生成初始化代码省去大量查手册配寄存器的时间。常见的学习曲线是一开始会觉得HAL库很啰嗦HAL_GPIO_WritePin和HAL_UART_Transmit这类函数封装了一层又一层。但好处是代码结构统一、换芯片时迁移方便而且CubeMX生成的工程把时钟树、引脚复用和中断优先级都配置好了你只需要填业务逻辑。我的判断标准很明确只要你能独立说出“GPIO_Mode_Out_PP”背后的物理含义就可以切换到HAL了。因为你已经知道底层是什么用HAL就是在“抄近路”而不是在黑盒里裸奔。迁移时机选在做一个稍微复杂一点的项目时比如鱼缸控制器一个定时器控制加热棒通断、一个ADC读取水温、一个串口接ESP8266联网上报到巴法云这种项目用CubeMX先初始化快得多。5.3 用VSCode搭建开发环境尽早脱离Keil的舒适区等你熟练了Keil可以试试用VSCode EIDE插件 arm-none-eabi-gcc OpenOCD来构建STM32工程。这一步不是炫技而是提前适应现代嵌入式开发流程代码跳转、Git版本管理、格式化、CMake构建都比Keil舒服得多。配置过程中几乎人人都会碰到的就是调试器设置对应热词里“vscode stm32调试powerlink如何设置launch.json”。不管项目里有没有powerlink协议栈你都需要一个能正常启动GDB调试的launch.json{ version: 0.2.0, configurations: [ { name: STM32 Debug, type: cortex-debug, request: launch, servertype: openocd, configFiles: [ interface/stlink-v2.cfg, target/stm32f1x.cfg ], executable: build/led.elf } ] }关键就在configFiles两行第一行是指定用ST-Link作为调试器第二行是指定芯片目标。很多人的launch.json报错十有八九是这两行配置和你的下载器/芯片不匹配。5.4 用项目收尾鱼缸控制器、平衡小车、Modbus从站最后一个阶段我称之为“带着目的去学”。纯学外设的尽头是迷茫项目才是让知识互相咬合的齿轮。以下三个方向我都试过或拆解过按难度递增排列鱼缸控制器DS18B20测温、继电器控制加热棒、OLED显示、按键设置温度阈值、可选的联网上报。覆盖GPIO、ADC或单总线、定时器、显示、人机交互做完你对“系统设计”四个字有体感。两轮平衡小车MPU6050姿态解算、编码器测速、定时器PWM驱动电机、PID闭环控制这就是热词“stm32串口调试pid”的最佳实战场。项目本身要处理电机转向、零点漂移、PID调参能把前面所有知识点打得稀碎再重组。Modbus从站用F103实现一个Modbus RTU从站响应主站的寄存器读写上位机用Modbus Poll控制灯的亮灭或电机的转速。“agile_modbus stm32”这种热词说明很多工业自动化方向的人在干这件事搞懂它你去碰CANopen、EtherCAT这些工业总线时不会慌。做完这三个项目你看开发板的角度会彻底改变它不再是“学F103的开发板”而是一个你能随意组装、替换、裁剪的积木。我个人玩F103最深的体会是这颗芯片本身没什么了不起的技术含量真正有价值的是它逼你养成的调试习惯——读手册前先百度、写代码前先想时钟、连不上先量电压。这不是某个外设的实验报告而是一整套嵌入式工程师的肌肉记忆。接下来我打算把这类踩坑记录、例程改动和最小系统打板过程持续整理成系列内容保持更新想一起学STM32的朋友可以守着后续的动态每篇都会像这次一样给足代码和排查思路。

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

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

免费获取报价 →
↑