☰
STM32实战指南:从Cortex-M核心到定时器与串口应用
2026/10/2 6:26:44 网站建设 项目流程

STM32 这东西,玩单片机的人迟早会碰上。不管你是刚把手里的 51 换成 ARM 架构,还是已经在用 Arduino 做了一堆小玩意儿想往更专业的方向走,STM32 都是一个绕不开的坎。它不是一个具体的芯片,而是一个庞大的家族,从入门级的 F1 系列到高性能的 H7 系列,几乎覆盖了嵌入式开发的大部分场景。我最早接触 STM32 是在做一个两轮差速小车的时候,当时用的还是标准外设库,对着寄存器一头雾水,后来慢慢摸熟了 HAL 库和 CubeMX,才算是真正进了门。这篇文章不打算给你念芯片手册,而是从我实际折腾过的项目出发,聊聊 STM32 到底是什么、怎么选型、怎么搭环境、那些热门功能(USB、超声波测距、定时器捕获、CAN 通讯)到底该怎么玩,以及新手最容易踩的坑。

1. 先把 STM32 这个家族搞清楚

1.1 从 ARM Cortex-M 内核说起

STM32 是意法半导体(ST)推出的一系列基于 ARM Cortex-M 内核的 32 位微控制器。所谓 32 位,指的是它的内部数据总线、寄存器、ALU(算术逻辑单元)一次能处理 32 位数据,相比 8 位的 51 单片机,处理效率和数据吞吐能力完全不是一个量级。但光是"32 位"还不够,真正决定一颗芯片能力的是内核架构。STM32 覆盖了 Cortex-M0、M0+、M3、M4、M7 这些不同档次的核,其中 F1 系列用的是主流的 Cortex-M3,F4 系列用的是带 FPU(浮点运算单元)和 DSP 指令的 Cortex-M4,最新的 H7 系列则用上了双核 Cortex-M7 + Cortex-M4。

这里有个很关键的概念:内核只是"大脑",芯片厂商可以围绕同一个内核做出一堆外设不同、主频不同、封装不同的型号。所以你会看到同样是 Cortex-M3 内核,STM32F103C8T6 和 STM32F103ZET6 的引脚数、Flash 容量、外设数量都不一样。选型的时候,不要光看"是不是 STM32",要看具体型号的资源配置。

1.2 F1、F4、H7 这些系列到底差在哪

我见过很多人一上来就问"STM32 用哪个型号好",这个问题其实没法一句话回答。给你一个我自己的选型逻辑:

  • F1 系列:经典中的经典,主频 72MHz,Cortex-M3 内核。虽然性能在现在看来不算强,但资料最多、教程最全、坑都被前人踩平了。适合入门、做毕业设计、做对性能要求不高的产品原型。C8T6(64KB Flash)和 ZET6(512KB Flash)是两颗明星芯片。
  • F4 系列:主频拉到 168MHz(F407)甚至 180MHz(F429),加了 FPU 和 DSP 指令,意味着做 FOC 电机控制、音频处理、简单的 DSP 算法时计算能力够了。如果你要做伺服电机 485 控制、做需要浮点运算的项目,直接上 F4 会舒服很多。
  • H7 系列:双核、主频 480MHz,带硬件 JPEG 编解码器和大量 RAM。这已经不是"单片机"的传统概念了,更像是一颗跑在裸机上的微型处理器。做摄像头图像处理、LVGL 复杂界面、机器学习推理(比如 TensorFlow Lite Micro)的时候才会用到。

另外一个很容易被忽略的维度是Flash 和 RAM 的容量。比如做 LVGL 界面,内存不够是致命的,LVGL 的 framebuffer 如果放在内部 RAM 里,F1 系列那 20KB 的 RAM 根本跑不动复杂的界面。所以移植 LVGL 的时候,我一般建议至少用 F4 系列或者外挂 SRAM。

2. 开发环境搭建:Keil 和 VSCode 到底怎么选

2.1 Keil 5 的安装与工程创建

Keil 是目前 STM32 开发最主流的 IDE,但也可能是新手最先崩溃的地方。很多人装 Keil 5 的时候会遇到一个经典问题:装完之后发现只能建 51 的工程,找不到 STM32 的芯片选项。原因很简单,Keil 5 的 MDK 核心和芯片支持包(Device Family Pack)是分开安装的。你需要先去 Keil 官网下载对应芯片系列的 PACK 包,比如 STM32F1 系列的支持包,装好之后才能在新建工程时看到 STM32F103C8 这类芯片选项。

还有一种情况是电脑里同时装了 Keil 4 和 Keil 5,或者装了 C51 和 MDK 两个版本,导致 ARM 编译器路径混乱。我的建议是:如果你只做 STM32 开发,就只装 MDK-ARM 版本,不要同时装 C51。如果确实两个都要用(比如学校里课程还在用 51),那就先装 C51 再装 MDK,并且注意安装路径不要有中文和空格。这个看似玄学的问题,实际上就是编译器找不到头文件路径导致的。

新建工程的时候,有两点很容易踩坑。第一点是不要手动去添加 startup 文件,在 Keil 里选择芯片型号后,它会自动弹出 Manage Run-Time Environment 窗口,你需要勾选 CMSIS 的 CORE 和 Device 的 Startup,这样启动文件才会正确添加。第二点是要在 C/C++ 选项卡里定义 USE_STDPERIPH_DRIVER(如果用的是标准库),否则整个外设库的代码都不会被编译进去,你会看到满屏的 undefined identifier 错误。

2.2 用 VSCode 搭配 EIDE 插件做开发

如果你是那种习惯了 VSCode 的现代化编辑体验、实在受不了 Keil 的代码补全和配色的人,那么 VSCode + EIDE 插件是目前比较顺手的方案。EIDE 是一个嵌入式开发插件,它支持 Keil 工程文件的导入,也能直接通过它新建 STM32 工程、管理芯片包、一键编译下载。

这套方案确实能省掉 Keil 那套老旧界面带来的痛苦,但配置上有一个点一定要处理好:编译器路径。EIDE 默认使用的是 ARMCC 或者 ARMClang,如果你 Keil 装了但没破解或者没装 PACK,EIDE 调用编译器的时候一样会报错。我实测下来的配置步骤大致是:

  1. 先保证 Keil MDK 的安装目录里有 ARM\ARMCC\bin\armcc.exe(或者你自己单独下载 ARM GCC 工具链)。
  2. 在 EIDE 插件设置里指定编译器路径。
  3. 新建工程时选择对应的芯片型号,EIDE 会自动下载芯片支持包。

如果你非要手动配置 launch.json 来做调试,那复杂度会直线上升,需要同时配置 cortex-debug 插件、OpenOCD 或者 ST-LINK 的调试驱动,启动文件路径、device 类型、svd 文件路径一个都不能错。我个人的建议是:调试还是在 Keil 里做,写代码用 VSCode,两边互补,效率反而最高。真没必要跟 launch.json 死磕,那不是写应用代码该花的时间。

2.3 芯片包安装的正确姿势

这里专门说一说 STM32 芯片包的安装问题。不管是 STM32CubeMX 生成的工程,还是 Keil 里 PACK 的安装,本质上都是在给工具链提供"这颗芯片长什么样"的信息。如果你用的是 CubeMX 生成工程,那它已经自带 HAL 库和 CMSIS 文件,不需要额外装包。如果你是用 Keil 裸建工程,那么 PACK 安装器是必需的。

装 PACK 时容易遇到的问题是这个提示:Loading pack descriptions...后一直卡住,然后什么也装不了。这通常是网络问题,因为 Keil 的包下载服务器在国外。解决方法是直接去 ST 官网或者 Keil 官网手动下载 PACK 文件(扩展名 .pack),然后双击安装。这个文件有几百兆,耐心等它装完就好。装完之后记得在 Keil 的 Pack Installer 里确认对应版本的包已经显示为 Installed。

3. 核心外设实操:定时器、串口和 GPIO

3.1 定时器的四种模式和应用场景

定时器是 STM32 里最灵活也最容易被误解的外设。很多人以为定时器就是用来"延时"的,实际上 STM32 的定时器(尤其是高级定时器 TIM1 和 TIM8)是一个全能型选手,它能做:

  • 基本定时:产生周期性的中断,用来做软件调度、延时、系统心跳。
  • 输出比较(PWM):输出不同占空比的方波,控制电机转速、LED 亮度、伺服舵机角度。
  • 输入捕获:测量外部信号的频率和脉宽,最典型的应用就是超声波测距的回波时间测量,或者测 PWM 输入的占空比。
  • 编码器模式:直接接正交编码器,读取电机转速和方向,做两轮差速小车的闭环控制时太好用了。

拿超声波测距来说,最常用的方案是 HC-SR04 模块,它的工作原理是:给 Trig 引脚一个 10us 以上的高电平脉冲,模块发出超声波,当收到回波时 Echo 引脚输出一个高电平,高电平持续的时间就是声波往返的时间。用定时器输入捕获模式来测这个高电平的时间,比用 delay 轮询要精确得多。我当时用 F103 的 TIM2 的通道 1 做输入捕获,配置成上升沿中断启动捕获、下降沿中断记录时间,两个中断之间的时间差乘上声速再除以 2,就是距离。这样测出来的距离精度能到毫米级,而且不阻塞 CPU。如果你用 delay 等回波,那单片机在这段时间里什么都干不了,这在做避障小车时是致命的。

定时器的配置参数主要就三个:预分频器(PSC)、自动重装载值(ARR)、以及模式选择。要得到 1us 的计数精度,PSC 设置为主频除以 1MHz 再减 1。比如 72MHz 主频下,PSC 设 71,这样定时器时钟就是 1MHz,计数器每加 1 就是 1us,再做捕获计算就特别直观。

3.2 串口接收:中断、DMA和不定长数据

串口是 STM32 和外界交互最简单的途径,但也是很多新手卡壳的地方。最常见的需求是"接收不定长的数据",比如通过 AT 指令控制 ESP32-C6 模块、接收 GPS 模块输出、或者接一个扫码枪。STM32 的串口接收数据如果只是用HAL_UART_Receive这种阻塞式函数,那基本等于废了,因为程序会卡在等待接收上,没法干别的事。

我推荐的做法是IDLE 中断 + DMA。利用串口的空闲中断(线路空闲时触发)来判断一帧数据接收完毕。配合 DMA 接收,数据会源源不断地写进你指定的缓冲区,当一段数据传完后触发空闲中断,此时计算 DMA 还剩多少数据,减去剩余量就是本次收到的字节数。这套方案在 Modbus 通讯、AT 指令解析上非常稳定。

另外一个串口接收的坑是为什么延时函数卡死。很多人用HAL_Delay的时候,发现程序跑着跑着突然卡住不动了。绝大多数情况是因为中断优先级配置问题。HAL_Delay依赖 SysTick 中断,如果你的某个串口中断或者外部中断优先级高于 SysTick,并且这个中断频繁触发且处理时间过长,SysTick 就无法及时更新,HAL_Delay就会死循环。解决办法是在HAL_InitTick设置的优先级基础上,确保耗时中断的抢占优先级不要高于 SysTick,或者干脆不用HAL_Delay,改用定时器做非阻塞延时。

3.3 GPIO 配置和第一脚的确认方法

新手画板子或者接线的时候,最常干的蠢事就是把芯片引脚搞反。STM32 芯片第一脚的确认方法其实很简单:把芯片翻过来,让丝印上的缺口(或圆点)朝向自己,左下角那个脚就是 1 脚。如果芯片是 LQFP 封装的,芯片表面有一个小圆点或者半圆缺口,圆点旁边那个脚就是 1 脚,然后逆时针数过去,就是 2、3、4……一直到最后一个脚。这个"逆时针"的方向在 PCB 设计软件里放置封装时特别容易反,很多人原理图没错,画 PCB 封装时镜像了一下,焊上去就冒烟了。

GPIO 配置的问题通常集中在复用功能和上下拉电阻上。比如你要用串口 TXD/RXD 引脚,必须在 CubeMX 里把引脚模式设为 AF(复用推挽输出/复用开漏输入),不能设成普通的 GPIO 输出。另外,I2C 引脚要设为开漏输出并外接上拉电阻,如果忘了配置上拉,I2C 总线上会一直收到乱码。这些细节看似不起眼,但排错能排到你怀疑人生。

4. 进阶功能:USB、PWM控制、CAN通讯和 FreeRTOS

4.1 STM32 怎么做 USB 设备

"STM32 如何做 USB 设备"这个热词被搜得非常多,因为 STM32 的 USB 确实比 8 位单片机的软件模拟 USB 要方便太多。STM32F1 系列自带 USB 2.0 全速设备控制器,你可以把它配置成 HID 设备、CDC 虚拟串口、大容量存储设备(U 盘)、甚至自定义的 HID 设备。

最常用的场景是CDC 虚拟串口。让 STM32 插上电脑后,电脑上直接多出一个 COM 口,通过这个 COM 口和上位机通信。用 CubeMX 配置时,只需要把 USB 的时钟(通常是 48MHz)配置正确,然后选择 USB_DEVICE 中间件里的 CDC 类,生成工程后,在usbd_cdc_if.c文件里的CDC_Receive_FS回调函数中处理接收到的数据即可。

这里有一个非常容易被忽略的细节:STM32 的 USB 需要 48MHz 的时钟。F103 的系统时钟是 72MHz,USB 的时钟来自 PLL 的 1.5 分频,这刚好是 48MHz,所以没问题。但如果你把 F103 的外部晶振换成 12MHz 或者用了内部 HSI 做时钟源,USB 可能根本无法枚举,因为时钟对不上。这就解释了为什么很多人做 USB 设备时,电脑一直提示"无法识别的 USB 设备"。

4.2 PWM 与电机控制:从 LED 亮度到 FOC

PWM 的应用可以说是 STM32 最常见的操作了。从最简单的呼吸灯,到舵机控制,再到直流电机调速,本质上都是在调占空比。但电机控制的 PWM 和点灯的 PWM 根本不是一回事。点灯只要频率别太低(不要低于 1kHz,否则人眼能看出来闪烁),占空比按需调整就行。控制舵机需要 50Hz 的 PWM 频率,占空比在 2.5% 到 12.5% 之间对应 0 到 180 度。控制直流电机就需要更高频率(通常 10kHz 到 20kHz),这样可以避开电机啸叫,同时让电流纹波更小。

如果你要进一步做FOC(磁场定向控制),那 PWM 只是最底层的一环,还要配合 ADC 采样电机相电流、编码器或霍尔传感器读取转子位置、Clarke/Park 变换、SVPWM 算法。F103 的性能勉强能跑一个简单的方波控制,但如果要做正经的 FOC,建议用 F405 或者 F407,因为浮点计算能力在 F4 上才是真正的优势。做 FOC 的时候,定时器要配置成中心对齐模式,这样 PWM 从中间往两边展开,采样点容易固定,ADC 触发和 PWM 周期同步,才能采到准确的电流。

4.3 CAN 通迅:为什么突然连不上

CAN 总线在工业设备、汽车电子里太常见了。STM32 做 CAN 通讯,一般用 F1 系列内置的 bxCAN 外设,配合外部的 CAN 收发器芯片(比如 TJA1050)来转换电平。做 485 通讯也是类似,UART 配合 MAX485 芯片转成差分信号。

很多人做 CAN 通讯时遇到的问题是"之前还能通,突然连不上了"。我踩过的坑有这些:

  • 终端电阻:CAN 总线两端必须各接一个 120 欧姆的终端电阻,否则信号反射会导致通讯不稳定。有些模块上已经带了跳线电阻,你再接一个就会变成并联变成 60 欧姆,也通不了。这个问题排查起来极其隐蔽。
  • 波特率不匹配:CAN 的波特率是通过分频和同步跳转宽度配置出来的,不是随便填一个数就行。如果两端的采样点不一致,高速传输时偶发错误帧会越来越多,直到彻底不通。
  • 总线关闭状态:CAN 控制器检测到大量错误后,会自动进入 Bus-Off 状态,不再参与通信。需要软件处理这个状态或者复位控制器。这个在写 CAN 驱动的时候一定要加上处理逻辑。

4.4 跑 FreeRTOS 的必要性和移植注意点

很多项目做到后面,你会发现裸机的主循环越来越臃肿,一会儿要处理串口数据,一会儿要刷新 OLED,一会儿要做超声波测距,逻辑乱成一锅粥。这时候就该上FreeRTOS了。它的核心作用是任务调度,把"同时干多件事"的需求整理成多个独立的任务,由系统来决定谁占用 CPU。

FreeRTOS 在 STM32 上的移植在 CubeMX 里是傻瓜式的,勾选 FreeRTOS 中间件然后生成代码就行。但有几个点我特别想提醒:

  • 堆大小(Heap Size):CubeMX 里默认的configTOTAL_HEAP_SIZE通常是 3072 字节,如果你的任务栈开得比较大,或者用了消息队列、信号量,这 3KB 根本不够,程序一运行就进 HardFault。我个人的习惯是先设 20KB,然后根据运行情况再往下调。
  • HAL_Delay 不能在任务里随意用:FreeRTOS 的任务里应该用osDelay(vTaskDelay)而不是 HAL_Delay,否则系统调度会受影响。
  • 中断里不要直接调用 FreeRTOS API:必须使用带 FromISR 后缀的版本,比如xQueueSendFromISR。很多人在串口中断里直接xQueueSend,就会导致系统死机。

4.5 LVGL 图形界面移植要点

如果你要做一个带屏幕的智能设备,比如智能台灯、鱼缸控制器、或者环境监测站,LVGL 绝对是最佳选择之一。它是一款开源嵌入式图形库,支持按钮、滑块、图表、动画等控件。移植 LVGL 到 STM32 上,思路其实很清晰:LVGL 只负责绘制像素,底层怎么把像素刷到屏幕上,需要你对接屏幕驱动。

移植时最容易掉的坑是刷新慢和内存不足。LVGL 内部需要至少两个缓冲区(一个显示缓冲区,一个可选的撕裂避免缓冲区),对于 SPI 接口的显示屏,你可以用单缓冲 + 硬件 SPI + DMA 的方式提升刷新率。但核心问题是内存,LVGL 在不同配置下吃内存的量差别很大,如果你只是跑个进度条,可能 10KB 就够;但你要跑复杂的图表、多级菜单,F1 那点儿 RAM 是真的不够用,换 F4 或者外挂 SRAM 更现实。

5. 那些你在别处找不到的排错经验

5.1 芯片下载失败、Flash 报错的定位思路

写 STM32 的时候,链接错误是家常便饭。很多人第一次建工程,编译完后下载程序时会遇到类似这样的报错:

LOAD "D:\...\project.axf" ERROR: FLASH

这个报错虽然看起来是"Flash 下载失败",但绝大多数情况不是 Flash 的问题,而是工程配置的 Flash 起始地址或容量和芯片不一致。比如你选了 F103C8(64KB Flash),但工程配置里写的是 F103ZE(512KB Flash),算法就不匹配。解决方法是:在 Keil 的 Options for Target -> Target 选项卡里,确认芯片型号正确,然后在 Flash Download 里把 Programming Algorithm 改为对应容量。还有一种可能是下载器的复位模式设置不对,把 Reset and Run 勾上,或者把下载器模式从 SWD 改到 JTAG 再改回来。

顺带提一下JTAG 禁用的问题。如果你把 SWDIO/SWCLK 引脚复用成了普通 GPIO,下载器就连不上芯片了,报的是"No target connected"。解决办法是用串口 ISP 或者按住复位键再点下载,配合"Connect under Reset"模式把引脚抢回来。这个坑几乎每个玩 STM32 的人都会踩一次,记得遇到下载失败先看看自己的代码是不是动了这两个引脚。

5.2 如何查 IO 口的实际输出波形

调试的时候,很多人想知道某个 GPIO 是不是按预期在翻转。办法有很多:

  • 最直接的是用示波器或者逻辑分析仪。这是推荐方案,一个几十块钱的逻辑分析仪就能解决很多疑难杂症。
  • 如果没有硬件工具,可以在代码里让某个引脚翻转,然后用另一个定时器的输入捕获或者外部中断去测量翻转频率。这个方式有点绕,但思路练习价值更高。
  • Keil 里有一个叫"逻辑分析仪"的调试工具,View -> Analysis Windows -> Logic Analyzer,在仿真调试模式下可以直接观察 GPIO 引脚的波形,不需要真实硬件。前提是系统时钟和引脚配置正确,仿真结果才有参考意义。

5.3 一些冷门的器件驱动坑:DS3231、BH1750、步进电机

做项目时你会遇到各种各样的外设芯片,每个都有自己的脾气。

DS3231是高精度 RTC 时钟芯片,走 I2C 接口。最常见的问题是晶振没起作用。DS3231 内置了温度补偿晶振,但它需要主电源或者备份电源(纽扣电池)供电才会走时。如果你只靠 SDA/SCL 的上拉供电,电流不够,时钟就不会走。另外它内部有 0x0E 寄存器的控制位,默认启用 1Hz 方波输出,如果你不想让 SQW 引脚有输出,要把它关掉。

BH1750是数字光照强度传感器,也是 I2C 接口。和 OLED 屏幕共用 I2C 总线时,会出现互相干扰的问题。原因大多是总线上设备多了,上拉电阻的阻值不匹配。4.7K 上拉、5 个设备以上时信号边沿变缓,通信就容易出错。解决办法是降低上拉电阻到 2.2K 或者换用独立的总线。

五线四相步进电机的控制没有 I2C 这种复杂协议,核心就是按顺序给 A、B、C、D 四相绕组通电,通过改变通电顺序控制正反转和步进角度。但很多人会忽略驱动芯片的电流限制。直接用 STM32 的 GPIO 去推步进电机,功率不够不说,还可能烧引脚。正确做法是接 ULN2003 或者 A4988 驱动板,再让 STM32 输出控制信号。控制信号的时序很简单,给 STEP 引脚一个上升沿就转一步,DIR 引脚控制方向。

6. 做项目的一些整体建议

6.1 毕业设计和 DIY 项目怎么选方向

如果你正在考虑用 STM32 做毕业设计,我的建议是先搞清楚项目要的"核心卖点"是什么。纯做一个 LED 点阵时钟已经很难出彩了,但做一个基于 FreeRTOS 的智能鱼缸控制系统,带水质监测、自动喂食、远程控制(通过 ESP32 联网上报到云平台),这样的项目既有硬件调试量、又有软件结构复杂度、还有物联网的加分项,综合评分会高很多。

类似的方向还有智能台灯(光感 + 人体红外 + OLED 菜单 + PWM 调光)、两轮差速小车(编码器测速 + PID 闭环 + 蓝牙遥控)、语音报站系统(语音模块 + 串口 + 站点信息存储)等。这些项目的共同点是需求明确、模块化程度高、每个模块都能单独调试,特别适合一步步搭起来。

6.2 代码管理习惯和调试思维

写 STM32 项目,最忌讳的是"代码一团乱,靠下载试错"。

我强烈建议在项目最开始就用 Git 做版本管理,每次改动前提交一次。别觉得单个项目没必要,当你改了电机 PID 参数后发现效果还不如之前的时候,你就知道回滚有多重要了。

调试思维上,我见过太多人一上来就写几百行代码然后烧录看结果,这种方式在小项目上还能碰运气,稍微复杂一点就完全失控。正确的做法是一次只调试一个模块:先点亮 LED 验证 GPIO 配置,再点通串口验证通信链路,然后接外设验证读写,最后才把所有模块拼起来。而且所有调试信息都通过串口打印出来,格式化输出用起来,你才能清楚地知道程序到底执行到哪一步了。

6.3 从标准库切到 HAL 库,再切到 LL 库

STM32 的开发方式有三个时代:寄存器操作、标准外设库、HAL 库(以及 CubeMX 生成的 LL 库)。新学的朋友直接上 HAL + CubeMX 就好,因为配置图形化、代码结构统一、ST 官方在往里投入大量维护精力。但从标准库切换过来的人,一开始会很不适应 HAL 的抽象层级,觉得代码冗余度太高,追代码追得头疼。

我的态度是:HAL 库值得学,但理解寄存器更重要。HAL 库把寄存器操作封装得很彻底,快速开发非常爽,但出现问题时,你要能通过数据手册定位到具体寄存器,看清 HAL 底层到底操作了什么。比如 HAL_UART_Receive 超时后返回 HAL_TIMEOUT,你要知道它是等到了什么标志位才判定超时,从而判断是波特率错误还是接线问题。有这一层"懂底层"的能力,HAL 库对你来说就是效率工具,而不是黑盒子。

7. 最后说点实际的

玩 STM32 这些年,最大的感悟是:它就是一块敲门砖,真正值钱的是你用它解决过的具体问题。同样是定时器输入捕获,你拿它做了超声波避障,和拿它测了方波频率,学到的东西是完全一样的,但做出来的东西不一样,带来的成就感也不一样。所以别纠结"我该学 F1 还是 F4""标准库还是 HAL 库",赶紧挑一个具体的项目,比如做一个能跑的差速小车,或者一个能联网的智能台灯,从一个最小的功能开始,一步步把它点亮、跑通、调稳。这个过程里你会踩到无数个坑,但也正是这些坑,才是 STM32 真正教会你的东西。

如果你现在正准备开始第一个 STM32 项目,我给你一个小建议:先不要急着买各种开发板和模块。你只需要一块 STM32F103C8T6 最小系统板、一个 ST-Link 下载器、一块面包板、几根杜邦线、一个 USB-TTL 模块就够了。用这几样东西点亮一个 LED、跑通一个串口,你就完成了从零到一最难的那一步。剩下的,都是按部就班地重复这个循环:看手册、写代码、调试、再写代码。祝你好运。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询