ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

STM32F103开发板从入门到实战:点灯、外设与避坑指南

STM32F103开发板从入门到实战:点灯、外设与避坑指南 STM32F103的开发板刚到手很多人都是这个状态快递拆开板子拿在手里翻来覆去看了几遍数据线一插电脑“叮咚”一声然后就没有然后了。板子吃灰三个月再想起来的时候连Keil都打不开了。这个标题——“stm32-103的开发板买回来了想学stm32的可以点个关注”——看着像是个新手报到帖但过来人都知道这恰恰是学习嵌入式最关键的一个节点。板子到手之后那一周干了什么基本决定了你是三个月后能自己写驱动、调外设、做小项目还是把板子放在书架顶层落灰。这篇就当是我陪你一起开箱把这板子从第一次通电到独立做项目的完整路径捋一遍。我尽量说人话该给代码给代码该讲原理讲原理该排坑排坑不搞云里雾里那一套。1. 为什么是F103一块“老古董”凭什么还在被大家买STM32F103这块芯片2007年问世到现在十几年了。你要说它性能强那真算不上72MHz主频64KB Flash20KB SRAM放在今天也就是个“中老年”水平。但你要是想学STM32在2025年买开发板F103依然是最合理的选择之一。1.1 Cortex-M3的内核底子STM32F103用的是ARM Cortex-M3内核属于经典中的经典。Cortex-M3是个什么概念它定义了中断向量表怎么放、NVIC中断控制器怎么工作、Thumb-2指令集怎么执行、系统定时器SysTick长什么样。这些底层机制在M3、M4、M7甚至后来的M33内核上大同小异。你在F103上学到的中断优先级分组、SysTick延时、位带操作、启动文件里的向量表跳转流程换到F407、H743上照样成立只是外设寄存器和时钟树变了。这就像学开车用了一辆老捷达离合手感清晰、油门响应直接开熟了换奔驰宝马你缺的只是适应过程而不是重新学一遍。换句话说F103把“芯片内部是怎么跑起来”这件事暴露得足够清楚没有那么多自动化的隐藏逻辑特别适合用来建立嵌入式的地基认知。1.2 生态和资料是真正的护城河F103真正无敌的地方不是性能是生态。你去搜“STM32 GPIO配置”打开十个网页九个半是F103的例程去GitHub搜stm32f103相关的项目几千个起步B站、CSDN、电子发烧友上关于F103的教程视频和图文多到你看不完。这个生态意味着什么意味着你在学习过程中遇到任何问题基本都有人踩过、问过、回答过。比如后面我讲到的ILI9341读ID读到0xA1A1、CAN通信突然连不上、JTAG引脚被复用导致烧录失败这些坑全网都有大量讨论你能找到几十种排查思路。对新手来说资料密度就是最大的安全感。1.3 和其他开发板怎么选很多人买板子之前纠结F103、F407、ESP32、Arduino到底买哪个我直接说我的看法。板子主频生态资料上手门槛适合目标STM32F10372MHz海量中等打基础、学底层、做毕设STM32F407168MHz多较难需要算力/摄像头/DSPESP32240MHz双核多低WiFi蓝牙物联网快速落地Arduino16MHz极多极低体验编程、极速原型我的建议是如果你目标明确要做物联网产品直接ESP32没毛病如果你想认真理解嵌入式、以后吃这碗饭F103起步是最稳的。而且F103开发板便宜50到80块钱就能买到带ST-Link的完整核心板烧坏了也不心疼。2. 从开箱到点亮第一颗LED环境搭建与时钟系统很多新手第一步就卡住了卡住的点不是编程是环境。开发板到手第一件事不是写代码而是把工具链整明白。2.1 开箱先做三件事板子到手别急着上电先做三件事。第一认清板载资源。看板子上有哪些东西ST-Link调试器、电源指示灯通常是红色PWR、一个用户LED大多在PC13蓝色或红色、两个按键复位键和用户键、USB转串口芯片如CH340、BOOT0和BOOT1跳线或按键。把这些在板子上挨个找出来对照原理图看一遍。第二确认供电来源。F103核心板一般有两种供电方式通过ST-Link的USB口供电或者通过板子上的5V/3.3V引脚外部供电。新手阶段用USB供电即可但要注意如果你的板子是那种纯核心板没有板载ST-Link需要外接ST-Link调试器那就要确认调试器是否给目标板供电不然烧录时会报“No target connected”。第三安装驱动。如果是CH340 USB转串口芯片Windows第一次插上会提示安装驱动如果识别不了去WCH官网下最新的CH340驱动装完以后在设备管理器里能看到COM口。2.2 Keil MDK与芯片包把编译器伺候好写STM32最常用的IDE是Keil MDK-ARM。安装过程不展开细说核心几步装Keil我建议装5.x版本兼容性最好、在Pack Installer里在线安装STM32F1系列的Device Family Pack、新建工程时选择对应芯片型号STM32F103C8T6或RCT6。这里有个容易被忽略的坑只装Keil不装芯片支持包新建工程时器件列表是空的什么都选不了。很多人卡在这一步半天以为Keil装坏了。Pack安装完成后还要确认魔术棒Options for Target里的Debug页面选的是ST-Link Debugger而不是默认的ULINKSettings里确认SWD模式、接口速率然后点“Settings”能看到芯片ID才说明调试器连接正常。再说说代码编辑器很多教程默认用Keil自带的编辑器代码补全能力和VS Code比确实有差距但新手阶段用Keil没问题少折腾一项是一样。想用VS Code写STM32的话需要搭EIDE插件或者PlatformIO这个后面学习路线里再说现阶段先别把自己绕进去。2.3 新建工程的三条路标准库、HAL库还是寄存器新建工程你有三条路标准外设库Standard Peripheral Library、HAL库Hardware Abstraction LayerSTM32CubeMX、纯寄存器操作。我的建议是这样分的如果你想把底层搞明白用标准库代码里能看到GPIO_InitStructure、RCC_APB2PeriphClockCmd这种直白的结构体配置每个函数后面都能追到寄存器层面如果你想要快速做产品原型、或者以后打算跨芯片复用代码就上HAL库CubeMX图形化配置时钟和引脚代码自动生成。但记住一个核心原则不管用哪个库芯片参考手册RM0008针对F103必须放在手边。库只是把你和寄存器之间的操作包装了一下最终写的都是那些外设寄存器。你学会了标准库配置GPIO的流程再看HAL库代码就会觉得它们只是“换了一层皮”底层逻辑完全一样。标准库新建工程的完整配置步骤老手都觉得烦要添加stm32f10x_conf.h、stm32f10x.h、启动文件startup_stm32f10x_md.s中等容量C8T6选md、core_cm3.h还要在外设库目录里把需要的gpio、rcc等源文件加进来C/C选项卡里定义USE_STDPERIPH_DEVICE和STM32F10X_MD勾选MicroLIB以支持后面的printf重定向。这几步少一个编译就报错。零报错配置文件我强烈建议直接抄现成模板。网上找到“STM32F103标准库空白工程模板”下载下来先跑通编译再自己照着搭一个比对着文档敲效率高太多。2.4 时钟系统点亮LED前你必须先懂RCC点灯代码本身只有几行但里面的门道很深。先看代码#include stm32f10x.h #include stm32f10x_gpio.h #include stm32f10x_rcc.h void Delay(void) { for (uint32_t i 0; i 500000; i); } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; // 打开GPIOC外设的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置PC13为推挽输出最高翻转速度50MHz 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_ResetBits(GPIOC, GPIO_Pin_13); // 拉低引脚LED点亮 Delay(); GPIO_SetBits(GPIOC, GPIO_Pin_13); // 拉高引脚LED熄灭 Delay(); } }注意里面有一行很多人不理解但极其重要的代码RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);为什么点灯之前要“打开时钟”因为STM32为了省电默认情况下几乎所有外设的时钟都是关闭的。你往GPIO配置寄存器里写数据如果对应的外设时钟门控还是关着的写进去的数据根本不会起作用。这个“时钟门控”机制分布在AHB、APB1、APB2三根总线桥后面每根总线都有对应的RCC外设时钟使能寄存器。打个比方时钟就像是整个芯片内部各单位共用的节拍器。你要让GPIOC这个单元开始工作必须先打开它的节拍器——这就是RCC_APB2PeriphClockCmd做的事情。GPIO在APB2总线上所以用APB2Periph的时钟命令。ST官方系统启动后默认使用内部8MHz RC振荡器HSI所以哪怕你不配置外部晶振芯片也能跑只是主频是8MHz而不是72MHz。真正的72MHz要通过外部8MHz晶振HSE经过PLL锁相环9倍频得到8MHz × 9 72MHz。这条链路HSE8MHz→ PLLMUL×9→ PLLCLK72MHz→ AHB预分频÷1→ APB1预分频÷2得到36MHz→ APB2预分频÷1得到72MHz。APB1上挂着USART2/3、SPI2/3、I2C1/2、定时器TIM2-7、看门狗这些外设最高36MHzAPB2上挂着GPIOA-E、USART1、SPI1、ADC、TIM1和TIM8最高72MHz。这个分频关系在编写串口波特率、定时器周期时非常关键后面你会无数次用到。系统时钟初始化这一套标准库默认在SystemInit()函数里帮你做了它会自动检测HSE并配置PLL到72MHz但作为学习者必须把这条链路背下来。因为当你改用外部不同频率的晶振或者以后用HAL库时你会发现自己需要手动改PLL配置不懂时钟树的人就是一顿乱试。2.5 点灯代码与“为什么灯不亮”的排查思路写完了代码、编译通过、点击下载结果灯不亮。怎么办我见过太多新手卡在这里然后开始怀疑人生。排查思路应该是线性的别跳步骤看电源指示灯亮不亮。不亮说明没供电检查USB线是不是数据线很多手机充电线不能传数据检查ST-Link是否供电。看编译下载提示是否提示成功。如果是“Error: Flash Download failed - Cortex-M3”说明芯片连接有问题或Flash锁定先“Settings”里降速到1MHz再试或者检查BOOT0跳线。程序下载成功但灯不亮先Debug看程序是否在main()里跑。如果停不下来/一直在SystemInit里循环多半是启动文件配置不对选错了md/ld/hd容量型号。检查GPIO配置。板载LED是PC13还是PA1、PA2每个板子不一样查原理图。我前几年买某家的板子LED在PB12照着网上通用的PA8例程抄灯当然不亮。检查LED点亮电平。如果LED接在3.3V和引脚之间灌电流方式引脚拉低才亮如果接在引脚和GND之间拉电流方式引脚拉高才亮。代码里的GPIO_SetBits和GPIO_ResetBits要对调才行。这也是很多人明明程序“没问题”灯却反着亮的原因。上面这五步走完基本能解决99%的点灯问题。剩下的1%是硬件问题比如板子出厂时LED虚焊——那我就只能说恭喜你可以开始学焊接了。3. 会点灯只是开始外设实战与那些绕不开的“疑难杂症”点灯是STM32世界的“Hello World”但它只是热身。真正拉开新手和老手差距的是对中断、定时器、串口、I2C/SPI这些外设的理解深度。这里我挑几个核心外设说一说它们背后的原理和常见坑。3.1 定时器PWM呼吸灯与输入捕获测频率定时器是STM32里最常用也最好用的一类外设。F103里有TIM1-TIM8其中TIM1和TIM8是高级定时器TIM2/3/4是通用定时器TIM6和TIM7是基本定时器只能做定时没有输入捕获和输出比较通道。学习定时器我建议分三步走。第一步是定时的本质。定时器的核心是一个计数器在时钟脉冲驱动下递增。当计数值到达我们设置的自动重装载值ARR时计数器归零并产生更新事件/中断。定时时长计算公式为定时时间 (ARR1) × (预分频PSC1) / 定时器时钟频率。以TIM2挂在APB1上时钟36MHz为例想让定时器每1ms进一次中断设置PSC35999、ARR0这里换成36000-1和1000-1也可以多种组合都能得到1ms关键是理解预分频把36MHz分到1kHz再数1000个数就是1ms。第二步是输出PWM。PWM本质上就是定时器的输出比较功能计数器在ARR范围内循环计数输出引脚在计数值小于比较值CCR时输出一种电平大于比较值时输出另一种电平从而形成占空比可调的方波。呼吸灯就是把CCR的值从0到ARR循环变化。舵机控制也是同理50Hz频率、0.5ms到2.5ms的脉宽对应0到180度角度。第三步是输入捕获测频率。这个功能用来测量外部信号的频率非常实用。原理很简单定时器开启输入捕获通道当外部引脚检测到上升沿时把当前计数器的值锁存到捕获寄存器。两次捕获的计数器差值除以定时器时钟频率就是信号的周期再取倒数就是频率。公式为频率 定时器时钟频率 / (两次捕获值之差)。用这个方法让F103可以测几Hz到几十kHz的信号具体上限取决于定时器位宽和预分频配置超声波测距的核心也在这HC-SR04超声波模块发一个10us的TTL脉冲然后回波引脚拉高测量距离高电平持续时间就是超声波从发射到反射回来的时间距离 高电平时间 × 340m/s / 2。高电平时间的测量用的就是定时器输入捕获。这里必须提醒一句输入捕获测频率时如果信号频率很低两次捕获之间定时器会发生多次溢出更新事件你没处理溢出计数的话计算出来的周期就会严重偏小。正确的做法是在定时器更新中断里累加溢出次数计算时把溢出次数也考虑进去得到完整的周期。这个细节很多教程不会主动讲但实际测量低频信号时100%会遇到。3.2 串口printf重定向与GBK/UTF-8编码坑串口是STM32和外界沟通最廉价的方式。点灯只能告诉我们“程序在跑”而串口能把程序里的变量值、状态信息发出来相当于芯片在对你说话。串口配置流程开启USART和GPIO时钟、配置TX/RX引脚复用、设置波特率/数据位/停止位/校验位、使能USART。波特率必须是双方约定一致的值收发两端不一致的话出来全是乱码。常见的有9600、115200等115200对F103来说很轻松。串口最常用的技能是把printf重定向到USART。标准库环境下你需要做两件事勾选Keil魔术棒Target标签页里的MicroLIB然后自己实现fputc函数int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t)ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); return ch; }不勾MicroLIB的话标准C库的printf会引起堆栈配置问题导致程序一进printf就死机这是新手经常碰到的的“串口打印就卡死”问题。还有一个非常实际的坑中文乱码。代码里写printf(温度%d, temp);串口助手上显示“娓╁害”这种乱码。原因不是串口配置而是编码不匹配。Keil的源码文件默认是GB2312/GBK编码而很多现代串口助手默认用UTF-8解码或者反过来。解决办法有两个一是源码文件保存为UTF-8格式后再编译注意如果使用中文注释Keil旧版本会有中文注释乱码风险二是在串口助手切换解码方式为GBK。还有一个一劳永逸的办法串口输出的中文字符串统一先转成UTF-8再发送这就涉及到字符串编码转换网上也有GBK转UTF-8的现成C代码可以直接抄。我的建议是如果只是调试用途串口输出尽量用英文或拼音如果要做产品交互信息老老实实研究编码转换。3.3 SPI显示屏的真实一课ILI9341读ID为什么是0xA1A1ILI9341是2.4寸/2.8寸TFTLCD屏最常见的驱动芯片支持SPI和MCU并口两种接口。很多人照着某教程初始化屏幕卡在第一步读芯片ID怎么读都读出0xA1A1。这个0xA1A1太经典了新版网络热词都带它。问题出在哪我复盘一下。先说正确流程。ILI9341读ID需要发送命令0xD3而不是0x04然后连续读4个字节数据。在SPI模式下你发的每个命令字节后面要跟一个“读操作”的字节——这个字节的数据无效但时钟必须有因为SPI是同步协议所有数据传输都需要时钟。接着再读两个字节才是真实的ID一个0x93一个0x41合起来就是9341。很多新手直接调用读函数发送0xD3后就期望下一次读取返回0x93结果返回的是0xA1然后一脸茫然。这0xA1是哪来的0xA1通常是你上一条命令/数据的遗存或者是命令字节本身被回读出来了。SPI接口的屏主控发送数据时MISO线上会同时返回数据当芯片没有主动输出时MISO状态取决于模块设计很多模块MISO上会有一个0xA1的高位垃圾数据。读ID读出来“A1A1”几乎可以断定是读取时序错了把命令字节或空闲字节当成ID了。正确操作应该是发送0xD3命令前先拉低CS片选发送命令后要发送一个假字节比如0x00产生时钟同时读取到的第一个字节丢弃继续发送假字节读到0x93再发第三个假字节读到0x41。然后拉高CS结束。另一个常见原因是对复位时序不敏感。有些模块上电后需要给RESET引脚一个低脉冲至少10us然后等待120ms才能初始化。如果复位时序不对屏幕状态不确定ID也可能读不对。最后还有一个非常隐蔽的坑SPI模式选择。ILI9341模块背面的电阻配置决定了SPI模式Mode1还是Mode3——CPOL和CPHA的组合。如果主控配置的SPI极性和相位和模块不一致数据会错位读出来的ID自然是垃圾值。一般SPI模式0是CPOL0、CPHA0模式3是CPOL1、CPHA1都试一下就知道模块到底工作在哪个模式。这个“读ID是A1A1”的坑非常典型它把SPI时序、命令时序、复位时序三个知识点全考了一遍。你要是能独立排查解决这个问题SPI协议你基本就掌握了。3.4 超声波测距和步进电机一个完整的传感控制闭环学外设不能光学外设要串联成一个系统。我常建议新手做的第一个组合项目是超声波测距 OLED显示 五线四相步进电机跟随。超声波模块HC-SR04发一个10us的Trig脉冲等待Echo高电平用定时器捕获测得回波时间算出距离。把这个距离显示在OLED或LCD屏上同时让步进电机根据距离转动一定角度比如距离小于30cm就往回转一点大于50cm就往前转一点。这里会碰到一个新的驱动对象五线四相步进电机最典型的是28BYJ-48配合ULN2003驱动板使用。这种步进电机是四相八拍驱动的绕组通电顺序决定转动方向和步距角。核心代码逻辑是定义一个换相表const uint8_t STEP_CODE[8] {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};对应A-AB-B-BC-C-CD-D-DA八拍循环切换这八个状态电机就持续转起来。每切换一拍电机转过一个最小步距角28BYJ-48的步距角是5.625°/64也就是说内部经过64倍减速后输出轴转动一圈需要2048个脉冲。新手容易在这里栽跟头直接用GPIO翻转来模拟脉冲发现电机转一阵就发烫、还丢步。原因是28BYJ-48的额定转速很低减速后每分钟15转左右换相太快会丢步甚至堵转。给每次换相之间加个延时比如1ms速度就差不多了。想调速就调延时想控制转角就计数脉冲数。这个项目的价值在于超声波测距锻炼定时器捕获、OLED驱动锻炼SPI/I2C、步进电机锻炼GPIO输出和时序控制三个外设串在一起就是一个完整的“感知-决策-执行”闭环以后做小车、做机械臂都是这套逻辑。4. 我踩过的几个真坑排查链路完整复盘连着讲三个经典死机/连接问题把完整排查链路写出来。这些问题我基本都亲自踩过写出来的都是血泪。4.1 延时函数delay卡死SysTick与编译优化现象程序烧录成功灯亮了但一进延时函数就死机或者整个程序卡在那里不走了。这个问题的本质可能有好几层必须一层层剥。第一层延时函数本身写错了。很多人第一次自己写延时用的是for (i 0; i 500000; i);但i定义成了uint8_t最大值255循环条件永远不成立延时变成死循环。这不是卡死这是循环根本出不来。排查方法是看调试器里i变量的值或者直接把i定义成uint32_t。第二层SysTick中断被错误配置了。标准库的Delay()延时实现如果用了SysTick中断方式而你在配置优先级时把SysTick的抢占优先级设得太高/太低或者没有启动SysTick中断延时自然不可用。更常见的是在新版HAL库里调用HAL_Delay()之前必须先调用HAL_Init()完成滴答定时器SysTick配置否则HAL_Delay进到while (uwTick uwTickTarget)循环里永远出不来。第三层编译器优化导致延时循环被“优化掉”。Keil在-O0和-O2下产生的代码差别很大优化级别高时一个没有副作用的空循环会被编译器直接省略掉于是“延时”没了程序运行飞快、执行逻辑混乱。解决方法是把循环变量声明为volatile告诉编译器这个变量不能优化或者干脆用SysTick做延时不开空循环。第四层就是时钟配置不对提到72MHz果然后SysTick的时钟源或者重装载值算错延时时长和预期完全不一致现象表现为“延时不准”严重时会让外设逻辑崩掉比如I2C时序错乱。排查链路的正确顺序应该是先判断是“卡住”还是“没执行”——用调试器打断点、看PC指针位置再检查延时实现方式——空循环还是SysTick最后检查编译优化。绝大多数卡死都是这个链路走出来的。4.2 禁用JTAG后板子“变砖”SWD保命法现象程序里使用了PB3、PB4、PA15这些引脚做普通GPIO代码里调用了GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);禁用JTAG来释放这几个引脚。程序烧录运行后突然发现自己用ST-Link连不上芯片了。这个坑非常经典。F103的PA13、PA14是SWDPA15、PB3、PB4是JTAG。你禁用了JTAG确实释放了PB3/PB4/PA15但如果不小心同时也影响了SWD引脚配置ST-Link就无法通信了——板子看起来就像变砖了。但别慌这板子几乎不可能真砖。三种恢复办法如果只是禁用了JTAGSWDPA13/PA14还没被禁用那就直接用SWD模式烧录——ST-Link默认就是SWD模式通常没问题。如果SWD也一起被关了按住板子上的复位键在Keil里点击Download然后快速松开复位键让芯片在复位期间被连接。趁芯片还没来得及跑飞之前的几毫秒擦除Flash。这招实测有效但手速要快。终极办法STM32的BOOT0拉高后上电芯片从系统存储器启动程序不执行Flash里的代码。此时ST-Link可以正常连接把Flash擦掉然后把BOOT0跳线跳回低电平芯片就活了。如果还是连不上大概率你的ST-Link排线接触不良检查SWDIO、SWCLK、GND三根线的连接——顺带一提SWDIO和SWCLK在空板子上测量应该能测到约1.8V的上拉电平没有这个电平就说明调试器没连好。4.3 CAN通信突然连不上终端电阻与波特率之谜现象两块F103开发板用CAN收发器如TJA1050对接上午还能正常通信下午突然连不上了。程序没改过接线也没动过。新手遇到这个第一反应是代码bug但其实硬件层面的嫌疑最大。CAN总线是差分信号要求总线两端都必须接120欧姆终端电阻用于匹配阻抗、消除反射。很多新手两块板子都没接终端电阻或者只接一端短距离低速通信比如波特率125kbps线长几十厘米可能没问题一旦线长超过几米或者波特率提高反射信号会直接干掉整个通信。排查顺序先量CAN_H和CAN_L之间的静态电压正常应该约2.5V隐性显性时CAN_H比CAN_L高至少2V。如果电压异常或为0说明收发器供电问题或总线短路。检查终端电阻万用表量CAN_H-CAN_L之间没接电阻时阻值很高接了正确终端电阻时应该在60欧姆左右两块板各120欧姆并联。波特率匹配F103的CAN外设时钟是APB136MHz波特率通过“预分频时间段”配置。如果两端用相同的波特率配置代码但一个板子晶振有偏差标称8MHz实际8.1MHz两个节点的阶段采样点就会错位高波特率下必现偶发断连。处理方式是降低波特率或者用CAN分析仪抓波形核对位时间。最后再看代码异常处理里有没有处理CAN_ESR寄存器的Bus-Off位总线关闭后CAN控制器会退出总线不再参与通信需要在错误中断里做恢复。CAN通信这类工业总线问题的排查核心原则就是先物理层、再数据链路层、最后才应用层。别一上来就怀疑代码。4.4 五个会让新手当场崩溃的“祖传问题”最后再列五个我见过的高频崩溃现场给个速查表现象大概率原因解决办法下载报错No Target ConnectedSWD线接反/接触不良、目标板没供电检查三根线降下载速率按住复位键下载Flash Download failedFlash读保护、芯片锁定BOOT0拉高上电后全片擦除程序能跑但外设没反应外设时钟没开、引脚复用不对检查RCC使能检查AFIO重映射液晶屏幕花屏电源不稳、SPI速率太高、复位时序不对单独供电降低SPI分频到18MHz以下复位后延时120ms引脚输出电平异常引脚被JTAG/SWD占用、复用冲突禁用JTAG检查PA13/PA14不能当普通IO“芯片第一脚怎么确认”这个热搜词也经常和这些混淆在一起。芯片LQFP封装一般在第一脚附近会有圆点/斜切角标记图中左上角有丝印白点或者芯片一角被切掉那一脚就是第一脚。PCB原理图上通常也有标注不确认前千万别硬怼电源正负极——STM32F103耐压5V但很多核心板上的3.3V引脚怼5V进去会直接冒烟烧一片。5. 买开发板之后的三个月一份可照抄的学习路线最后来说说从买到入门这三个月怎么安排。很多人觉得自己“学不会STM32”其实不是因为笨是因为不知道学完GPIO之后该学什么没有路线图东一榔头西一棒子最后放弃。5.1 第一周别急着写代码先建立“引脚感”这一周的目标不是写多少代码而是把板子“摸熟”。看原理图搞清楚每个引脚的功能跑通点灯、跑通按键控制LED找一本讲STM32的书或者一份完整教程把GPIO的四种输入模式浮空、上拉、下拉、模拟和两种输出模式推挽、开漏弄明白。开漏输出为什么需要外接上拉电阻推挽输出为什么能直接驱动LED这些概念一周时间建立起来后面的路会顺很多。5.2 第2-4周六大外设逐个过按这个顺序来外部中断EXTI、定时器TIM定时中断、PWM输出、输入捕获、USART串口收发、printf重定向、ADC读电位器电压、DMA串口收发不占CPU、I2C和SPI驱动OLED/Flash/传感器。每个外设都要经历“看例程→抄例程→改例程→自己从空白工程写一遍”的过程。抄一遍永远只是会“跑代码”自己写一遍才是会“配外设”。外设这关过了STM32的80%就学了。5.3 第5-8周第一个小型项目别再做“流水灯”了做一个有实际意义的小东西。我的推荐清单超声波测距OLED显示屏做成一个便携测距仪DHT11温湿度传感器OLED串口打印做一个环境监测器步进电机红外遥控做一个自动窗帘模型红外遥控需要学习NEC协议解码也是个好东西如果对物联网感兴趣ESP8266/ESP01通过串口AT指令连接巴法云这类免费MQTT云平台把传感器数据传到云端再用手机看——这一套做完你就打通了“设备端-云端-应用端”的完整链路。做项目的时候我强烈建议用一个“需求拆解”的方法把最终功能拆成多个模块每个模块单独调通再拼接。比如测距仪拆成“超声波测距模块→OLED显示模块→主逻辑模块”每个模块先在main函数里单独测试最后合并。千万不要一次性写完一坨600行代码然后指望它一次跑通——那是在折磨自己。5.4 第9-12周往“产品级”靠拢学到这里你对F103已经比较熟了。这时候可以有两条进阶路。一条是底层方向开始看寄存器手册把之前用库函数配置过的寄存器手动写一遍比如直接操作GPIOx-CRL和CRH寄存器配置引脚模式理解库函数的本质其实就是给这些寄存器赋值。然后研究启动文件startup_stm32f10x_md.s理解上电后是怎么进入main函数的中断向量表到底是什么。另一条是系统方向引入FreeRTOS操作系统把前面的点灯、串口、按键放到不同的任务里学习任务调度、信号量、消息队列。用F103跑FreeRTOS绰绰有余以后做复杂项目也不至于面对裸机状态的很多问题束手无策这是从“玩单片机”到“做嵌入式系统”的关键一步。同时工具链也可以趁这段时间升级一下尝试用VS Code加EIDE/PlatformIO搭建STM32开发环境git做版本管理。新手阶段用Keil没问题但以后工作大概率不用Keil早熟悉现代工具链没有坏处。开发板并不是只能配Keil用PlatformIO管理F103工程也很方便。最后的几句大实话板子买回来那天热血上头的样子我记得很清楚。我那块F103核心板到现在还在抽屉里偶尔拿来验证个新点子依然顺手。以我带新人的经验学STM32这件事最大的坎从来不是技术难度而是“卡住了没人告诉你怎么走”。这篇里写的每一个坑——从点灯不亮、串口乱码、ILI9341读ID、延时卡死、JTAG禁用变砖到CAN掉线——你大概率在接下来三个月里至少碰到两三个。真遇到了回来对着排查链路一步步走大多能走出来。我的建议是别贪多一个外设一个外设过一个项目一个项目做。F103这块板子能教给你的东西比你想的多得多。动起来今天就把环境搭好先让LED闪起来再说。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表