ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32F103C8T6最小系统板深度解析:型号差异、外围电路与启动模式

STM32F103C8T6最小系统板深度解析:型号差异、外围电路与启动模式 1. 为什么这块小板子值得单独聊一聊STM32F103C8T6 最小系统板圈子里管它叫“蓝色药丸”的那块板子大概是很多人从 51 单片机跨进 32 位世界的第一块跳板。它便宜、资料多、引脚引出完整插在面包板上就能跑焊上排针就能当核心板用。但真正上手之后你会发现事情没那么简单同样是 C8T6有人买到的是 64KB Flash有人买到的是 128KB有人上电就跑有人卡在 Boot 模式死活不启动有人照着原理图接线一次成功有人被 BOOT0 和 BOOT1 的电阻坑了一整晚。这篇内容就是把这些年我在 C8T6 最小系统板上踩过的坑、验证过的结论、以及那些手册里写得含糊但实际很关键的点一次性讲清楚。核心围绕三件事型号差异到底差在哪、最小系统板的外围电路为什么这么设计、启动方式怎么影响你的程序能不能跑起来。不管你是刚买第一块板子的新手还是已经用了一段时间但总觉得“知其然不知其所以然”的开发者都能从里面找到能直接用的东西。我写这篇的出发点很简单网上关于 C8T6 的资料很多但大部分是割裂的——讲原理图的只讲原理图讲启动的只讲启动讲国产替代的只讲替代。实际上这三件事是连在一起的你选什么型号、画什么外围电路、配什么启动模式决定了你的项目能不能稳定跑起来。所以下面我会把它们串起来讲该给参数给参数该上表格上表格该说实操心得就说心得。2. 型号差异C8T6、C6T6、CBT6 到底怎么选2.1 从命名规则看懂 STM32F103 的型号密码STM32F103C8T6 这串字符不是随便起的每一位都有含义。搞懂命名规则你就能一眼看出这块芯片的容量、封装、温度范围不用每次都去翻数据手册。字段含义C8T6 对应值STM32产品系列STM32 32位 MCUF产品类型基础型103子系列主流性能线C引脚数48 引脚8Flash 容量64KBT封装LQFP486温度范围-40 到 85 摄氏度这里最容易出问题的就是第 5 位——Flash 容量代码。ST 的编码规则是4 表示 16KB6 表示 32KB8 表示 64KBB 表示 128KBC 表示 256KB。所以 C8T6 标称 64KBCBT6 标称 128KB。但实际情况是早期批次的 C8T6 芯片内部实际晶圆就是 128KB 的ST 只是按 64KB 卖。这就导致了一个流传很广的“玄学”很多人发现自己的 C8T6 能烧进超过 64KB 的程序。我实测过十几块不同批次的 C8T6结论是不是所有 C8T6 都能当 128KB 用。2020 年之后的批次大部分确实只能稳定用到 64KB 出头强行烧 128KB 的程序前 64KB 能跑后面的地址写入会失败或者读出来全是 0xFF。所以如果你要做正经项目别赌这个直接买 CBT6 或者老老实实优化代码体积。2.2 C8T6 和 CBT6 的真实差异对比很多人以为 C8T6 和 CBT6 只是 Flash 差一倍其他一样。实际上我对比过两者的数据手册和实测表现差异比想象中多对比项C8T6CBT6标称 Flash64KB128KB实际可用 Flash64KB部分批次可超128KBSRAM20KB20KB主频72MHz72MHz定时器数量4 个4 个封装LQFP48LQFP48价格差基准贵 30% 到 50%供货稳定性波动大相对稳定注意 SRAM 都是 20KB这个没差别。所以如果你的程序是 Flash 占用大但 RAM 占用小比如大量常量表、字库换 CBT6 就能解决。但如果是 RAM 不够换 CBT6 没用得换 RB 系列或者外扩 SRAM。还有一个隐藏差异CBT6 的芯片 ID 和 C8T6 不同。如果你在代码里做了芯片型号校验换型号之后可能会触发保护逻辑。我遇到过有人用 C8T6 的 ID 做加密校验结果换 CBT6 之后程序直接不跑了查了半天才发现是 ID 不匹配。2.3 国产替代型号能不能用这两年国产替代的 STM32F103C8T6 越来越多常见的比如 GD32F103C8T6、APM32F103C8T6、CH32F103C8T6 等。这些芯片引脚基本兼容但细节差异不小。GD32F103C8T6 是我用得比较多的替代方案。它的内核是 Cortex-M3但主频能跑到 108MHzFlash 访问速度也更快。不过要注意GD32 的 Flash 擦写次数和 ST 不一样而且它的启动时间更短。如果你用 ST 的标准库直接烧到 GD32 上大概率能跑但延时函数和串口波特率可能会有偏差因为两者的时钟树配置有细微差别。APM32F103C8T6 的兼容性更好一些基本可以做到二进制兼容但价格优势没有 GD32 明显。CH32F103C8T6 是沁恒的它的 USB 和 CAN 外设和 ST 有差异如果你要用 USB 虚拟串口或者 CAN 通讯需要仔细看手册。注意国产替代芯片的 BOOT 模式配置和 ST 基本一致但部分型号的 BOOT1 引脚内部上下拉电阻不同画板子的时候最好还是外部加上拉或下拉别省这两个电阻。我的建议是学习阶段用 ST 原厂或者 GD32 都行量产项目一定要先拿样片做完整测试。尤其是涉及 USB、CAN、ADC 精度这些外设的时候替代型号的差异会被放大。3. 最小系统板的外围电路每一颗元件都有存在的理由3.1 电源部分3.3V 是怎么来的最小系统板的电源输入一般是 5VMicro USB 或者排针然后通过一颗 LDO 降压到 3.3V 给 MCU 供电。常见的 LDO 型号是 AMS1117-3.3这颗芯片便宜、封装小但有个毛病压差大、发热明显。如果你输入 5V输出 3.3V负载电流 100mA那 AMS1117 上消耗的功率就是 (5-3.3)×0.1 0.17W摸起来会温热。如果负载电流到 200mA发热就很明显了。我实测过用 AMS1117 给 C8T6 最小系统板供电MCU 跑 72MHz 全速运行电流大概在 40mA 到 50mA加上板载 LED 和 USB 芯片总电流不超过 80mA。这个电流下 AMS1117 完全能扛住不需要额外散热。但如果你外接了 TFT 屏幕、SD 卡、传感器电流上到 200mA 以上就要考虑换 DC-DC 或者加散热片了。电源部分的电容配置也有讲究。输入端一般放一个 10uF 钽电容或者电解电容再加一个 0.1uF 陶瓷电容输出端同样放 10uF 加 0.1uF。大电容负责滤低频纹波小电容负责滤高频噪声。我见过有人只放一个 0.1uF结果 ADC 采样出来全是跳变加了 10uF 之后就稳了。3.2 晶振电路8MHz 和 32.768kHz 的分工C8T6 最小系统板上通常有两个晶振一个 8MHz 的高速晶振HSE一个 32.768kHz 的低速晶振LSE。8MHz 晶振是给系统主时钟用的。C8T6 内部有 8MHz 的 RC 振荡器但精度只有 1% 左右而且受温度影响大。外接 8MHz 晶振之后通过 PLL 倍频到 72MHz精度能到 20ppm 以内串口通讯、定时器、PWM 这些对时钟敏感的外设才能稳定工作。32.768kHz 晶振是给 RTC 用的。这个频率是 2 的 15 次方经过 15 级二分频正好得到 1Hz 的秒信号。如果你不用 RTC这个晶振可以不焊不影响系统运行。晶振旁边的负载电容怎么选8MHz 晶振一般配 20pF 左右32.768kHz 晶振配 12.5pF 左右。但具体值要看晶振手册的负载电容参数。我遇到过有人用 22pF 配 8MHz 晶振结果起振时间特别长换成 20pF 就正常了。还有一点晶振的走线要尽量短下面不要走其他信号线否则容易引入干扰导致起振失败。3.3 复位电路为什么是 10K 加 0.1uF复位电路很简单一个 10K 电阻上拉到 3.3V一个 0.1uF 电容到地再加一个复位按键。但就是这两个元件参数选不对也会出问题。10K 电阻和 0.1uF 电容组成 RC 延时电路时间常数 τ 10K × 0.1uF 1ms。也就是说上电之后 NRST 引脚需要大约 1ms 才能从低电平升到高电平MCU 在这 1ms 内保持复位状态。这个时间足够电源稳定和晶振起振。如果电阻太大比如 100K复位时间变成 10ms虽然也能用但上电响应变慢。如果电阻太小比如 1K复位时间只有 0.1ms电源还没稳就释放复位了可能导致启动失败。所以 10K 加 0.1uF 是经过验证的经典组合别随便改。复位按键的作用是手动拉低 NRST 引脚强制 MCU 复位。按键旁边一般还会并一个 0.1uF 电容做硬件消抖但这个电容不是必须的软件消抖也能解决。3.4 BOOT 电路两个电阻决定程序从哪里跑BOOT0 和 BOOT1 是 C8T6 启动模式的选择引脚。BOOT0 一般通过一个 10K 电阻下拉到地同时引出一个跳线帽或者按键方便切换到高电平。BOOT1 在最小系统板上通常直接通过 10K 电阻下拉到地不引出跳线因为大部分场景只用主闪存启动模式。这里有个坑BOOT0 的电阻不能省。我见过有人直接把 BOOT0 接 3.3V结果每次上电都进系统存储器启动模式程序根本不跑。还有人 BOOT0 悬空导致启动模式不确定有时候能跑有时候不能跑。所以 BOOT0 一定要有明确的下拉电阻需要切换的时候再通过跳线帽拉到 3.3V。BOOT1 的状态只在 BOOT0 为高电平时才有意义。如果 BOOT0 为低BOOT1 随便什么状态都不影响都是从主闪存启动。所以最小系统板上 BOOT1 直接下拉是合理的省事。4. 启动方式程序从哪里开始跑4.1 三种启动模式的本质区别C8T6 有三种启动模式由 BOOT0 和 BOOT1 在上电复位时的电平决定BOOT0BOOT1启动模式起始地址用途0X主闪存启动0x08000000正常运行程序10系统存储器启动0x1FFFF000串口下载程序11内置 SRAM 启动0x20000000调试用极少使用主闪存启动是最常用的模式。芯片上电后从 0x08000000 地址开始取指令执行这个地址就是用户 Flash 的起始地址。你烧进去的程序就放在这里。系统存储器启动是给串口下载用的。ST 在出厂时往系统存储器里烧了一段 Bootloader支持通过 USART1 接收程序并写入 Flash。这就是为什么你可以用 USB 转 TTL 模块给 C8T6 下载程序不需要额外的调试器。但要注意系统存储器启动模式下你的程序不会运行下载完之后必须把 BOOT0 切回低电平重新上电才能跑。内置 SRAM 启动基本用不到因为 SRAM 掉电就丢而且 C8T6 只有 20KB SRAM跑不了什么程序。这个模式主要是 ST 用来做芯片测试的。4.2 启动流程的底层细节上电之后C8T6 的启动流程大致是这样的电源稳定复位释放芯片根据 BOOT0 和 BOOT1 的电平把对应的起始地址映射到 0x00000000从 0x00000000 取出栈顶地址存入 MSP主栈指针从 0x00000004 取出复位向量地址跳转执行执行启动文件中的 Reset_Handler初始化时钟、内存、调用 main 函数这里的关键是地址映射。C8T6 的 Flash 物理地址是 0x08000000但芯片启动时会把 Flash 映射到 0x00000000这样 Cortex-M3 内核就能从 0x00000000 取向量表。如果你用调试器看内存会发现 0x00000000 和 0x08000000 的内容是一样的。启动文件startup_stm32f103xb.s里定义了向量表第一个字是栈顶地址第二个字是复位向量。如果你不小心改了这个文件或者链接脚本里的地址配错了程序就跑不起来。我遇到过有人把链接脚本的 Flash 起始地址写成 0x00000000结果烧进去之后芯片直接不启动查了半天才发现是地址映射的问题。4.3 串口下载的实操步骤用串口给 C8T6 下载程序需要几个东西USB 转 TTL 模块CH340 或者 CP2102 都行、杜邦线、以及 STM32CubeProgrammer 或者 FlyMcu 软件。接线方式USB 转 TTL 的 TX 接 C8T6 的 PA10USART1_RXUSB 转 TTL 的 RX 接 C8T6 的 PA9USART1_TXGND 接 GND3.3V 接 3.3V如果板子已经单独供电可以不接操作步骤把 BOOT0 跳线帽插到 1 的位置高电平BOOT1 保持 0按一下复位键让芯片进入系统存储器启动模式打开 FlyMcu选择串口和波特率一般 115200选择要下载的 hex 文件点击“开始编程”等待下载完成下载完成后把 BOOT0 跳线帽插回 0 的位置再按一下复位键程序开始运行注意下载的时候如果提示“无法连接”先检查串口是否被占用、TX 和 RX 是否接反、BOOT0 是否确实拉高。我遇到过 USB 转 TTL 模块的 TX 和 RX 标反的情况折腾了半小时才发现。4.4 用 ST-Link 下载和调试如果你有 ST-Link 调试器下载程序会更方便而且还能在线调试。接线方式是ST-Link 的 SWDIO 接 C8T6 的 PA13ST-Link 的 SWCLK 接 C8T6 的 PA14GND 接 GND3.3V 接 3.3V用 ST-Link 下载不需要改 BOOT0因为它是通过 SWD 接口直接访问 Flash 的。在 Keil 或者 STM32CubeIDE 里配置好 ST-Link 调试器点击下载按钮就行。SWD 接口的好处是可以在线调试设断点、看变量、单步执行都行。但要注意PA13 和 PA14 在程序里默认是 SWD 功能如果你把它们配置成普通 GPIOSWD 就连不上了。这时候需要按住复位键点击下载在复位释放的瞬间完成连接。或者用 ST-Link Utility 里的“Connect Under Reset”模式。5. 实操中常见的坑和排查方法5.1 程序下载成功但不运行这是最常见的问题原因通常有三个BOOT0 电平不对。下载完之后忘记把 BOOT0 切回低电平芯片还在系统存储器模式当然不跑你的程序。解决办法就是检查 BOOT0 跳线帽的位置。复位电路有问题。如果 NRST 引脚一直被拉低芯片一直处于复位状态程序也不会跑。用万用表量一下 NRST 对地的电压正常应该是 3.3V。如果是 0V检查复位按键是不是卡住了或者电容是不是短路了。晶振没起振。如果 HSE 晶振没起振而你的程序又配置了 HSE 作为时钟源系统会卡在时钟初始化里。用示波器量一下 8MHz 晶振的引脚看有没有波形。如果没有检查负载电容和晶振焊接。5.2 串口通讯乱码串口乱码一般是波特率不匹配。C8T6 的 USART 波特率是由系统时钟分频得到的如果系统时钟不是 72MHz波特率就会有偏差。我遇到过一种情况用内部 RC 振荡器HSI作为时钟源HSI 的精度只有 1% 左右波特率偏差大了之后串口就乱码。换成 HSE 晶振之后就正常了。所以用串口通讯的时候尽量用外部晶振。还有一种情况是波特率计算错误。比如系统时钟 72MHz要得到 115200 的波特率分频系数是 72M / (16 × 115200) 39.0625取整之后是 39实际波特率是 72M / (16 × 39) 115384误差 0.16%在允许范围内。但如果系统时钟是 64MHz分频系数是 34.72取整 35实际波特率 114285误差 0.8%接近极限了。所以时钟配置一定要算清楚。5.3 ADC 采样值跳动ADC 采样值跳动大通常是电源噪声或者参考电压不稳。C8T6 的 ADC 参考电压就是 VDDA如果 VDDA 和 VDD 共用一路电源数字部分的噪声会串到模拟部分。解决办法在 VDDA 引脚旁边加一个 0.1uF 和一个 1uF 电容尽量靠近引脚。如果对精度要求高可以用独立的 LDO 给 VDDA 供电。另外ADC 采样的时候尽量避开数字信号跳变的时刻比如不要在 PWM 输出的同时采样。5.4 常见问题速查表现象可能原因排查方法上电不运行BOOT0 电平错误检查跳线帽位置下载失败串口接线错误检查 TX/RX 是否交叉串口乱码波特率不匹配检查时钟源和分频系数ADC 跳动电源噪声加滤波电容分离 VDDA晶振不起振负载电容不对换 20pF 电容试试SWD 连不上PA13/PA14 被占用用 Connect Under Reset程序跑飞堆栈溢出增大栈空间检查递归Flash 写入失败写保护未解除用 ST-Link 解除写保护6. 几个容易被忽略的细节6.1 面包板上的插入方式C8T6 最小系统板的排针间距是 2.54mm标准面包板的孔间距也是 2.54mm理论上可以直接插。但实际插的时候要注意板子下面的元件引脚可能会短路。最小系统板背面一般有排针焊点如果焊点太长插到面包板上可能会碰到相邻的孔。我的做法是在板子和面包板之间垫一层绝缘胶带或者把排针焊短一点。另外插的时候不要用力过猛C8T6 的排针比较细容易弯。6.2 USB 虚拟串口和 CAN 不能同时用C8T6 的 USB 和 CAN 共用了一些引脚和中断向量。具体来说USB 的 DP/DM 是 PA12 和 PA11CAN 的 TX/RX 是 PA12 和 PA11。也就是说这两个外设不能同时使用引脚冲突了。如果你非要用 USB 虚拟串口CAN 就用不了。反过来也一样。解决办法是换引脚更多的型号比如 C8T6 换成 R8T6或者用软件模拟 CAN。6.3 加密和读保护C8T6 支持 Flash 读保护可以通过选项字节设置。设置读保护之后用调试器读 Flash 会返回全 0防止代码被抄。但要注意设置读保护之后如果你忘了密码或者操作失误芯片可能会被锁死只能通过擦除整个 Flash 来解锁程序就没了。我一般建议在量产阶段再设置读保护开发阶段不要开否则调试很麻烦。设置读保护的方法是在 STM32CubeProgrammer 里修改选项字节或者用代码调用 FLASH_OB_EnableReadOutProtection 函数。6.4 国产替代的启动差异前面提到过国产替代芯片的 BOOT 配置基本一致但有一个细节部分国产芯片的 BOOT0 内部上下拉电阻不同。ST 的 C8T6 内部 BOOT0 没有上下拉必须外部加。但有些国产芯片内部有弱下拉如果你外部再加一个下拉电阻并联之后阻值变小可能会导致 BOOT0 拉高的时候电平不够。所以画板子的时候BOOT0 的外部电阻建议用 10K不要用太小。如果是用跳线帽切换跳线帽短接到 3.3V 的时候10K 下拉电阻上的电流是 0.33mA完全在允许范围内。7. 从最小系统板到实际项目最小系统板最大的价值是让你快速验证想法。我一般用它做这几件事验证新外设。比如拿到一个新的传感器先在最下系统板上跑通驱动确认时序和寄存器配置没问题再集成到正式板子上。这样出了问题容易定位不会跟其他电路混在一起。测试低功耗模式。C8T6 支持睡眠、停止、待机三种低功耗模式。在最小系统板上测电流很方便因为外围电路简单不会有其他芯片的漏电流干扰。我实测过待机模式下电流可以降到 2uA 左右停止模式大概 20uA睡眠模式 10mA 左右。做小批量控制器。如果项目只需要几十块直接用最小系统板当核心板底板画简单一点成本比重新设计整个 MCU 电路低得多。我有个朋友做实验室设备就是用 C8T6 最小系统板加一块继电器板做了二十多套稳定跑了三年。教学和入门。最小系统板的引脚都引出来了接 LED、按键、OLED 屏幕都很方便。配合 STM32CubeMX 生成初始化代码新手也能快速上手。最后分享一个小技巧如果你买的最小系统板没有引出 BOOT1但你需要用到 SRAM 启动模式可以直接在芯片的 BOOT1 引脚PB2上飞线。PB2 在 LQFP48 封装上是第 20 脚找到之后焊一根细线出来就行。不过 SRAM 启动模式用得极少大部分情况下不需要折腾这个。我在实际使用中的体会是C8T6 最小系统板就像一把瑞士军刀便宜、够用、随处能买到。但它的坑也不少尤其是启动模式和电源部分稍不注意就会卡住。把上面这些点搞清楚你就能把这块板子的潜力榨干而不是每次遇到问题就换板子。
返回列表