拓冰建站拓冰建站
首页 / 资讯中心 / 正文

STM32F103C8T6核心板从原理图到PCB再到代码调试完整指南

简介STM32F103C8T6核心板相关资料一次集齐包含PDF原理图、Altium Designer设计的PCB文件、测试代码及网集STM32参考例程38例适合刚接触STM32的嵌入式学习者也能作为硬件工程师绘制最小系统板的参考。压缩包共2000个文件以C源码、头文件、汇编、工程文件uvproj/uvopt为主同时提供原理图PDF、PCB设计源文件pcbdoc/schlib/pcblib和说明文档readme/txt压缩包约85MB结构较完整。核心板原理图清晰标注电源、时钟、GPIO、UART、SPI、I2C等接口连接PCB部分可观察走线与布局测试代码涵盖LED闪烁、串口通信、定时器中断、ADC采样等基础实验配合38例应用工程便于理解HAL/LL库及嵌入式C语言开发流程。目前已有1750人学习下载对于想从硬件底层到软件应用完整掌握这块经典芯片的开发者是值得收藏的实践资料。1. 先别急着解压这份STM32F103C8T6核心板资料该怎么用一个名叫「STM32F103C8T6核心板PDF原理图ALTIUM设计PCB图测试代码网集STM32参考例程38例.zip」的压缩包最容易做的事是解压后直接点进38例参考例程的文件夹挑一个LED例程编译下载看到板子闪灯就以为通了。我建议反过来先打开PDF原理图认一遍最小系统板上的电源、晶振、复位和BOOT电路再用Altium Designer打开PCB图核对封装和走线最后才烧测试代码。原因是STM32F103C8T6核心板的大多数“点不亮”“程序跑飞”问题都不是代码问题而是原理图上缺了去耦电容、BOOT引脚悬空或晶振负载电容选错。这条路线也适合准备用这块板子做密码锁、MQTT网关或FreeRTOS小项目的读者后面改板、画底板时能省一大半排查时间。2. 从PDF原理图开始STM32F103C8T6最小系统板的核心电路与引脚功能核对原理图是整份资料包里最不该跳过的东西。PDF版本可能是老工程师从某一版Altium工程导出的而压缩包里另有一个ALTIUM设计PCB图源工程两者不一定是同一版。我一般解压后先看目录再对照PDF和源工程的生成日期。2.1 解压后先看文件清单别让Altium工程和PDF版本打架拿到压缩包第一步不是双击打开PDF而是先用命令行看一层文件结构。以这份资料为例常见会分成PDF原理图、AltiumPCB、测试代码、例程38例四个顶层目录。用下面的命令可以列出每个子目录的名称和大小unzip -l STM32F103C8T6核心板*.zip | awk {print $4} | grep -v ^$ | cut -d/ -f1-2 | sort | uniq -c这段命令把zip内每个文件路径按前两级目录聚合统计每个目录下有多少文件。参数cut -d/ -f1-2只保留顶层和次级目录uniq -c输出计数如果某个目录文件数明显偏多通常是例程而PCB工程一般只有几个.PrjPcb、.SchDoc、.PcbDoc和.OutJob文件。看到.SchDoc而不是.SchLib说明原理图是以文档形式存放的直接用Altium Designer打开即可不需要重新创建工程。在Windows上不方便用unzip时我习惯用7-Zip打开压缩包先看AltiumPCB里有没有可编译的.PrjPcb。有.PrjPcb就能整体编译只有.PcbDoc就退一步只打开PCB图核对封装和走线。PDF原理图在这个阶段只是参考别拿PDF直接生成Altium文件后续容易连错网络标号。2.2 最小系统板原理图上的5个必查电路从STM32F103C8T6最小系统板原理图里我通常会重点核对五处电路。这块芯片是LQFP48封装工作电压2.03.6V最常用3.3V但核心板习惯上兼容5V USB供电后再经过LDO降到3.3V。下表列的是我对一份稳定设计的最低要求电路推荐参数翻车后果3.3V电源GD1117或ME6211输出侧100nF10uF电压跌落导致程序随机复位8MHz主晶振8MHz 两个20pF负载电容起振慢或不起振烧不进SWD复位电路10kΩ上拉 100nF下拉到GND上电时序不稳复位不释放BOOT0/BOOT110kΩ下拉到GND误进ISP模式代码跑不起来SWD调试口SWDIO/SWCLK直接引出串220R电阻高频下载失败线长超过20cm时尤其明显这里想单独说一下晶振负载电容。STM32F103C8T6内部谐振电路对8MHz晶振的负载电容要求通常在1020pFPCB上如果走线短20pF更常见。负载电容偏大只会让起振时间变长但偏小可能直接不起振。测试代码第一次下载失败时别急着怀疑程序先拿示波器测OSC_IN引脚有没有正弦波。BOOT电路也经常被漏掉BOOT0和BOOT1悬空时引脚内部可能有下拉但电位不确定核心板应该明确用10kΩ下拉避免上电偶发进入系统存储器。2.3 引脚功能与测试代码的对应关系STM32F103C8T6引脚功能在数据手册里有完整复用表但做项目时只需要记住几个常用默认脚位。测试代码一般把USART1放在PA9/PA10把LED放在PC13或PA1把按键放在PA0或PB0。下面这组对应关系能让你不看原理图也能快速定位大多数核心板的测试点PA9/PA10USART1的TX/RX核心板通常引到CH340串口芯片上接USB就能打印日志。PA13/PA14SWDIO/SWCLK也是ISP下载口优先于JTAG使用省出3个GPIO。PC13板载LED最常用引脚注意该引脚驱动能力弱直接驱动LED时要串1kΩ以上电阻。PA0/PA1ADC通道0和通道1很多参考例程的电位器采样程序都挂在PA0。我在拿到一份新的核心板资料时会先用万用表量一下原理图里PA9和USB转串口芯片之间的TX/RX网络标号确认不是交叉。很多复制而来的测试代码串口打印乱码都是原理图上TX/RX画反而代码里没换。确认完引脚功能后Altium工程里那些网络标号就有了意义。下一章要做的就是把这些“纸面正确”放到PCB图层上验证。3. ALTIUM Designer打开PCB图从PDF到PCB的移植、规则设置与铺铜处理压缩包里的“ALTIUM设计PCB图”通常是一个已经画好的核心板工程包含原理图、PCB和必要时生成的Gerber。和PDF原理图相比源工程能编译、能跑DRC也能直接改版。但正因为是别人画的板子里面可能带着历史遗留的规则和铺铜设置直接拿去打板前必须重新过一遍。3.1 PDF原理图不宜直接转按网络标签在Altium里核对有些“Altium设计PCB图”其实只是从PDF抄画的打开源工程后元器件位号、封装和PDF不一致并不少见。我的做法是先把PDF原理图和Altium工程放在两个窗口按网络标签逐页核对。重点看VCC、GND、3V3、NRST、BOOT0、BOOT1、PA9、PA10这些出现在多个页面上的网络标号。若Altium工程能编译通过但PCB里某根线没连上多半是对应的封装引脚在原理图库中被映射到了错误的引脚编号。在Altium Designer里我通常用这样一段Query表达式在PCB规则中快速选中目标区域(InComponent(U1) And IsPad And InNet(VCC))这段表达式用在“Clearance”或“Width”规则的Where The First object matches里表示只对U1器件上是VCC网络的焊盘生效。与All规则相比它能单独给电源引脚设置更宽的连接铜皮避免DRC报错后无差别改大整个板子的间距。说明一下U1是STM32F103C8T6的位号不同工程里可能是U2或U3打开原理图看一眼位号再改。3.2 PCB走线要求线宽、间距与guard ringSTM32F103C8T6核心板不大LQFP48的脚间距约0.5mm普通信号线用0.2mm线宽、0.2mm间距就能通过DRC但电源和地线不能按这个走。下面这张表是我根据1oz铜厚、温升不超过10度的经验整理的最小线宽参考电流需求最小线宽1oz铜厚典型用途 0.2A0.2mm信号、GPIO0.5A0.3mmLED、I2C上拉供电1A0.5mm~0.75mm3.3V电源主干2A1.2mm以上5V USB输入、电池充放电“pcb 0.3mm能过多少电流”的答案就在上表0.3mm在1oz铜厚下大约能过0.5A若板子铜厚加到2oz可以放宽到0.8A左右。别只看线宽还要看走线长度和散热条件核心板上3.3V主干用0.5mm是安全冗余不能为了省空间降到0.25mm。ADC采样相关电路建议用guard ring。常见做法是在STM32F103C8T6的ADC输入引脚外围画一圈地铜皮间距至少0.25mm并且把这一圈铜皮通过过孔打到主地平面而不是直接和铺铜连成一个整体。这样做的原理是把相邻信号线上的噪声电流通过低阻抗地回路引走不让它耦合进采样引脚。Altium里面加guard ring不需要画特殊图形在需要隔离的区域画闭合线选中后执行“Tools → Convert → Create Board Cutout from Selected Primitives”就能在铜皮上挖出一圈隔离槽。如果只想挖掉某个网络下方的铜皮选中对应闭合区域后同样用Board Cutout这就是常说的“ad20中pcb板铜皮挖空”。3.3 DRC检查与Gerber输出别漏了钻孔文件PCB画完不能只看有没有飞线。在Altium里按TDR运行DRC至少把Clearance、Width、Short-Circuit和Un-Routed Net勾上。对于核心板这类小尺寸双面板没必要上太多高速规则但有一种情况必须检查晶振走线下面不要走其他信号线SWDIO/SWCLK上串联的22Ω或33Ω电阻不要省否则下载器线缆一长就容易失败。表层的“丝印模糊”多半是丝印线宽太小Altium里把丝印本类线宽设成0.15mm以上能减少制板厂返工。输出生产文件时用.OutJob统一生成Gerber和钻孔。钻孔工序在板厂叫“钻孔层”对应文件是.DRL如果只发Gerber不发钻孔文件板厂会按默认参数打孔很可能把0.3mm过孔打成0.5mm。我习惯把Gerber格式设为RS-274-X精度2:5单位公制再把钻孔文件精度也设成2:5。生成后用CAM编辑器跑一遍DRC确认过孔和走线没有网络隔离异常。4. 烧录测试代码并盘活38例参考例程从GPIO到串口中断测试代码是判断核心板“能不能用”的唯一证据。很多STM32F103C8T6核心板资料包里的测试代码并不一定适配你的板子直接把整个工程编译下载可能因为引脚不同、晶振频率不同或启动文件选错而失败。正确做法是先挑一个最小的GPIO/串口工程跑通后再扩展到38例参考例程。4.1 用HAL库跑通第一份测试代码现在几乎所有参考例程都用HAL库基于Keil、IAR开发环境。先建一个最小工程片上时钟用HSE 8MHzSysTick 1msUSART1 115200-8N1GPIO的PC13设为推挽输出。下面这段是我常用的初始化入口int main(void) { HAL_Init(); SystemClock_Config(); /* HSE 8MHz, PLL倍频到72MHz */ MX_GPIO_Init(); /* PC13 推挽输出PA9/PA10 串口复用 */ MX_USART1_UART_Init(); /* 115200 8N1 */ printf(STM32F103C8T6 core board ready\r\n); while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(200); } } int fputc(int ch, FILE *f) { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF); return ch; }这里HAL_Delay(200)依赖SysTick中断可以在CubeMX的SYS里把Timebase Source选为SysTick同时确保HAL_Init后没有别的地方关闭中断。串口重定向在Keil中要勾选“MicroLIB”否则fputc不会被printf调用。工程里如果同时存在自定义_write和fputc编译器不报错但输出可能走到一个满缓冲区现象是串口前几个字节正常后面全部丢失。4.2 串口通信的坑中断接收为什么只收一次很多STM32F103C8T6串口通信例程里用的是轮询发送、中断接收。初学者常遇到“第一次能进中断第二次就不进”问题不在波特率而在调用方式。HAL库的HAL_UART_Receive_IT是单次接收接收完一字节后会把对应的接收使能位清掉需要重新调用一次。正确写法是在回调函数末尾再调用一次void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart-Instance USART1) { rx_buffer[rx_len] received_byte; HAL_UART_Receive_IT(huart1, received_byte, 1); /* 重新挂下一次接收 */ } }把重新开启放在回调里是为了确保数据搬到缓冲区后才进入下一次接收避免丢字节。如果你要处理不定长协议建议在CubeMX里把USART1的NVIC优先级调高并在回调里判断帧间隔用空闲中断判断一条报文的结束比固定长度更省事。这段代码配合串口助手发送十六进制数据能看到收到的字节数和发送端一致。4.3 38例参考例程怎么选按外设和Flash容量匹配压缩包里的“网集STM32参考例程38例”大概率覆盖GPIO、外部中断、定时器、PWM、ADC、DMA、USART、SPI、I2C以及FreeRTOS。例程并不总是按STM32F103C8T6编译的下载前先看工程设置里的芯片型号和启动文件。F103C8T6属中容量产品Flash 64KB、RAM 20KB启动文件必须选startup_stm32f103xb.s。如果例程里写着stm32f103xe说明按大容量芯片配置的直接换启动文件后还有外设地址不同的问题最好找同一系列的例程。下面是我按“先易后难”排的例程食用顺序优先级例程类型验证方式1LED流水灯/按键扫描肉眼观察2USART1打印中断回显串口助手看printf输出3定时器PWM呼吸灯示波器看频率与占空比4ADC单通道采集串口输出采样值5DMAUSART空闲中断大批量接收不丢字节6FreeRTOS创建两个任务两个LED不同频率闪烁这38个例程里最容易让人卡住的是“GPIO例程”和“串口例程”。前者换个引脚就锁死因为复用功能没有在CubeMX里打开后者波特率不对但代码稳定要优先排查宏HSE_VALUE是否等于8000000。F103C8T6板上晶振绝大多数是8MHz若例程里写的是25000000会导致串口波特率偏差现象是首字符乱码。如果要在STM32F103C8T6上跑FreeRTOS移植时用CubeMX的Middleware勾选FreeRTOS再把configTOTAL_HEAP_SIZE调大一点我习惯改成4096但不要超过16KB。F103C8T6的内存比F103ZE小很多任务栈总和最好控制在12KB内否则编译能过跑起来会偶发HardFault。5. 用串口重定向和烧录验证把STM32F103C8T6测试代码变成调试工具这一章不写新功能而是把前面拆开的PDF、PCB、测试代码收回到一块最小系统板的调试流程里让你后续改例程时少走回头路。5.1 把printf从“测试代码”里放大成追踪手段在Keil工程里勾选MicroLIB后fputc重定向只解决文本输出。实际调板时我习惯在main.c里再包一个调试宏#define DEBUG_PRINT(fmt, ...) printf([DBG] fmt \r\n, ##__VA_ARGS__)这样所有调试信息都带前缀串口助手里能一眼看出调用了哪个模块。注意F103C8T6的RAM只有20KBprintf内部缓冲区不要开太大串口输出频率也别超过每秒100条否则会拖慢ADC采样和SPI时序。5.2 三个验证方法让原理图、PCB、测试代码互为证据第一上电后先测NRST引脚电平应该接近3.3V复位电路正常。第二用示波器测量PA9/PA10在测试代码跑起来后有没有跳变如果只亮灯但串口无输出问题集中在CH340的TXD/RXD交叉或波特率宏上。第三用STM32CubeProgrammer连接SWD口读取UID和Flash大小能读到UID说明最小系统板的晶振和复位已经正常这时候再怀疑代码逻辑。这三个验证顺序能在一分钟内定位“硬件还是软件”的问题。最后整理PCB资料时我至少会保留三份文件最终版PDF原理图、Altium源工程、Gerber钻孔压缩包。Gerber用RS-274-X钻孔精度2:4板厂问层叠厚度时直接提供“1.6mm双面板”或“0.6mm四层板”的方案。把这四份内容——PDF、PCB源工程、Gerber、测试代码——放在同一个带版本号的目录里下次改板时直接压缩这个目录发给板厂不用再重新生成一次生产文件。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门