ARTICLE DETAIL

资讯详情

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

STM32F103开发板入门完全指南:硬件确认、环境搭建与实战

STM32F103开发板入门完全指南:硬件确认、环境搭建与实战 拿到板子的第一件事不是急着下载程序先把引脚和启动方式搞清楚。最近不少刚入坑的朋友私信我说STM32F103的开发板到手了但面对密密麻麻的排针、各种跳线和下载接口完全不知道从哪里下手。这块板子确实是嵌入式入门的经典之选Cortex-M3内核、72MHz主频、丰富的外设资源价格还便宜市面上绝大多数入门教程也都围绕它展开。不过我也见过太多人板子买回来吃灰原因基本都一样环境搭建卡住、工程模板不会建、烧录失败、GPIO点灯都搞不定。这篇文章就结合我自己的踩坑经历从硬件确认、环境搭建、工程模板、常见外设实战到疑难问题排查把整套入门流程梳理清楚希望能帮你把这块板子真正用起来。1. 开发板硬件细节确认与引脚基本功很多新手拿到板子不看原理图就直接上电结果板子没反应就开始怀疑板子坏了其实大概率是电源跳线、BOOT跳线或者晶振方向搞错了。这块板子虽然小但上面的每一个跳线、每一个丝印都是有讲究的。1.1 芯片型号与封装确认收到板子第一步先看主控芯片丝印。最常见的STM32F103系列有几款型号比如STM32F103C8T6中容量、64KB Flash、20KB RAM、LQFP48封装、STM32F103RCT6256KB Flash、48KB RAM、LQFP64封装、STM32F103ZET6512KB Flash、64KB RAM、LQFP144封装。不同型号引脚数量和Flash大小差异很大直接影响你后面能做的项目复杂度。我手上的这块板子是C8T6也就是网上一二十块钱那种最小系统板蓝色或者黑色PCB引出两组排针。这种板子适合学习入门但如果后面想跑复杂的GUI或者更大的协议栈Flash可能就不够用了。所以建议新入坑的朋友先确认好自己板子的具体型号因为芯片包选择、工程配置里的Device选项、Flash下载算法的选择都跟型号强相关。还有一个细节容易被忽略部分板子用的是CH340串口芯片做USB转串口部分用的是CP2102或者FT232。这些芯片的驱动不一样在设备管理器里看到的COM口号也不同。安装驱动这一步虽然简单但是卡住的人真的不少后面环境搭建部分我会专门说到。1.2 第一脚确认与引脚分布判断判断芯片第一脚是基本功也是很多人容易搞反的地方。STM32的LQFP封装芯片左上角会有一个圆点或者凹坑标记右下角还会有一个方向性的斜切角。以正对丝印文字的方向为准逆时针数第一个脚就是左上角那个圆点旁边的引脚。对于开发板上的排针一般丝印层会标注Pin1或者一个小的方框焊盘作为起点。但某些低成本的板子丝印不完整这时候最好对照卖家提供的原理图来确认。我建议新入门的朋友拿到板子先把原理图PDF下载保存好后面查引脚、看电路、排查问题都用得上。引脚分布有一个大概规律GPIOA、GPIOB、GPIOC分布在芯片四周每个Port有16个引脚编号从0到15。对于C8T6这种48脚封装很多引脚还是有复用的一个引脚既可以是GPIO也可能是USART、SPI、I2C、ADC等外设的复用功能。不要死记硬背用的时候查数据手册或者参考例程就行。1.3 供电、复位、晶振与BOOT模式最小系统板的供电通常有三种方式USB的5V、排针上的5V、排针上的3.3V。板上一般会有一个AMS1117稳压芯片把5V转成3.3V给MCU供电。注意如果同时从USB和排针供电可能存在电流倒灌问题虽然绝大多数板子不会立刻烧坏但长期这么干对芯片不好。建议养成习惯只选一种供电方式。复位电路一般是一个10K上拉电阻加一个104电容低电平复位板载一个复位按键连接到NRST引脚。晶振用的是8MHz无源晶振加两个20pF左右的负载电容系统时钟经过PLL倍频到72MHz。有些板子还用32.768KHz的RTC晶振这玩意很容易虚焊如果有RTC时钟跑不准的情况先检查它。BOOT引脚是新手最容易忽略的。三个启动模式BOOT00、BOOT1任意时为Flash启动正常运行BOOT01、BOOT10时为系统存储器启动用于串口ISP下载BOOT01、BOOT11时为SRAM启动调试用。正常烧录运行程序时BOOT0必须保持在0。有些板子的BOOT0跳线出厂默认没有短接好程序死活跑不起来检查一圈最后发现是跳线帽没插。2. 开发环境搭建与工程模板创建环境搭建是新手第一个拦路虎也是劝退率最高的环节。这一节我把KEIL5、STM32标准库、工程模板、烧录器驱动一条龙讲清楚手把手带你把环境搞定。2.1 KEIL5安装、C51兼容与STM32芯片包KEIL MDK是STM32开发最常用的IDE。这里有个坑很多人电脑上已经装了KEIL C51用来玩51单片机的再装MDK时会发现两个软件默认装到同一个目录互相覆盖。这两者并不完全兼容最好装到不同目录比如C:\Keil_v5和C:\KeilC51。安装完MDK后还需要给KEIL安装对应的STM32芯片包Device Pack。MDK5之后芯片支持都是以Pack形式提供的打开Pack Installer在线安装STMicroelectronics STM32F1 Series Device Support包即可。不过在线安装经常因为网络问题失败建议从Keil官网或者国内镜像下载离线Pack包扩展名是.pack双击即可安装。我实际遇到过一种情况Pack装好了新建工程时Device列表里也能看到STM32F103C8但编译报错说找不到core_cm3.h。这是因为CMSIS包没有跟随芯片包自动装好手动到Pack Installer里把CMSIS相关组件也装上就能解决。这个问题出现的频率非常高几乎每周都有新手群里的人问。2.2 VSCode配置STM32开发环境的思路很多朋友不喜欢KEIL的编辑器想用VSCode写代码、调程序。现在这个玩法确实很成熟了核心思路是用VSCode做代码编辑、智能提示、Git管理编译和烧录交给arm-none-eabi-gcc工具链加openocd或者pyOCD。具体配置流程大概是安装arm-none-eabi-gcc交叉编译工具链加入系统PATH。安装OpenOCD配置好ST-Link或者J-Link的驱动。VSCode里装上C/C扩展、Cortex-Debug扩展。配置c_cpp_properties.json指定编译器路径、Include路径标准库头文件和CMSIS头文件目录。配置tasks.json调用Makefile或者CMake来编译工程。配置launch.json这个是调试的核心需要指定OpenOCD配置文件的路径、目标芯片类型、gdb路径等。这里特别说一下launch.json的关键参数比如使用ST-Link时configFiles要写interface/stlink.cfg和target/stm32f1x.cfgsvdFile指定为STM32F103xx.svd这样调试时外设寄存器才能显示成可读的名称而不是裸地址。很多人卡在调试器连不上目标板往往是因为OpenOCD的interface配置文件写错了或者st-link驱动版本老换了新驱动就好了。但说实话对纯新手来说第一周还是建议先用KEIL等对编译、下载、调试的基本流程都熟了再去折腾VSCode。VSCode的灵活性强但配置成本也高如果同时要处理编译器和调试器的各种兼容问题容易分散学习注意力。我自己的情况是日常工作用VSCode教学和演示用KEIL两个环境各有各的用处。2.3 STM32标准库新建工程的全过程构建工程模板前先在官网或者GitHub下载STM32标准外设库StdPeriph_Lib。确认版本比如V3.5是比较成熟稳定的版本。解压后里面有LibrariesCMSIS和STM32F10x_StdPeriph_Driver两个核心目录、Project、Utilities等目录。新建工程的关键操作步骤如下KEIL里点New Project在Device选项卡选择自己的芯片型号比如STM32F103C8。在弹出的Manage Run-Time Environment窗口里如果要用标准库直接点Cancel不用勾选这里的组件。在工程里新建几个分组GroupStartup、CMSIS、StdPeriph_Driver、User、Hardware这样代码结构清晰。StdPeriph_Driver下面还可以按照外设细分子分组。向分组中添加源文件Startup里放启动文件startup_stm32f10x_md.s中容量选md高容量选hdCMSIS里放system_stm32f10x.c和core_cm3.cStdPeriph_Driver里按用到的外设添加stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_usart.c等User里放main.c和stm32f10x_it.c中断服务函数文件。关键配置Options for Target - C/C里定义STM32F10X_MD中容量然后添加Include路径把标准库的头文件目录都加进去。Output选项卡勾选Create HEX File这样烧录时有HEX文件可用。Debug选项卡选择ST-Link Debugger或者J-LINK点Settings确认能识别到芯片ID。这整套流程走完一遍你对工程就有了整体认识。后面再新建项目哪怕外设不同模板的框架是不变的。2.4 程序烧录的几种方式与烧录失败排查烧录方式主要有三种ST-Link/J-Link的SWD接口下载最常用、串口ISP下载通过BOOT0拉高进入系统存储器、JTAG下载引脚占用多现在用得少。SWD接口只需四根线SWDIO、SWCLK、GND、3.3V不占用额外引脚非常方便。接线时注意别接反了SWDIO和SWCLK接反是常见的低级错误会提示找不到目标设备。我见过最多的问题是KEIL编译成功但一点Download按钮就报错“Flash Download failed - Cortex-M3”。这类问题大概率是芯片型号选错了比如板子是C8T6中容量你工程里却选了RCT6或者ZET6的高容量型号导致Flash下载算法不匹配。解决办法是打开Options for Target - Debug - Settings - Flash Download确认Programming Algorithm里选的是STM32F10x Med-density Flash起始地址0x08000000大小根据芯片真实Flash设置。另一个高频原因下载时板子正处于运行状态并且代码里关闭了调试端口或者把SWD引脚重映射成普通GPIO。这种情况下芯片能跑但调试器和烧录器连不上。解决办法是按住复位按键不放点Download等KEIL开始连接时再松开复位也就是“下载瞬间复位法”。这个技巧我用了很多年救急非常管用。3. 核心外设实战从GPIO点灯到定时器测频率环境搞定以后真正的学习才刚刚开始。STM32的魅力在于外设丰富但新手面对几十个外设寄存器很容易迷失。我的建议是不要贪多一个外设一个外设地啃每做完一个就记录下来形成自己的代码库。3.1 GPIO点LED与延时函数设计GPIO是第一个要掌握的外设。点灯的核心步骤是使能GPIO时钟、配置GPIO模式、写电平。C8T6的PC13引脚上通常焊接了一个LED低电平点亮。很多人上来直接照着别人的代码写GPIO_SetBits(GPIOC, GPIO_Pin_13)想点亮LED结果发现LED不亮就是因为不清楚这个LED是低电平点亮要写GPIO_ResetBits才能亮。GPIO的八种模式里最常用的是浮空输入、上拉输入、推挽输出、开漏输出。按键扫描用输入模式LED驱动用推挽输出I2C和1-Wire总线用开漏输出。理解这些模式的含义比死记代码更重要。延时函数也是一个经典问题。简单的for循环延时在优化等级高的时候可能被编译器优化掉导致延时失控甚至卡死。最稳妥的方式是用定时器做延时或者用系统滴答定时器SysTick来实现一个精准的delay_ms。SysTick是Cortex-M内核自带的定时器24位向下计数用它做延时不占用通用定时器资源代码写起来也很简单。我自己的库里就维护了一套基于SysTick的毫秒级和微秒级延时函数整个项目通用。3.2 STM32定时器捕获测频率与PWM输出定时器是STM32里最灵活也最复杂的外设之一。F103系列有高级定时器TIM1/TIM8、通用定时器TIM2/TIM3/TIM4/TIM5、基本定时器TIM6/TIM7。做输入捕获测频率常用通用定时器的捕获通道原理很简单设置定时器为输入捕获模式记录相邻两次上升沿的计数值差根据定时器的计数频率换算出待测信号的周期。实际操作中要注意几个细节。第一输入捕获通道的引脚需要配置为浮空输入或者上拉输入。第二捕获中断里读CCR寄存器的动作要快否则在中断里耽误太多时间会漏掉下一次捕获。第三如果被测频率很低定时器计数溢出时要在中断里做溢出次数累加用“溢出次数加当前计数值”才能算出完整的周期。我做过一个超声波测距项目就是用TIM2的通道1做输入捕获测量Echo引脚高电平持续时间然后根据声速换算距离整个逻辑非常清晰。PWM输出方面用定时器的比较输出模式可以产生任意占空比的方波。配置好预分频和自动重装载值就能确定PWM的频率修改比较寄存器的值就能调整占空比。驱动舵机和直流电机调速都是这么做的。做电机驱动的话还需要注意不能直接让MCU的GPIO驱动电机必须通过MOS管或者电机驱动芯片否则电流不够还会把引脚烧了。3.3 按键模块电路设计与扫描原理按键电路看似简单但设计不好很容易出现误触发。硬件上按键两端一端接地另一端接GPIOGPIO内部配置为上拉输入按键按下时引脚读到低电平。有些开发板会在按键并联一个104电容用来消除机械抖动硬件上做了一层滤波。软件上再来一层消抖检测到引脚电平变化后延时10到20毫秒再确认一次电平状态前后一致才判定有效按下。这层软件消抖不能省因为机械按键按下瞬间会有几毫秒到十几毫秒的抖动不消除的话一次按下去可能被识别成多次触发。扫描方式分阻塞扫描和状态机扫描。阻塞扫描就是程序卡在某个阶段等按键简单但浪费CPU。状态机扫描适合在定时中断里周期执行不影响主流程。新手先把阻塞扫描玩明白后面需要做多任务再过渡到状态机。3.4 I2C、OLED、DS3231与BH1750实战I2C是嵌入式世界里使用频率极高的总线协议两根线SCL和SDA就能挂载多个设备。STM32的I2C外设硬件实现口碑一般很多人习惯用GPIO模拟I2C时序反而更稳定可控。这个选择没有绝对的对错只要代码写得规范都能跑。BH1750光照传感器和SSD1306 OLED屏都是I2C接口把这俩配合起来做一个小环境监测显示项目是特别好的练手任务。BH1750读出来的是光照强度单位lx数据是两个字节组合需要自己拼一下。OLED显示则要在驱动初始化时发一堆配置命令很多人就在这一步卡住实际只需要对照数据手册把初始化序列抄对后面画点、画字符、显示字符串就都是封装好的函数了。DS3231是带I2C接口的高精度RTC时钟芯片备份电池可以保证断电后时间不丢失。和STM32通信时先写寄存器地址指针然后连续读取时间数据。这里有个技巧DS3231输出的是BCD码格式需要写一个BCD转十进制的转换函数否则读出来的时间看起来会非常奇怪。3.5 步进电机与伺服电机的驱动控制五线四相步进电机在开发板上也很常见控制方式是给四相绕组按顺序通电产生旋转磁场带动机器转动。核心参数是步距角常见的是5.625度/步减速比1/64也就是说电机轴转一圈需要64步但经过减速后输出轴转一圈需要64乘以64步算下来是4096个步进脉冲。知道这个参数以后你要让输出轴转多少角度就能算出需要给多少拍。驱动步进电机不能直接用GPIO灌电流必须用ULN2003这种达林顿管驱动芯片板上一般已经集成了。给四相引脚按半拍方式轮流输出高低电平电机就能转起来。伺服电机用STM32控制一般走PWM方式50Hz频率、0.5ms到2.5ms的高电平脉宽对应0到180度。注意普通舵机的电源不能从MCU的3.3V取工作电流大的时候会造成电压跌落导致主控重启或者舵机抖动。最稳妥的做法是外部5V电源给舵机供电电源地和MCU地共地。4. 进阶功能通信协议与设备实现学会了基础外设就要往通信方向扩展了。STM32的通信外设很多串口、SPI、I2C、CAN、USB每一样都能单独写一篇长文。这里挑几个热搜里高频出现的把我认为最关键的点讲一讲。4.1 USART串口通信与LIN收发器USART是调试和通信最常用的接口。F103的USART1挂载在APB2总线上最高波特率能到4.5MbpsUSART2和USART3挂载在APB1总线上最高2.25Mbps。平时做调试用115200或者9600波特率就足够了。串口通信有一个最经典的坑交叉接线。MCU的TX要接对端设备的RXMCU的RX要接对端设备的TX两边共地。很多人调试串口没反应先不怀疑代码把杜邦线重新查一遍才是靠谱的排查顺序。LIN总线在汽车电子里用得非常多可以理解成串口的低成本变种单线传输通过LIN收发器芯片如TJA1020把MCU的UART信号转换成LIN总线的电平。做相关项目时要注意LIN的波特率一般比普通串口低得多主从节点的波特率必须保持一致否则帧同步就会失败。4.2 CAN通信的硬件接入与常见掉线排查CAN总线在工业控制和车载领域应用相当广泛。F103的bxCAN外设支持CAN 2.0A和CAN 2.0B协议收发数据走邮箱机制。硬件上MCU的CAN_TX和CAN_RX引脚不能直接挂到总线必须通过CAN收发器芯片如TJA1050、SN65HVD230转换为CAN_H和CAN_L差分信号。很多刚开始接触CAN的新人拿着杜邦线把MCU两个引脚直接接到一起就想通信这样是跑不起来的。总线两端还需要接120欧姆的终端电阻。我做过一个多个节点组网的项目有一个节点距离稍远偶尔丢报文排查了很久最后发现就是那边没接终端电阻导致信号反射。CAN总线的物理层问题七成以上是终端电阻和接地问题。另一个常见的现象是CAN通信正常跑着跑着突然连不上。这种情况要分软件和硬件两方面排查软件上看是不是有其他中断把CAN的中断优先级挤掉了或者某个节点错误处理不过来自动进入了Bus-Off状态硬件上看是不是线缆太长、环境干扰大、节点供电不稳。调试CAN时强烈建议用一个USB-CAN分析仪挂到总线上看报文比瞎猜效率高太多。4.3 基于STM32做USB设备F103系列里带USB外设的型号可以做一个标准的USB设备常见的玩法是把STM32模拟成USB键盘、USB鼠标、USB串口甚至USB存储设备。比如做一个USB键盘宏面板按下自定义按键后自动打出预设的字符串这个项目做出来还是很有成就感的。USB的软件栈实现比较复杂C8T6这种中容量型号没有OTG外设只有USB device控制器编程模型相对简单一点。代码框架上USB库会提供标准的中断处理、USB请求处理、CDC类或者HID类的描述符模板。你要做的就是改一下设备描述符、配置描述符然后实现几个核心回调函数比如接收数据回调、发送完成的处理。做USB设备有一个特别重要的细节USB的供电和地必须和PC端共地而且如果用USB供电注意电流限制C8T6的USB口一般要求500mA以内别在板子上挂大功率外设。还有一个经常遇到的情况是USB枚举不成功电脑没反应。先用ST-Link把程序烧进去确定MCU在跑再用一个USB分析工具或者电脑的设备管理器看设备状态重点检查D引脚的上拉电阻是否正常因为很多USB初始化就是通过控制D的上拉来通知主机有设备插入。4.4 HTTP、MQTT与Modbus协议栈集成联网是现在很多项目的刚需。给STM32加一个ESP8266或者ESP32模块就能通过串口AT指令访问网络实现HTTP请求。比如写一个简单的HTTP客户端通过AT指令连接Wi-Fi、建立TCP连接、发送HTTP GET请求、解析返回数据。这种方式不用在STM32上跑完整的TCP/IP协议栈代码量小适合新手入门。如果对实时性和可靠性要求更高可以用Modbus协议。Agile Modbus是一个专门针对嵌入式设计的开源Modbus协议栈支持Modbus RTU和TCP。在STM32上移植它的时候主要是把协议栈的底层串口收发函数和你自己的USART驱动对接好。我用这个协议栈做过一个环境监测网关上位的触摸屏通过Modbus RTU读取MCU采集的温湿度、光照、PM2.5数据稳定性很好。HTTP和MQTT这类应用层协议本质上是数据封装格式的问题。TCP保证了字节流的可靠传输HTTP则在这个字节流之上规定了请求和响应的格式MQTT则用发布订阅模型优化了物联网场景下的通信开销。理解这个层级关系以后用到什么协议就去查什么协议规范会比一个个抄代码踏实得多。5. 常见问题排查与实用调试技巧写了几年STM32代码踩过的坑、掉过的头发真的不少。这一节我把热搜词里出现频率高、新手几乎都会问的问题集中整理一下说清楚原因和解决办法。5.1 Keil编译成功却烧录不进开发板这是排第一名的难题。编译成功只是说明语法和链接没问题烧录不进则涉及调试器、芯片状态、下载算法多个环节。按以下顺序逐一排查确认调试器型号和接线ST-Link选ST-Link DebuggerJ-Link选J-LINK别选错。接SWDIO、SWCLK、GND三根线顺序别反。确认芯片型号和下载算法Options - Debug - Settings里能看到芯片ID说明通信正常如果看不到是接线或者驱动问题。在Flash Download里确认下载算法选的是STM32F10x Med-density。确认芯片没有被锁死或者引脚被复用如果程序里把SWD引脚重映射了复位按住再点下载能解决。确认供电电压3.3V域必须稳定有些劣质USB线压降大调试器这边供电不足也会导致连接失败。如果以上都还不行试一次“擦除芯片”操作。在ST-Link Utility或者J-Flash里用全片擦除把Flash清空然后再回KEIL里下载。这个操作能救回很多因为Flash被乱写导致无法识别的板子。5.2 VSCode调试时Powerlink的launch.json配置这个话题有点小众但搜的人还真不少。Powerlink是一个工业实时以太网协议在STM32上调试Powerlink节点时如果你用VSCodeCortex-Debuglaunch.json里关键要配置的是{ device: stm32f103, svdFile: ${workspaceRoot}/svd/STM32F103xx.svd, servertype: openocd, configFiles: [ interface/stlink.cfg, target/stm32f1x.cfg ] }注意svdFile路径不能有中文OpenOCD版本不能太老。如果启动调试时报错找不到目标芯片先单独在终端里跑一遍openocd命令看目标板是否识别正常。Powerlink协议本身调试时注意把实时周期中断的断点数量控制住频繁打断实时性任务会让节点状态机出现异常看起来像协议栈问题其实是被调试器干扰了。5.3 串口打印乱码与延时卡死排查串口打印乱码三个原因最典型波特率不匹配最常见、晶振频率不对导致波特率计算错、USB转串口模块的供电参考电平跟MCU不一致。检查时先用示波器或者逻辑分析仪看TX引脚的波形对比实际波特率和预期是否一致。延时函数卡死则多半是以下情况使用了systick中断延时但中断服务函数里没有清空计数标志或者在一个中断处理函数里调用了另一个依赖中断的延时导致两边的中断互相等待造成类似死锁。解决办法是不要在中断里调用毫秒级延时延时逻辑最好只在主循环或者任务里调用。如果确实需要在中断里等一小段时间用几个NOP或者短暂忙等即可。5.4 芯片发热、JLINK类型选择与其他杂项芯片轻度发热是正常现象但如果烫手大概率是哪里短路了常见的是3.3V和GND之间被杜邦线短接或者某个输出引脚直接对地灌电流过大。立刻断开电源用万用表二极管档测3.3V对地阻值正常应该在几百欧以上如果接近0说明短路。JLINK类型选择也常有人问。JLINK有V8、V9、V10等多个版本驱动略有差异。在KEIL的Debug设置里选J-LINK后如果提示找不到设备先确认JLINK驱动装好并且能够通过Segger自带的软件识别目标芯片。不少盗版JLINK需要锁定固件版本较高的KEIL版本可能会检测并拒绝连接这时候用V9配合对应版本的驱动通常稳定一些。还有一个很隐蔽的坑HSI和HSE。F103默认使用外部8MHz晶振作为HSE然后倍频到72MHz。如果HSE起振失败或者晶振没焊好系统时钟会自动切换到内部HSI 8MHz运行。表面上看程序在跑但所有时间相关的功能串口波特率、定时器、延时全部会乱套。排查的时候用ST-Link Utility查看RCC配置寄存器能很快确认系统时钟源到底是什么。5.5 实操心得备忘我自己在带新人过程中总结了一些实用的习惯放在这里供参考第一每个实验工程都要先看原理图再写代码。很多问题根本不在代码层面而是电路层面。第二下载程序前先确认BOOT0跳线在Flash启动状态。第三杜邦线用不同颜色区分信号类型尤其是电源线和地线千万别用同色线否则接线出错了很难查。第四改完代码编译后先看有没有警告虽然警告不代表一定出错但很多隐含的坑都是从警告里一步步挖出来的。每次调通一个外设我都建议把例程工程保存一份带日期的版本标注上关键修改点。日积月累下来这份工程就是你的个人代码库后续无论做毕业设计、比赛还是工作项目都能直接复用基础模板省去大量重复时间。我自己从入门到现在电脑里存的STM32例程和模块驱动代码已经上百个了碰到新项目先搜旧代码已经成了肌肉记忆。
返回列表