蓝药丸STM32F103C8T6嵌入式开发实战:从最小系统到避坑指南 📅 发布时间:2026/9/5 2:38:41 👁 浏览次数: 做嵌入式开发这些年桌上总免不了躺着几块蓝色的小板子。它们大概只有拇指大小一排排插针中间印着“ST”的标识正上方是一颗48脚封装的STM32F103C8T6。这东西在圈子里流传的外号叫“蓝药丸”当年很多学生第一次接触单片机买的就是它很多工程师做样机、验证外设、给客户做方案评估随手抓来就用的也是它。哪怕到了2025年这颗芯片依然是淘宝销量最高的MCU之一也依然是论坛提问区里出现频率最高的型号。这次想把围绕这颗“蓝药丸”的硬件设计、开发方式、典型项目、踩坑经验一次性聊透适合刚入门的学生、做项目选型的开发者以及想回来补基本功的从业者。1. 为什么说F103C8T6是“蓝药丸”1.1 “蓝药丸”这个外号其实有两层意思“蓝药丸”的叫法来源挺有意思。最直观的原因就是那块PB板子绝大多数最小系统板为了显得“专业”直接用了蓝色阻焊油整块板子一眼看过去就是个蓝色小方块插在面包板上非常显眼。另一个原因就是《黑客帝国》里的那个经典桥段你吃了蓝药丸就得留在矩阵世界里继续过普通日子吃了红药丸才会看见真实世界。有人开玩笑说嵌入式工程师大多是因为先碰了这颗“蓝药丸”才入了这个行当从此再也回不去“只写纯软件”的生活了——因为你会开始纠结一颗电容的摆放位置而不是纠结一个指针到底指向哪里。这个外号能流传开还是因为F103C8T6本身的覆盖面实在太广了。它不算性能最强的MCU也不算资源最丰富的但它出现在每一个入门教程里、每一块开发板的默认配置里、每一个产品原型的第一版设计里。如果你去查国内几大电子论坛的历年帖子总量F103C8T6相关的内容保守估计占了Cortex-M系列帖子的两三成。这颗芯片不是性能天花板但绝对是经验基数最大的“国民MCU”。1.2 核心资源拆解一颗“小身板大能量”的芯片先从硬件规格说起。STM32F103C8T6是意法半导体Cortex-M3内核的增强型微控制器最高主频72MHz内置64KB Flash和20KB SRAM封装为LQFP48属于中等容量产品。比起现在动不动就几百兆主频、几MB内存的新款MCU这个配置看起来毫不起眼但它的外设组合却非常均衡3个USART、2个SPI、2个I2C、1个CAN、1个USB 2.0全速接口、2个12位ADC以及一堆通用定时器、PWM输出通道、外部中断引脚。也就是说通信、采集、控制这三类最常见的嵌入式需求它全占着了。很多入门者会问64KB Flash够用吗20KB SRAM能跑系统吗实测下来如果你用HAL库一个稍微完整的项目OLED显示、按键、传感器读取、状态机控制大概会占20KB到35KB Flash如果加上FreeRTOS和LVGL裁剪得当也能塞进去。让我给你一个直观参考我做过一个带FreeRTOS、四个任务显示、采集、通信、控制的智能家居网关项目全部跑在F103C8T6上Flash占用率大约78%RAM占用大约60%。能用但已经不算宽松。所以这颗芯片教会你的第一件事就是“资源规划”——你没办法像写PC程序那样随便new一个很大的数组你得想清楚每个字节去哪。引脚方面LQFP48封装提供37个可用IO每一个GPIO口几乎都复用两三组外设功能。这里要提醒一句GPIO的复用选择不是“随便映射”具体引脚对应哪个USART、哪个SPI一定要打开STM32CubeMX里那幅引脚图去查别凭感觉接很多新手第一次I2C通信不通就是因为把SDA接错了引脚。2. 从原理图到点亮LED把工程跑起来2.1 最小系统板的三个基本模块在淘宝上花几块钱买到的F103C8T6最小系统板原理图基本是一个模子出来的拆开看就是几个必备模块的组合。电源部分用一颗AMS1117-3.3把USB的5V转成3.3V同时每个电源引脚旁边都配有100nF去耦电容这是MCU稳定工作的基本保障。时钟部分板载一颗8MHz无源晶振配合两个20pF左右负载电容给芯片提供HSE外部高速时钟源。复位电路用一个10kΩ上拉电阻加按键按键按下把NRST引脚拉低触发复位。下载调试接口是四线制SWDSWDIO、SWCLK、GND、3.3V比老式JTAG节省引脚下载速度也够日常开发用。BOOT引脚配置也要讲清楚。F103C8T6有BOOT0和BOOT1两个引脚它们决定芯片复位后从哪里启动。绝大多数最小系统板把BOOT1直接接地BOOT0通过一个跳线帽或拨码开关连接到地或3.3V。默认情况下BOOT00从主Flash启动正常运行用户程序如果把BOOT0拉高则从系统存储器启动也就是进入内置Bootloader此时可以通过USART1串口下载程序。很多同学买板子送CH340串口模块就依赖这个机制完成一键下载。用久了之后我把BOOT0跳线帽直接拆了全程用ST-Link的SWD接口下载省事也不会碰到“程序下载进去了但运行不出来”这种奇怪问题。2.2 五分钟点亮LEDCubeMX创建工程全流程点亮一颗LED是嵌入式开发的“Hello World”也是检验工具链是否正常的最快方式。我用的是STM32CubeMX生成初始化代码然后拿到Keil或STM32CubeIDE里编译下载。整个流程如下第一步打开CubeMX点击New Project在MCU选择界面搜索“STM32F103C8”选中芯片后进入Pinout界面。第二步在左侧Categories菜单里找到RCC把HSE设为Crystal/Ceramic Resonator因为板子有8MHz晶振再把SYS里的Debug设为Serial Wire否则你烧录一次后SWD接口会被禁用下次连不上调试器。第三步在芯片引脚图上找到你要用的LED引脚。我这里用的是PA5左键单击选择GPIO_Output。第四步切到Clock Configuration页面把HCLK改成72MHzCubeMX会自动计算出正确的分频和倍频系数HSE8MHzPLLM1PLLN9PLLP1最后SYSCLK72MHz。这里建议别偷懒直接点软件自动生成时钟树自己动手配一遍你才知道PLL到底是怎么倍频上去的。第五步在Project Manager页面设置工程名、保存路径Toolchain选择MDK-ARM然后点击右上角GENERATE CODE生成工程。打开生成的工程后在main函数的while(1)循环里加入以下代码while (1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_Delay(500); }编译、下载、按下复位键如果PA5上接的LED以1Hz频率闪烁恭喜你工具链和板子都没问题。这整个过程我带着零基础的同学操作过普遍能在十几分钟内完成。如果卡住了九成问题出在调试器驱动没装好、板子供电不足或者选错了芯片型号。2.3 手工创建HAL工程搞懂初始化代码背后的逻辑用CubeMX生成工程很舒服但有一个副作用——很多人离开它就不会干活了。我建议每个想真正吃透F103C8T6的人都手工创建一个HAL库工程至少一次。手工创建的核心流程是准备startup_stm32f103xb.s启动文件、stm32f1xx_hal_conf.h配置文件、system_stm32f1xx.c系统时钟初始化文件然后自己写一个main.c并在里面完成三件事。第一件事是初始化HAL库调用HAL_Init第二件事是配置系统时钟直接用下面的函数设置Flash等待周期、打开HSE、配置PLL把主频提到72MHz第三件事是使能GPIOA的时钟、配置PA5为输出模式然后在循环里翻转引脚电平。你不需要把每一行寄存器操作都背下来但要清楚“外设时钟要单独打开”这件事。F103系列有三条总线AHB、APB1、APB2GPIOA挂在APB2上所以要先调用__HAL_RCC_GPIOA_CLK_ENABLE()否则你往PA5写再多的电平翻转命令引脚都纹丝不动。理解了这一层以后换到其他型号的STM32也能举一反三。手工创建工程的体验就像骑自行车折腾过一次之后你对CubeMX生成的那些初始化代码不再感到陌生遇到启动异常时也能知道该去哪里翻线索。3. 开发方式怎么选标准库、HAL库还是LL库3.1 “库”到底是什么意思很多刚上手的人会被“标准库”“HAL库”“LL库”这些说法搞晕。说白了它们都是意法半导体提供的外设操作代码集合把寄存器的操作封装成函数。早期ARM开发常用的是“寄存器裸奔”直接读写寄存器地址代码执行效率最高但阅读和维护非常痛苦。你写一个USART发送函数可能要查好几页寄存器手册而且一不小心就把某个位配置错了。后来ST推出了标准外设库Standard Peripheral Library函数风格是GPIO_Init()、USART_SendData()这代库陪伴了很多工程师现在你搜F103的老教程八成还是标准库的。再后来ST主推HAL库Hardware Abstraction Layer函数风格变成HAL_GPIO_Init()、HAL_UART_Transmit()跟标准库最大的差异是加入了大量超时机制和状态标志还对CubeMX做了深度适配基本上你在图形界面里勾选外设它就能自动生成可用的初始化代码。LL库则是HAL库边上的一套轻量级实现函数更接近寄存器操作效率高适合对性能和代码体积敏感的场景。3.2 我这几年的实际感受我用标准库写过项目后来全面切到HAL库只在个别信号采集算法里用LL库或直接操作寄存器做优化。标准库现在基本被ST停止维护新手再去学它除了看老教程时能看懂新项目里没必要主动选。HAL库的优点是统一同一个函数API在F1、F4、H7上几乎一致如果你以后还想用STM32的其他型号学习曲线平滑很多。缺点是中间层厚代码体积大、执行速度比寄存器操作稍慢但在72MHz主频下只要不是极端时间敏感的场景这个性能损失完全可以忽略。LL库我用的场景比较特殊比如在F103上用软件模拟I2C时序读取传感器时用LL库的LL_GPIO_WriteOutputPort和LL_GPIO_ReadInputPort可以极大简化引脚的批量操作代码看起来也更清爽。如果你要做一个精确的PWM输出或者高频采样LL库比HAL库更可控。所以我的建议是入门直接用HAL库配合CubeMX走主线遇到性能瓶颈再局部用LL库或寄存器操作去优化不要一开始就陷入“极致性能”的焦虑。3.3 不同人群的选型建议这里给你一个简单的参考。如果你是学生、刚接触STM32直接学HAL库配合CubeMX可视化配置效率最高也更贴近现在企业里的大多数岗位要求。如果你在维护老项目GitHub和国内论坛上F103的经典代码大多基于标准库你得能看懂但不必花精力去重写。如果你在写量产级的裸机产品或者对功耗、时序有极端要求考虑用LL库或者寄存器开发。选型这件事没有什么绝对优劣重点是你能把项目顺利交付而不是跟某一种库“结婚”。4. 从LED到真项目典型实战案例拆解4.1 密码锁矩阵键盘加OLED加Flash存储我当年拿F103C8T6做的第一个完整项目是密码锁现在很多学生的课设也还在做这个。整体结构不算复杂4x4矩阵键盘负责输入0.96寸I2C接口的OLED屏负责显示状态一个电磁锁或LED模拟执行结果。F103的资源用来跑这套系统简直是绰绰有余但这个项目有一个非常关键的工程点断电后密码不能丢。密码存哪里F103没有真正的EEPROM但它的Flash支持自编程可以借用最后几页Flash模拟EEPROM的功能。这就是所谓的“Flash模拟EEPROM”。实现的思路是在用户程序里定义一个常量数组把固定长度的密码数据写入指定Flash地址写入之前先执行Flash解锁操作调用HAL_FLASH_Unlock()然后按半字16位为单位擦除和编程最后再上锁HAL_FLASH_Lock()。要注意的是F103的Flash擦除是按页进行的写在里面的数据在擦除前必须整体备份不然会把其他配置也一起抹掉。我在这个项目里踩过的最大一个坑是Flash写入次数和寿命问题。F103C8T6的Flash擦写寿命标称是1万次课设级别完全够用但如果你设计的产品需要频繁保存配置就得考虑磨损均衡或者外挂一颗真正的EEPROM芯片。另外擦除Flash期间如果系统突然断电轻则数据损坏重则程序崩溃所以尽量在写入前做一次电压判断或者把写入操作放在主循环的低优先级任务里不要放在定时器中断里直接搞。4.2 智能家居安防系统多传感器加ESP01S联网这几年基于F103C8T6的智能家居安防项目非常火核心是把各种传感器信号汇聚到MCU上再通过WiFi模块上报到云端或者手机。典型框图大概是人体红外传感器检测入侵、DHT11温湿度模块采集环境数据、火焰传感器检测异常、蜂鸣器和LED做本地报警ESP01S通过串口连接F103只负责把数据推送到MQTT服务器或OneNet这类物联网平台。ESP01S本身出厂带AT固件很多初学者一开始就直接用串口发AT指令操作它比如ATCIPSTART、ATCIPSENDF103的代码里写一个简单的AT指令封装函数就行。这个过程看起来简单但我实际用下来有几条经验值得分享第一ESP01S在上电时需要至少几百毫秒的稳定时间不要在F103复位后立刻发AT指令否则大概率收不到任何响应正确做法是上电后先延时1秒再尝试发送AT并等待OK不成功就重试。第二ESP01S的供电很挑剔启动瞬间电流可能冲到300mA以上如果直接从F103的3.3V引脚供电很容易把板子电压拉垮导致MCU复位。最稳妥的做法是给ESP01S单独配一颗AMS1117-3.3或MP1584降压模块并把MCU和WiFi模块的地连在一起。第三串口速度建议固定为9600或115200AT固件默认波特率一般是115200两边要对齐。如果你对WiFi模块的AT指令通信感到繁琐可以考虑换成ESP-12F裸模块自己烧MQTT固件或者干脆直接用ESP32做主控。但这就偏离F103的范畴了当你想练手多设备协同和资源紧张时的取舍F103加ESP01S的组合反而更有教学意义。4.3 基于HX711的电子秤ADC精度与滤波之间的较量HX711是称重传感器常用的24位高精度ADC芯片通过简单的两线接口DOUT和PD_SCK与MCU通信。网上关于HX711配F103的代码很多但很多人做出来的电子秤读数跳得厉害根本不能稳定显示重量。问题通常不出在硬件而出在软件滤波策略。HX711输出的是24位有符号数但称重传感器本身的机械振动、电源纹波、人体触碰都会让原始数据产生跳动。我的做法是分级处理首先去掉明显异常的最大最小值然后做滑动平均滤波窗口长度选8到16。如果还是跳那就需要做“标定”了。标定的本质是把ADC原始码和实际重量建立线性关系通常用两个点空载时读取一个偏移值放一个已知重量的砝码读取另一个值然后算出比例系数。这个系数在程序里一般用毫秒级delay配合按键触发反复校准三次取平均。代码大致是float scale 0.0f; int32_t offset 0; void scale_calibrate_zero(void) { offset hx711_read_average(8); } void scale_calibrate_weight(float known_weight) { int32_t cur hx711_read_average(8); scale (cur - offset) / known_weight; } float scale_read_weight(void) { int32_t cur hx711_read_average(8); return (cur - offset) / scale; }比例系数按“实际重量值”而不是“克”来存这样标定过程更直观。另外HX711的电源地最好用模拟地和数字地单点连接减少开关电源噪声对ADC结果的影响。F103的ADC虽然是12位的但在这种高精度称重场景下直接用外置HX711才是正确选择别指望内置ADC能测到毫克级变化。4.4 用HAL库模拟I2C读取MT6701磁编码器磁编码器MT6701在很多电机控制项目里会用到它通过I2C接口输出角度数据。很多人直接配置F103的硬件I2C外设去读取结果发现通信不稳定、偶尔卡死。F103的硬件I2C确实有设计缺陷网上调侃它“难用到怀疑人生”官方手册里也列了不少限制比如总线错误处理不完善、时钟同步逻辑别扭。虽然最新固件库有所缓解但依然让很多人选择放弃硬件I2C改用GPIO软件模拟。我在项目里就是用HAL库的GPIO函数模拟I2C的起始信号、停止信号、字节读写时序。MT6701的I2C设备地址是0x06内部寄存器可以直接读。软件模拟I2C的好处是引脚任意分配、时序可以自己掌控坏处是需要CPU忙等但F103跑72MHz模拟I2C时钟跑到100kHz级别完全没问题。读取流程是发送起始位发送7位地址加写位发送要读取的寄存器地址重新发送起始位发送地址加读位连续读两个字节最后发送停止位。角度值就由两个字节拼出来。这个过程中有个细节很关键MT6701的响应时序对延时很敏感SCL上升沿和下降沿之间需要留出足够的建立时间。我常用的软件延时是每条总线操作之间空几个for循环具体空多少要看实际波形拿逻辑分析仪看一下最靠谱。没有逻辑分析仪时就通过串口把原始字节打印出来看看是否读出稳定的数值如果全是0xFF或者乱跳大概率是地址错了或者时序太快。4.5 FreeRTOS加LVGL小内存移植的取舍F103C8T6的20KB SRAM能不能跑FreeRTOS加LVGL我的答案是能但你必须克制。FreeRTOS本身占用的内核RAM非常少只要按实际需求分配好任务栈5KB以内就能跑起来。LVGL则是个内存大户它是图形库需要帧缓冲和控件对象动辄就要十几KB。F103C8T6没有外部RAM接口这意味着你只能在内部SRAM里腾挪。我的移植经验是屏幕分辨率选128x64的OLED或128x160的TFTLVGL的LV_COLOR_DEPTH设为16不要开复杂的动画效果关掉不用的控件和特性把显示缓冲改成单缓冲模式。这样整套图形栈加上FreeRTOS可能只占用14KB左右的RAM剩下的留给任务栈和业务逻辑。如果你需要更复杂的界面建议直接换用带外部PSRAM的芯片比如STM32F407系列或者直接上ESP32硬要在F103上跑大型LVGL界面属于为难自己。移植FreeRTOS也有一个常见误区直接下载一个现成的FreeRTOS工程就跑结果任务调度不起来。F103要跑FreeRTOS必须在配置文件里设置好中断优先级分组以及PendSV和SysTick中断优先级。SysTick一般设置为最低优先级PendSV优先级设为最低这样不会干扰其他外设中断。如果这个没配置好你可能会发现某个任务卡死、串口中断失灵各种诡异问题。5. F103C8T6实战避坑清单5.1 硬件设计的几个关键坑先讲硬件。第一每个VDD引脚旁边都必须放100nF去耦电容并且电容要尽量靠近引脚。如果你画PCB时图省事只放了一个大电容MCU高速翻转IO时电压会塌陷系统随机重启。第二NRST复位引脚不要悬空至少要一个10kΩ上拉电阻否则静电干扰可能导致反复复位。第三如果最小系统板没有板载3.3V稳压器外部供电一定要稳定在3.0V到3.6V超过3.6V会永久损坏芯片低于2.4V可能连调试器都连不上。第四如果你引脚复用了JTAG功能比如PA13、PA14、PA15、PB3、PB4默认状态下它们可能是作为调试接口使用的想把这些引脚当普通GPIO用必须在初始化代码里先禁用对应的调试功能或者直接选择SWD模式把PB3/PB4释放出来。SWD调试是另一个容易踩坑的地方。很多人第一次用ST-Link连板子下载一次程序之后第二次就报“No target connected”错误八成是代码里把SWD引脚给重新配置成普通GPIO了。解决方案有两个在代码里不初始化这两个引脚或者用CubeMX把SYS的Debug设为Serial Wire这样调试器就不会因为引脚被重新定义而失联。如果你已经失联了就得把BOOT0拉高进串口下载模式用串口擦除Flash或恢复程序。5.2 软件与开发环境的常见问题软件方面最常见的坑是时钟树配置错误。F103C8T6默认使用内部HSI时钟时主频只有8MHz如果你忘了在SystemClock_Config里启用HSE并配置PLL程序的执行速度会非常慢串口波特率也会对不上。判断方法很简单点灯时闪烁频率比预期慢8倍那就是没用PLL倍频。还有一点当你使用USB外设时系统时钟必须精确为48MHz否则USB枚举会失败。F103C8T6的USB和CAN共用一个专用时钟源如果你同时启用了这两个外设实际项目里需要仔细分配PLL输出。串口下载的坑也很常见。用串口ISP下载时需要先把BOOT0拉高复位芯片点下载按钮再把BOOT0拉低再按一次复位让程序运行。很多一键下载电路通过串口DTR和RTS信号自动控制BOOT0和复位引脚但CH340的驱动或者接线顺序搞错时下载就会一直卡在“连接中”。遇到这种情况别急着怀疑硬件先用串口助手手动测试一下发送0x7F是否能让MCU进入Bootloader再排查电平转换和接线。软件方面另一个高频问题就是晶振不起振。如果程序跑了但系统时间不对或者用示波器量不到8MHz信号先检查晶振两脚的负载电容是否太大。某些开发板会使用15pF电容有些用22pF对8MHz晶振来说都能工作但如果焊错成了100pF甚至更大晶振可能直接停振。无源晶振对PCB布线附近的杂散电容很敏感晶振底下尽量不要走信号线这对批量生产良率也有影响。5.3 调试经验和工具推荐调试F103C8T6工具在精不在多。硬件层面一个ST-Link V2就够用便宜且兼容主流IDE下载速度虽然比不过J-Link但调试F103绰绰有余。软件层面除了Keil MDK和STM32CubeIDE推荐配合串口调试助手使用我用的是自己写的一个Python脚本把AT指令日志和时间戳打印到本地文件比看IDE的串口终端窗口舒服很多。逻辑分析仪是另一个强烈推荐的工具尤其是调试I2C、SPI这类同步通信几十块钱的24MHz入门逻辑分析仪加上Sigrok/PulseView能直接解码出波形比盲猜时序高效太多。遇到程序跑了但现象不对最快的定位方法是先分段打串口日志。比如上电后第一行打印“init ok”第二行打印“gpio configured”第三行打印“loop start”这样你能立刻知道程序卡在哪个环节。F103的UART在HAL库下可以很方便地重定向printf到串口但要注意HAL库的HAL_UART_Transmit是阻塞式的如果串口波特率配错可能表现为程序卡死实际上是卡在发送数据等发送完成标志上。解决办法是配置一个超时时间或者在中断里发送。5.4 关于芯片加密和“国产替代”的大实话聊到量产项目加密和芯片供货都是绕不开的话题。F103C8T6可以通过设置读保护RDP来防止别人直接通过调试接口读出Flash里的程序。RDP分为Level 0、Level 1、Level 2Level 1已经能有效阻止调试接口读取FlashLevel 2则彻底关闭调试功能但设置后无法降级回Level 1属于一次性选择。如果你要在量产前加密固件建议在量产的hex文件里通过编程器或上位机设置好RDP等级同时配合芯片唯一ID做绑定校验进一步提高破解成本。但也要说句实话RDP不是绝对安全真正追求高强度安全的场合建议上带硬件加密引擎的芯片比如STM32L4或H7系列。很多工程师对F103的加密只是做一道基础防线真正保护产品价值的是算法和服务端这个观念在选型时就要清醒。再说说国产替代。这几年供货波动让很多人开始关注GD32、APM32、AT32这些与F103引脚兼容的国产型号。从技术角度看其中一些芯片在硬件上确实能直接替换甚至可以用板子上的焊盘直接贴上去代码层面做少量适配就能跑。但替代不是一个“焊上去就完事”的动作你需要重新测试ADC精度、定时器精度、低功耗电流、USB兼容性这些细节。比如GD32的系统主频能跑到108MHz比F103的72MHz高不少但你如果想跑108MHz硬件和软件都要做相应调整不能把F103工程原封不动地编译进去就跑。如果你做的产品对成本敏感、供货要求高可以评估一个兼容型号作为第二货源但一定不要在没做完整测试的情况下直接切换。这部分我没有办法替你做决定但多年的经验是替代选型至少要预留一个月的验证周期从外设寄存器差异、Flash擦写机制到芯片丝印标识的追溯性全都要过一遍。6. 写在最后的“蓝药丸”心得如果让我给刚接触F103C8T6的人一句建议我会说别急着学各种花哨的库和框架先把最小系统的三要素——电源、时钟、复位——彻底搞明白再用这颗芯片点亮一盏灯然后不断给这个小系统增加外设让代码和硬件一起长大。我见过太多人买了一块“蓝药丸”板子跟着教程把例程下载进去LED亮了然后就搁在一边吃灰。这种学习方式其实很浪费。F103C8T6最大的价值不在于性能而在于它的“皮实”——便宜、资料多、性能够用、出错代价低。你完全可以把每一个奇怪的想法都扔到它上面试一遍今天做数字电压表明天做四轴飞控的传感器融合后天给它加一个FreeRTOS做多任务。这些经验会沉淀成你对MCU世界最真实的感觉将来无论换到多高端的新芯片很多坑的底层逻辑是一样的。我自己这几年从F103一路做到H7系列再做到各种RISC-V芯片回过头来看最感谢的还是这颗“蓝药丸”。它让我懂了什么叫中断优先级、什么叫DMA、什么叫时钟树、什么叫“能用就行”。这些基本功大部分都是在这块蓝色小板子上练出来的。如果你也有一颗这样的板子压在抽屉里别让它吃灰了拿出来接一盏LED然后想想它还能帮你实现什么奇怪又有趣的想法。