资讯动态

STM32F103C8T6核心板解读:从原理图到PCB布局实战

发布时间:2026/9/16 14:18:38 来源:尧图企业网站定制
简介这套资料围绕STM32F103C8T6核心板将硬件设计文档与软件例程打包在一起面向正在学习ARM嵌入式开发的学生、工程师及自学者。PDF原理图详细标注了元器件型号与连接关系ALTIUM设计的PCB文件则展示了布局布线、电源与地线分布以及EMI处理思路测试代码与38个参考例程覆盖了从GPIO控制、定时器、串口、ADC到I2C/SPI等常用外设的典型用法可引导读者从零搭建开发环境并逐步掌握HAL库编程。压缩包共2000个文件以C源码、头文件、汇编文件为主同时含有uvproj/uvopt工程文件、pcbdoc/PDF设计文档及少量图片资源整体约85.35MB文件类型丰富但目录结构清晰便于针对某一模块快速定位。已有1750人学习下载这份资料兼顾原理图阅读、PCB设计与固件编写能帮助读者建立从电路到代码的完整认知适合作为STM32入门与实战的综合性参考。1. STM32F103C8T6核心板资料包先读懂再动手一份STM32F103C8T6核心板的资料包通常把原理图PDF、Altium工程、测试代码和几十个参考例程塞在同一个zip里。大多数人打开后的第一反应是解压、点开PDF、看一眼电源和晶振就关掉然后去翻例程——这其实是把顺序走反了。核心板的器件很少一颗MCU、一颗LDO、一颗晶振、几个电容电阻但每个器件的位置、取值、连接方式都决定了一块板子能不能稳定跑起来也决定了你后续自己改板子时要动哪些地方。这篇文章按一个工程师拿到这套资料后真正会做的事来推进先读PDF原理图理解最小系统的设计逻辑再进Altium工程检查PCB布局与DRC然后烧测试代码验证硬件最后把38例整理成自己的外设模板。适合第一次画F103核心板、或者想从现成例程快速迁到自己项目的人。2. 从PDF原理图读出STM32F103C8T6最小系统的设计意图拿到PDF先别急着看引脚按电源、时钟、复位、下载接口四个模块依次读。STM32F103C8T6是LQFP48封装工作电压2.0到3.6V绝大多数核心板直接做成3.3V单电源。PDF的价值不在于告诉你每个网络叫什么而在于告诉你每一路电源、每一个引脚为什么这样接。下面把最小系统拆开讲每一节对应原理图上的一个功能块。2.1 电源路径LDO、去耦电容与VDDA的处理板子从USB或者排针取5V经过一颗LDO降到3.3V。常见的LDO是AMS1117-3.3或者ME6211这类低压差器件AMS1117压差约1V输入5V输出3.3V没问题ME6211压差更小适合纽扣电池供电的场景。原理图上LDO的输入侧一般会放一个10μF钽电容或者电解电容加一个100nF陶瓷电容输出侧同样是一大一小。小电容滤高频噪声大电容扛负载瞬态变化这个组合不要省。STM32F103C8T6的VDD引脚有多个原理图上通常是3路加上VDDA和VSSA。特别注意的是LQFP48封装里没有单独的VREF和VREF-引脚ADC的参考电压直接复用VDDA和VSSA。所以VDDA这一路要单独加一个1μF电容并串一个磁珠或小电阻与数字VDD隔开。很多资料包里的测试例程会带ADC采样如果板子上的VDDA和VDD只用一个电容采出来的值跳动会明显偏大。读PDF时重点看VDDA的滤波网络是独立的还是直接并在一起的这决定了你的ADC精度上限。2.2 时钟电路8MHz晶振的负载电容怎么配原理图上STM32F103C8T6的OSC_IN和OSC_OUT之间接一颗8MHz无源晶振两只脚各接一个电容到地。电容的取值不是随便选的它要和晶振的负载电容匹配。晶振规格书上会标CL比如18pF或者20pF板上的两个外接电容C1、C2对地串联后与引脚寄生电容Cstray一起决定实际振荡负载。估算公式如下# 晶振负载电容匹配估算 c1 20e-12 # 晶振一脚对地电容单位F c2 20e-12 # 晶振另一脚对地电容 cstray 5e-12 # 引脚与走线寄生电容经验值3~6pF cl (c1 * c2) / (c1 c2) cstray print(f实际等效负载电容: {cl * 1e12:.2f} pF)取C1C220pF、寄生电容5pF算出来等效负载约15pF适合CL标称15到16pF的晶振如果晶振CL是20pF通常取C1C222pF并留出调整余地。PCB上这两个电容要尽量靠近MCU的OSC引脚走线短且对称晶振下方不要走其他信号线。读PDF时对比一下晶振的CL参数和两个电容值是否匹配很多便宜的模块为了通用性会直接焊22pF凑合能起振但频率精度和起振余量都不理想。2.3 BOOT模式、复位与启动顺序STM32F103的启动方式由BOOT0和BOOT1两个引脚的电平决定原理图上BOOT0一般通过一个10kΩ电阻下拉到地BOOT1有的是下拉、有的是悬空。BOOT0是复用引脚部分板子会把BOOT0同时引到排针上方便切换启动模式读PDF时看BOOT0到MCU引脚之间的电阻是直接下拉还是可跳线切换。BOOT0BOOT1启动位置常见用途0任意用户Flash正常运行绝大多数时候用这个10系统存储器进入内部BootLoader可用串口ISP下载11SRAM调试内存中的程序恢复异常Flash时用复位电路在F103上不需要专用复位芯片NRST引脚内部已有上拉电阻外部只需要一个100nF电容到地做抗干扰部分板子会再加一个按键。如果PDF里出现的是按键一端接NRST、一端接GND、电容并联这是标准做法为了省料把电容省掉也能复位但在电磁环境差的场合容易误复位。注意BOOT0在运行期间必须保持低电平否则复位后会进入系统存储器而不是你的程序。2.4 引脚功能分配SWD、LED与串口最小系统板最常用的引脚就那几个PA13和PA14是SWDIO和SWCLK板子上的4针调试座或者2.54mm排针大多引这两个PA9和PA10是USART1的TX和RX连接板载CH340或者直接引出。LED的接法有两种一端接3.3V、另一端通过限流电阻接IO低电平点亮或者一端接IO、另一端接GND高电平点亮。PDF上通过LED的负极朝向就能判定逻辑。引脚功能核心板常见连接PA9 / PA10USART1_TX / USART1_RX排针或CH340串口PA13 / PA14SWDIO / SWCLK4针SWD调试座PC13普通GPIOLED注意翻转频率上限2MHzPA11 / PA12USB DM / DP可复用为GPIO部分板子集成USB座PA0 / PA1ADC / 定时器输入排针引出测试例程常用有一个容易踩的坑是PC13、PC14、PC15这几个引脚在F103上翻转频率比其他IO低最高约2MHz。如果你的38例里有一个LED放在PC13上点灯看不出问题但要是把它当PWM输出或高速IO用就会丢波形。读原理图时顺手把所有引脚功能标一遍和后面测试代码里的GPIO初始化对照能发现不少资料包本身自带的小错误。3. 在Altium Designer里打开核心板PCB工程检查并复用Altium工程和PDF的区别是PDF让你看结果工程让你看过程。用AD20及以上版本打开资料包里的.PrjPcb你看到的叠层、走线、过孔、丝印才是这个板子真正的设计轨迹。这一章按打开工程、同步检查、布局分析、DRC验证四步来走。3.1 工程文件结构与打开顺序解压后先找后缀为.PrjPcb的工程文件双击打开工程树里通常包含原理图.SchDoc、PCB.PcbDoc、原理图库.SchLib和封装库.PcbLib。不要单独打开.PcbDoc那样会丢失原理图和PCB的关联关系后面做交叉选择和同步时用不了。打开工程后先执行一次Project → Compile PCB Project看Messages面板有没有编译错误。网集资料里最常见的状况是原理图库或封装库路径失效打开PCB后器件封装变成空白的或者报“Footprint not found”。这多半是压缩包在传输时丢了库文件或者原作者用相对路径引用但目录结构被打乱了。处理办法是直接从PCB提取封装库在PCB编辑器中全选器件Design → Make PCB LibraryAD会把当前所有器件的封装生成一个本地.PcbLib再通过Tools → Footprint Manager批量绑定到原理图器件上。这个办法能解决九成以上的库缺失问题。3.2 从原理图到PCB检查网络一致性编译通过后在原理图里按快捷键TC进行交叉选择PCB上对应的器件会高亮。逐模块核对电源、HSE晶振、BOOT电阻、复位电容、SWD接口、LED每个器件的位置是否和PDF一致网络标号有没有被改过。有些资料包存在原理图和PCB不同步的情况比如原理图更新过但PCB没重新导入这种不一致要尽早发现。同时对比电源网络命名有的板子把3.3V网络叫VCC有的叫3V3无所谓对错但要确认PCB上的铺铜网络和原理图一致。执行Design → Import Changes从原理图同步到PCB如果出现大量Remove和Add操作说明两份文件已经脱节这种情况下不建议在旧PCB上继续改用同步后的新PCB重新走线更干净。3.3 STM32F103C8T6核心板PCB布局布线的关键细节F103核心板通常做两层板因为C8T6的引脚间距0.5mm两层完全走得通不需要上四层。布局顺序是先在板框居中放MCU再放HSE晶振和匹配电容然后是去耦电容最后是电源和接口。MCU的VDD引脚周围各放一个100nF电容到VDD的距离尽量控制在3mm以内过孔不要打在电容和引脚之间。晶振布局是最容易看出设计水平的模块。晶振本体要贴着OSC_IN和OSC_OUT放置两个匹配电容分别靠近晶振对应脚晶振正下方和正下方一层不要走任何信号线晶振周围一圈用地过孔围起来。这就是热词里经常提到的guard ring在Altium里沿晶振外围画一圈闭合的地线宽度0.3到0.5mm每隔一小段打一个接地过孔让晶振区域形成一个电学上的屏蔽环。环路离晶振焊盘至少0.5mm太近会增加杂散电容反而影响起振。核心板的排针走线按功能分区左侧放电源和SWD右侧放USART1和GPIO。电源线加宽到0.3mm以上USB的DM/DP两对差分线要并行走长度差控制在2mm以内。LQFP48这类标准封装在AD的库里有现成的不需要手工造异形封装如果板子边缘有邮票孔用Keepout层画轮廓再铺铜切割实现。走线宽度1oz铜厚参考载流能力推荐用途0.15mm6mil约0.3A信号线0.3mm12mil约0.8A电源线、LED分支0.5mm20mil约1.2A核心板主电源入口1.0mm40mil约2.2A5V输入、地线主干以上电流是温升约10℃的参考估算值具体和铜厚、散热条件有关。核心板的电流需求很小整板功耗通常不到100mA但地线不要走细地网络尽量用铺铜而不是走线连接。3.4 DRC规则设置与板厂工艺边界打开Design → Rules按普通双层板工艺设定规则Clearance设0.25mm10mil线宽最小0.15mm过孔外径0.6mm、内径0.3mm丝印到焊盘间距不小于0.2mm。F103核心板没有高速信号布线间距不用收紧到5mil以下反而放宽规则能减少DRC误报方便你分出真正的错误和警告。规则项建议值说明Minimum Clearance0.25mm铜箔间距板厂默认都能做Minimum Width0.15mm信号线底线低于此值不建议Preferred Width0.25mm普通信号线默认宽度Minimum Hole Size0.3mm机械钻孔下限再小要加钱Silk to Solder0.2mm丝印不进焊盘避免露铜不良设置完后运行Tools → Design Rule Check重点看Un-Routed Net和Width Violation。很多网集工程打开后DRC都是一堆红常见原因是规则里的最小线宽大于实际走线宽度直接改规则而不是去推倒重画。DRC清零后可以顺手做一次Polygon Pour重新铺铜注意在晶振周围用Polygon Cutout挖空铜皮防止铺铜把晶振信号和地之间的间距吃掉。挖空操作在AD20里对应Place → Polygon Cutout画一个覆盖晶振区域的闭合多边形。4. 测试代码与STM32F103C8T6参考例程38例编译、烧录与验证资料包里的测试代码是用来验证核心板硬件是否正常的38例参考例程则是外设驱动代码的素材库。这两部分的工程格式往往不统一有MDK的.uvprojx、IAR的.ewp有的用标准外设库有的用HAL库先分清工程类型再决定怎么打开。4.1 先分清例程的工程格式和库版本打开例程文件夹看后缀.uvprojx或.uvproj用Keil MDK开.ewp或.eww用IAR开带Makefile或CMakeLists.txt的是GCC工具链工程。38例这种网集包通常以MDK工程为主因为F103在国内的生态基本是Keil。看代码引用的头文件也能判断库版本包含stm32f10x.h开头的初始化方式是标准外设库包含stm32f1xx_hal.h的是HAL库。标准库的函数名更直观但已经不更新了HAL库现在的例程和网上资料更全新人建议从HAL库入手。例程类型工程后缀涉及外设F103C8T6上建议验证GPIO点灯.uvprojxGPIOPC13、PB0等先验证最小系统USART通信.uvprojxUSART1回环测试验证PA9/PA10定时器PWM.uvprojxTIM2/TIM3示波器看频率与占空比ADC采样.uvprojxADC1测VDDA的分压值SPI/I2C.uvprojxSPI1/I2C1接外部传感器验证38例里如果遇到工程编译报错先看头文件包含路径Project → Options for Target → C/C → Include PathsF103例程多数需要添加标准外设库的Libraries路径。网集资料最麻烦的是库版本混用工程的代码是标准库但Linker里勾了HAL库的启动文件这种错法只需要统一启动文件即可解决。4.2 ST-Link四线烧录与调试配置测试代码的烧录方式几乎都是ST-Link通过SWD接口连接。接线只有四根SWDIO对PA13、SWCLK对PA14、GND对GND、3V3对板上的3.3V注意SWD的3V3是ST-Link给板子供电还是板子单独供电两者选一个就行不要同时供。Keil里打开Options for Target → Debug选择ST-Link Debugger进入Settings确认能识别到Cortex-M3。烧录算法选STM32F10x Med-density 64KC8T6的Flash是64KB不是高密度256KB选错算法会导致下载后程序跑飞。烧录后如果点灯不亮不要急着怀疑MCU先用万用表量板子的3.3V和GND是否正常、BOOT0是不是低电平、NRST引脚是不是3.3V左右这三处没问题再查代码。测试代码本身按“能验证核心板硬件”的标准来运行先点灯再跑串口回环最后跑一个定时器中断这三个通过说明最小系统、调试口、时钟和外设总线全部正常。4.3 从原理图反推GPIO配置点亮LED假设PDF上LED的负极接IO、正极通过330Ω电阻接3.3V那么IO输出低电平时LED点亮此时IO工作方式是推挽输出。初始化代码的标准库写法如下#include stm32f10x.h void LED_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 打开GPIOC时钟注意F103的GPIO挂在APB2总线上 */ 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_2MHz; /* LED用2MHz足够避开PC13的频率上限 */ GPIO_Init(GPIOC, GPIO_InitStructure); /* 默认熄灭 */ GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); } int main(void) { LED_GPIO_Config(); while (1) { GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); /* 低电平点亮 */ for (volatile int i 0; i 200000; i); /* 简易延时工程上换SysTick */ GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); /* 高电平熄灭 */ for (volatile int i 0; i 200000; i); } }GPIO_Mode_Out_PP是推挽输出能主动输出高和低GPIO_Mode_Out_OD是开漏输出需要外部上拉才能输出高电平。LED接法不同选型就不同低电平点亮但配了开漏输出LED永远不亮。如果你在例程里看到用的是GPIO_Mode_Out_PP还是OD结合原理图上的LED接线方式就能判断这个例程当初是为哪块板子写的。关键点GPIO_Speed在F103上可以选2MHz、10MHz、50MHz。LED选2MHz就好选50MHz会在引脚上产生更多边沿噪声。关键点PC13、PC14、PC15的IO翻转频率上限是2MHz所以哪怕你选GPIO_Speed_50MHz实际也没法用这个引脚做高频PWM。4.4 串口回环验证USART1引脚与时钟F103的USART1挂载在APB2总线上时钟频率72MHz波特率115200的误差极小。PA9是TX、PA10是RX标准库的初始化逻辑是先把PA9配置为复用推挽输出、PA10配置为浮空输入再设置USART1的波特率、帧格式、收发模式最后使能USART1#include stm32f10x.h #include stdio.h void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* USART1和GPIOA都在APB2上一次打开 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); /* PA9: TX 复用推挽输出 */ 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); /* PA10: RX 浮空输入 */ GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStructure); /* 115200, 8位数据, 1停止位, 无校验, 无流控 */ USART_InitStructure.USART_BaudRate 115200; 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); } int fputc(int ch, FILE *f) { /* 等待发送数据寄存器为空再写数据 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); USART_SendData(USART1, (uint8_t)ch); return ch; } int main(void) { USART1_Config(); printf(STM32F103C8T6 USART1 OK, 115200, 8N1.\r\n); while (1); }重写fputc让printf通过USART1输出是标准库例程最常见的串口调试写法前提是勾选Keil的Use MicroLIB否则printf会占用大量资源。串口收不到数据时先确认板子供电、USB转串口模块的TXD和RXD有没有交叉接PA9的TX要接外部模块的RXPA10的RX要接外部模块的TX两个板子都接TX就对不上。串口只收到一次数据后不再响应多半是接收中断里没清ORE标志或者USART_IT_RXNE中断服务里没再次使能接收。HAL库工程里如果只收一次检查是否漏了__HAL_UART_CLEAR_OREFLAG。这个问题在网集例程里出现频率极高噪声环境下USART1的ORE标志被置位后如果不主动清除后续接收中断就再也不触发了。5. 把资料包变成自己的工程模板用CubeMX重建F103C8T6工程测试代码验证完硬件之后38例的定位就变了它是外设驱动的参考而不是项目的基础。更好的做法是抛开网集例程的旧工程用STM32CubeMX生成一份干净的HAL工程把原理图上每一个引脚对应到一个可管理的宏定义让核心板资料包变成你自己项目的起点。5.1 CubeMX工程配置参数在CubeMX选型界面搜STM32F103C8Tx选LQFP48封装。RCC配置里Crystal/Ceramic Resonator选Enable对应板载8MHz晶振SYS配置里Debug选Serial Wire否则JTAG口默认占用的PA13、PA14在初始化后会被释放焊好的调试座直接失效。时钟树里HSE设置8MHzPLL Source选HSE、倍频系数x9SYSCLK 72MHzAPB1 Prescaler除2得到36MHzAPB2除1保持72MHz。USART1挂APB2波特率115200LED引脚按原理图实际网络名配置为GPIO_Output速率Low。生成工程后在main.c里添加测试代码uint8_t msg[] F103C8T6 HAL OK\r\n; while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); /* PC13翻转 */ HAL_UART_Transmit(huart1, msg, strlen((char*)msg), 100); /* 超时100ms */ HAL_Delay(200); }HAL_UART_Transmit的最后一个参数是超时时间单位ms单位时间内没发完会返回HAL_TIMEOUT初学容易忽略这个返回值。HAL库里没有标准库那种阻塞式发送寄存器标志位循环函数内部已经把超时机制封装好了代价是代码量比标准库多但也更不用关心底层的TXE标志。使用HAL驱动时注意启动文件对应startup_stm32f103xb.sFlash大小选64KB这两个不对会在调试时出现PrgError或者下载后无法启动。5.2 三个针对F103C8T6硬件差异的进阶检查第一件是Flash容量。C8T6的Flash是64KB而很多网集例程是按高密度芯片的128KB或256KB写的工程配置里Flash Download算法如果选了256KB编译出的代码超过64KB后就写不进去。同样的逻辑也适用于RAMC8T6只有20KB SRAM跑FreeRTOS时默认每个任务分配512字节栈会压力很大把空闲任务栈降到256字节、用户任务栈控制在256到512字节比较稳妥。第二件是PC13到PC15的引脚限制。这三个引脚在数据手册里明确标注了IO翻转速率上限2MHz和普通的PA、PB口不同。如果你的工程模板里把LED放在PC13没问题但如果它同时承担一个低速中断输入或者I2C时钟就要考虑到引脚本身的电气特性不够用。第三件是代码保密。F103没有硬件加密单元所谓加密就是把调试口锁住。在量产前用STM32CubeProgrammer把选项字节里的RDP级别设为1这时通过SWD只能读出0xFFFFFF程序无法回读。但要提醒的是RDP设了之后只能整片擦除才能恢复测试阶段不要开。5.3 用guard ring和铜皮挖空优化晶振区域的最终版图在自己改板时把晶振区域的处理当成验收标准。核心板上的所有信号里HSE振荡信号对寄生电容最敏感而Altium工程里很容易因为铺铜把OSC_IN到地的寄生电容加大导致起振变慢或停振。标准做法是先放晶振和两个匹配电容再从晶振外围画一圈闭合地线作为guard ring过孔孔径0.3mm、间距1mm均匀排列最后用Polygon Cutout把晶振正方向上的铺铜挖掉一块让铜皮和晶振本体保持至少1mm的安全距离。改完后跑一次DRC确认挖空区域内没有残留的飞线报错即可发板。本文还有配套的精品资源点击获取

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

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

免费获取报价