恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
STM32F103开发板入门指南:从拆封到独立项目的完整路径
首页
资讯中心
/
STM32F103开发板入门指南:从拆封到独立项目的完整路径
STM32F103开发板入门指南:从拆封到独立项目的完整路径
发布时间:2026/9/29 11:14:18
STM32F103的开发板到手了接下来该干什么板子拆开快递袋那一刻很多人会陷入一种奇怪的沉默一块巴掌大的蓝色PCB几排黑色排针一个USB口外加一颗指甲盖大小的芯片。你盯着它它盯着你谁也不知道该从哪下手。我见过太多人板子买回来拍了张照发个动态然后就在抽屉里躺了半年。不是不想学是不知道第一步该踩在哪里。STM32F103这块板子在嵌入式圈子里基本等同于“新手村入口”。它便宜、资料多、外设全、社区活跃几乎所有做单片机开发的人第一块真正意义上的32位开发板都是它。但“资料多”这件事本身也是双刃剑——你搜“STM32入门”能出来几百个视频、上千篇帖子每个博主都在讲自己的那一套结果就是信息过载反而不知道听谁的。这篇内容不打算给你列一个“三十天精通STM32”的计划表那种东西网上太多了。我想做的是把一块STM32F103开发板从拆封到真正跑起来、再到能独立做点小东西的完整路径按我自己的经验拆开讲清楚。包括工具怎么选、环境怎么搭、第一个程序怎么写、常见坑怎么绕、以及学到什么程度算真正入门。适合刚拿到板子完全不知道从哪开始的新手也适合学过一点但一直卡在“点灯之后不知道干嘛”阶段的半新手。1. 先搞清楚你手里这块板子到底有什么1.1 F103系列的定位和常见型号差异STM32F103是意法半导体ST在2007年前后推出的基于ARM Cortex-M3内核的32位微控制器。它最大的意义在于把32位MCU的价格拉到了8位机的水平同时保持了远高于8位机的性能和外设丰富度。主频72MHzFlash从16KB到1MB不等SRAM从6KB到96KB封装从LQFP48到LQFP144都有。市面上常见的F103开发板核心芯片型号主要有这么几种型号FlashSRAM封装典型开发板STM32F103C8T664KB20KBLQFP48最小系统板蓝色药丸板STM32F103RCT6256KB48KBLQFP64中容量开发板STM32F103ZET6512KB64KBLQFP144大容量综合开发板STM32F103VET6512KB64KBLQFP100工控类开发板如果你买的是那种十几块钱的“蓝色药丸”最小系统板芯片大概率是C8T6。这块板子没有板载调试器你需要额外配一个ST-Link或者DAP-Link下载器。如果你买的是那种带屏幕、带一堆外设的综合开发板芯片可能是RCT6或ZET6板子上通常集成了调试器USB线插上就能用。买板子的时候一定要确认两件事芯片具体型号决定了Flash和SRAM大小直接影响你能写多大的程序以及板子有没有板载调试器没有的话你得单独买一个否则程序烧不进去。1.2 开发板上的外设哪些先别碰综合开发板上通常会焊一堆东西LED灯、按键、蜂鸣器、OLED屏、温湿度传感器、红外接收头、SD卡座、以太网接口、CAN收发器等等。新手最容易犯的错误就是“什么都想试一遍”结果每个外设都只跑了个例程什么都没深入理解。我的建议是前期只关注三样东西一个LED灯、一个按键、一个串口。LED用来验证程序有没有跑起来按键用来学GPIO输入和中断串口用来打印调试信息。这三样东西吃透了STM32的GPIO、时钟、中断、串口通信这几个核心概念就都过了一遍。其他外设等你需要做具体项目的时候再回头翻手册效率高得多。那些板载的传感器和屏幕例程跑通不代表你懂了。例程是别人写好的你只是按了一下编译下载。真正要学的是如果让你从零写一个按键控制LED的代码你能不能在不看例程的情况下写出来。1.3 芯片第一脚怎么确认这个问题看起来很小但确实有人因为芯片方向搞反了导致板子烧掉。STM32的LQFP封装芯片第一脚通常有一个小圆点标记或者芯片表面有一个倒角。在开发板上芯片的第一脚位置一般也会在PCB丝印上标注一个小圆点或者一个缺口标记。如果你要自己画板子或者飞线确认第一脚的方法是把芯片正面的文字摆正左下角那个引脚就是第一脚逆时针数过去依次是2、3、4……直到最后一脚。LQFP48的芯片第一脚在左下角第48脚在左上角。这个在芯片的数据手册Datasheet第一页的封装图里画得很清楚养成查手册的习惯比问别人靠谱。2. 开发环境搭建别在工具选择上纠结太久2.1 Keil、IAR还是STM32CubeIDE这是新手遇到的第一个选择困难。三个工具各有优劣Keil MDK是国内用得最多的教程最多遇到问题最容易搜到答案。缺点是界面老旧代码补全功能弱而且是收费软件虽然有社区版限制。如果你跟着国内大多数教程走用Keil最省心。IAR Embedded Workbench编译效率高代码优化做得好但界面同样不算友好而且收费更贵。新手不太建议从这个入手。STM32CubeIDE是ST官方推出的免费工具基于Eclipse集成了CubeMX配置工具可以图形化配置引脚和外设自动生成初始化代码。缺点是Eclipse系软件比较吃电脑资源而且国内教程相对少一些。我的建议很直接如果你电脑配置还行直接用STM32CubeIDE。它是免费的官方维护CubeMX的图形化配置对新手理解时钟树和外设初始化帮助很大。如果你电脑比较老或者你身边的人都用Keil那就用Keil没必要在这件事上纠结超过半天。有一个坑要注意Keil5可以同时安装C51和STM32的包但安装顺序有讲究。先装C51再装MDK或者先装MDK再装C51可能会导致一些路径冲突。如果你两个都要用建议装在不同目录下安装完成后分别注册。2.2 芯片包安装和工程模板不管你用哪个IDE都需要安装对应的芯片支持包Device Family Pack。Keil的话去官网下载STM32F1系列的DFP包双击安装就行。CubeIDE自带芯片支持不需要额外装。新建工程的时候Keil需要你手动添加启动文件、库文件、头文件路径。这个过程对新手来说比较繁琐但建议你至少手动建一次工程搞清楚每个文件的作用。之后就可以把建好的工程当作模板复制一份改个名字就是新工程。标准库和HAL库的选择也是一个常见问题。标准库Standard Peripheral Library代码直观寄存器操作清晰适合学习底层原理。HAL库Hardware Abstraction Layer是ST现在主推的跨系列兼容性好配合CubeMX用起来很方便但封装层次深出了问题不好排查。新手建议先用标准库把GPIO、中断、串口这些基础外设搞清楚然后再转HAL库。2.3 下载器怎么选怎么接常见的下载器有ST-Link、J-Link、DAP-Link三种。ST-Link是ST官方的便宜好用支持SWD和JTAG两种模式。J-Link性能更强支持更多芯片但价格贵一些。DAP-Link是开源的性价比高。接线方式上SWD模式只需要四根线VCC、GND、SWDIO、SWCLK。有些下载器还需要接RST但大多数情况下不接也能正常下载。接线的时候注意开发板上的SWD接口丝印一般会标成SWDIO/SWCLK或者PA13/PA14。一个很常见的坑下载器插上电脑后设备管理器里能识别但Keil里就是找不到设备。这时候先检查开发板有没有独立供电有些最小系统板只靠下载器供电是不够的。另外检查SWD线有没有接反SWDIO和SWCLK接反了不会烧板子但肯定连不上。3. 从点灯到串口第一个真正跑通的程序3.1 点灯之前先理解时钟几乎所有STM32教程的第一个程序都是点灯。但很多人点完灯就结束了没有去理解为什么要点亮一个LED需要配置那么多东西。STM32的GPIO挂载在APB2总线上使用之前必须先使能对应的时钟。这个设计是为了省电——不用的外设时钟关掉芯片功耗就能降下来。以PA5接LED为例标准库的点灯代码大概长这样#include stm32f10x.h void Delay(uint32_t count) { while(count--); } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); while(1) { GPIO_SetBits(GPIOA, GPIO_Pin_5); Delay(500000); GPIO_ResetBits(GPIOA, GPIO_Pin_5); Delay(500000); } }这段代码里RCC_APB2PeriphClockCmd就是使能GPIOA的时钟。如果你把这行注释掉LED不会亮程序也不会报错就是静静地什么都不发生。这是新手最容易困惑的地方——代码编译通过了下载也成功了但板子没反应。十有八九是时钟没开。3.2 按键输入和消抖点灯跑通之后下一步是按键控制。按键的本质是GPIO输入但机械按键有一个物理特性按下和松开的瞬间电平不是干净利落地从高变低或从低变高而是会抖动几毫秒到十几毫秒。如果不处理一次按下可能会被识别成多次。消抖有两种方式硬件消抖和软件消抖。硬件消抖是在按键两端并联一个电容成本高但效果好。软件消抖是检测到电平变化后延时10ms左右再检测一次确认电平稳定了才认为是有效按下。软件消抖不增加硬件成本但会占用CPU时间。if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) 0) { Delay(10000); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) 0) { GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13))); while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) 0); } }这段代码里while循环等待按键松开是为了防止按住不放的时候LED疯狂闪烁。这个逻辑很简单但实际项目中按键处理往往比这复杂得多后面讲中断的时候会展开。3.3 串口打印你的第一双眼睛单片机开发最难受的地方在于程序跑在芯片里你看不到任何中间变量。串口就是解决这个问题的——把想看的变量通过串口发送到电脑上用串口助手显示出来。STM32F103通常有3个USART和2个UART。USART1挂在APB2上最高波特率可以到4.5Mbps。配置串口需要设置波特率、数据位、停止位、校验位、硬件流控这几个参数。最常用的配置是115200-8-N-1波特率1152008位数据位无校验1位停止位。void USART1_Init(uint32_t bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStructure); USART_InitStructure.USART_BaudRate bound; USART_InitStructure.USART_WordLength USART_WordLength_8b; USART_InitStructure.USART_StopBits USART_StopBits_1; USART_InitStructure.USART_Parity USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, USART_InitStructure); USART_Cmd(USART1, ENABLE); }PA9是TXPA10是RX。接线的时候注意开发板的TX要接串口模块的RX开发板的RX要接串口模块的TX交叉连接。接反了收不到数据但不会烧。串口调试有一个很隐蔽的坑如果你用的是USB转TTL模块一定要确认模块的电平是3.3V而不是5V。STM32的IO口耐压是3.3V5V电平长期灌进去可能会损坏芯片。有些模块上有跳线帽可以选择3.3V或5V插上之前先看一眼。4. 那些让新手卡住的典型问题4.1 编译成功但烧录失败这是新手遇到频率最高的问题之一。Keil里编译显示0 Error 0 Warning但点下载按钮就弹出一个错误框提示“Flash Download failed”或者“No Cortex-M Device found”。排查顺序是这样的先确认下载器驱动装好了没有设备管理器里有没有识别到。然后确认开发板供电正常电源灯亮不亮。接着检查SWD接线SWDIO和SWCLK有没有接反GND有没有共地。如果这些都正常检查Keil里的调试配置Debug选项卡里选的下载器型号对不对Settings里面能不能看到芯片的ID号。还有一个容易被忽略的原因芯片被读保护了。有些开发板出厂时设置了读保护或者你之前不小心点了“Secure Chip”之类的选项。这时候需要用ST-Link Utility或者STM32CubeProgrammer来解除保护。具体操作是连接芯片后在工具里选择“Disable Read Out Protection”然后重新上电。4.2 延时函数卡死Delay函数用循环实现简单粗暴但有一个致命问题编译器优化等级调高之后空循环可能会被优化掉导致延时时间完全不对。更严重的是如果延时函数里用了while(count--)这种写法当count是0的时候count--会先判断再减0减到65535循环次数完全失控。正确的做法是用SysTick定时器来做延时。SysTick是Cortex-M3内核自带的一个24位递减计数器配置好之后可以产生精确的毫秒级延时。标准库里有现成的SysTick_Config函数可以用。void Delay_ms(uint32_t ms) { uint32_t temp; SysTick-LOAD 9000 * ms; SysTick-VAL 0x00; SysTick-CTRL | 0x01; do { temp SysTick-CTRL; } while((temp 0x01) !(temp (1 16))); SysTick-CTRL ~0x01; SysTick-VAL 0x00; }这段代码里9000是72MHz主频下1ms的计数值72MHz / 8 9MHz9MHz下1ms是9000个周期。用SysTick做延时精度高不占用CPU而且不会被编译器优化影响。4.3 JTAG引脚被占用导致下载失败STM32F103的PA13、PA14、PA15、PB3、PB4这五个引脚默认功能是JTAG调试接口。如果你在程序里把其中某个引脚配置成了普通GPIO下载器可能就连不上芯片了。这时候需要把下载模式从JTAG改成SWD因为SWD只占用PA13和PA14两个引脚。在Keil的Debug设置里把Debug模式从JTAG改成SWD然后重新连接。如果还是连不上需要按住开发板的复位键点下载的同时松开复位键让芯片在复位后的瞬间被下载器捕获到。如果你确实需要用PA15或PB3、PB4做普通IO记得在代码里关闭JTAG功能只保留SWD。标准库里的做法是调用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE)这样PA15、PB3、PB4就可以当普通GPIO用了。4.4 中断优先级搞混导致程序跑飞STM32F103的中断优先级分为抢占优先级和响应优先级。抢占优先级高的中断可以打断正在执行的抢占优先级低的中断响应优先级只在同时发生多个中断时决定谁先执行不能打断。新手常见的问题是串口接收中断和定时器中断同时开优先级没配好结果串口数据收一半被定时器打断数据就乱了。或者按键中断里做了太多事情导致其他中断响应不及时。配置中断优先级的函数是NVIC_Init里面有一个NVIC_IRQChannelPreemptionPriority和一个NVIC_IRQChannelSubPriority。F103的分组方式有5种最常用的是分组22位抢占优先级2位响应优先级。这意味着抢占优先级可以设0到3响应优先级也可以设0到3。5. 从例程到项目怎么才算真正入门5.1 能独立写一个多任务调度框架很多人学STM32学到一定程度就卡住了因为一直在跑例程没有自己搭过框架。一个真正入门的标志是你能不用RTOS只用定时器中断和状态机写出一个同时处理按键、串口、LED闪烁、传感器采集的程序而且各个任务互不干扰。这个框架的核心是时间片轮询。用一个定时器产生1ms的中断在中断里给各个任务计数器加一主循环里判断计数器是否达到设定值达到了就执行对应任务。这样每个任务都有自己的执行周期不会因为某个任务耗时太长而影响其他任务。volatile uint32_t task1_counter 0; volatile uint32_t task2_counter 0; void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET) { task1_counter; task2_counter; TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } } int main(void) { Timer3_Init(999, 71); while(1) { if(task1_counter 100) { task1_counter 0; Task1_LED_Toggle(); } if(task2_counter 500) { task2_counter 0; Task2_Read_Sensor(); } } }这个框架简单但实用很多实际项目就是这么做的。等你把这个框架写熟了再去学FreeRTOS或者RT-Thread会发现RTOS本质上也是在做类似的事情只是封装得更好、功能更全。5.2 能看懂数据手册和参考手册STM32F103有两本重要的文档数据手册Datasheet和参考手册Reference Manual。数据手册讲的是芯片的电气特性、引脚定义、封装尺寸、订购信息。参考手册讲的是各个外设的工作原理、寄存器定义、配置方法。新手看参考手册容易犯困因为全是寄存器表格。但如果你想真正理解STM32参考手册是绕不过去的。我的建议是不要从头到尾看而是用到哪个外设就翻到对应章节。比如你要配置定时器输入捕获就翻到TIM章节的输入捕获部分看寄存器怎么配、流程是什么。看手册的时候重点关注几个东西外设的时钟来源、寄存器的位定义、配置的先后顺序、有哪些标志位需要清除。这四点搞清楚了大部分外设都能自己配出来。5.3 能自己画一块最小系统板学到一定程度之后建议自己画一块STM32最小系统板。不需要多复杂就是把芯片、晶振、复位电路、电源滤波、下载接口、几个LED和按键画上去就行。画板子的过程会逼着你去看数据手册里的引脚定义、电源要求、晶振负载电容计算、复位电路设计。这些东西看教程的时候觉得很简单自己画的时候才发现到处都是细节。比如晶振的负载电容怎么选复位电容用多大BOOT0和BOOT1怎么接这些都有讲究。画完之后打样焊接下载程序点亮。这一套走下来你对STM32的理解会从“会写代码”上升到“懂硬件”这个跨越比学多少个外设都有价值。5.4 做几个完整的小项目最后给自己定几个小项目目标。不要那种跑个例程就完事的要能拿得出手的完整项目。比如基于STM32的智能台灯光敏电阻采集环境光PWM调光按键切换模式OLED显示状态。基于STM32的超声波测距仪HC-SR04采集距离串口输出数据超阈值报警。基于STM32的温湿度记录仪DHT11采集温湿度SD卡存储数据RTC记录时间。基于STM32的直流电机调速系统PWM驱动电机编码器测速PID闭环控制。这些项目网上都有现成的代码可以参考但建议你先自己写一遍遇到问题再去看别人的实现。自己写出来的代码哪怕丑一点也比复制粘贴的收获大得多。6. 一些零散但重要的经验6.1 关于开发板选型的补充如果你还没买板子或者想再买一块有几个点可以参考。最小系统板C8T6便宜适合入门和做小项目但IO口少外设少学到后面可能会觉得不够用。综合开发板ZET6或VET6外设全IO多适合学习和做复杂项目但价格贵一些而且很多板载外设你可能根本用不到。我的建议是第一块板子买综合开发板因为你需要一个“什么都有”的环境来探索。第二块板子可以买最小系统板用来做实际项目因为便宜、体积小、方便集成。6.2 关于代码风格从第一天写代码就养成好习惯。变量命名要有意义不要用a、b、c。函数功能要单一一个函数只做一件事。注释要写清楚“为什么”而不是“是什么”。比如GPIO_SetBits(GPIOA, GPIO_Pin_5);这行代码不需要注释“设置PA5为高电平”但需要注释“点亮LED表示系统正常运行”。代码风格这件事刚开始觉得无所谓等项目代码超过一千行的时候你就会感谢当初认真写注释的自己。6.3 关于学习节奏STM32的学习曲线不是线性的。刚开始点灯、按键、串口进步很快每天都能看到新东西。到了中断、定时器、DMA这些地方速度会慢下来因为概念更抽象调试更困难。再往后到RTOS、文件系统、网络协议栈又会进入一个快速成长期。遇到卡住的时候不要死磕。先放一放去做点别的外设过几天再回来看往往就豁然开朗了。嵌入式开发这件事很多概念需要时间沉淀急不来。6.4 关于社区和资料STM32的社区资源非常丰富但质量参差不齐。遇到问题的时候优先查官方文档和官方论坛其次是GitHub上的开源项目最后才是各种博客和视频教程。官方文档虽然枯燥但准确。博客和视频可能讲得更通俗但有时候会有错误或者过时的信息。另外学会用搜索引擎的高级技巧。搜“STM32F103 串口 乱码”比搜“STM32串口问题”更容易找到答案。关键词越具体搜索结果越精准。6.5 关于工具链的长期规划如果你打算长期做嵌入式开发建议尽早熟悉命令行工具链。Keil和CubeIDE都是图形化IDE方便但不够灵活。arm-none-eabi-gcc配合Makefile或者CMake可以让你在任何环境下编译STM32代码包括在Linux服务器上做持续集成。VS Code配合Cortex-Debug插件也能实现STM32的开发和调试。这套方案配置起来比Keil麻烦但一旦配好开发体验非常好。代码补全、语法检查、Git集成、远程开发这些功能Keil都不如VS Code。如果你在VS Code里编译成功但烧录不进去大概率是调试配置的问题。检查launch.json里的servertype和device参数确保和你的下载器、芯片型号匹配。另外确认svd文件路径正确否则调试的时候看不到寄存器状态。STM32F103这块板子说简单也简单说深也深。简单在于你花一个周末就能把GPIO、中断、串口跑通。深在于同样一块芯片有人用它做了个流水灯有人用它做了飞控、做了数控电源、做了工业网关。区别不在于芯片本身而在于你愿意往下挖多深。板子已经买回来了接下来就看你的了。