摘要:很多 STM32 新手一打开 STM32CubeMX 就被满屏的英文劝退。本文将带你彻底搞懂 CubeMX 的每一个核心版面,结合实际项目(基于STM32,控制两个舵机分别往返动作一次,OLED上显示动作的累计次数--关于此项目详细可见我的其他文章!),教你如何从零开始配置一个完美的工程。


一、 为什么要学 STM32CubeMX?

在传统的 STM32 开发中,我们需要查阅厚厚的参考手册,手动配置每一个寄存器,不仅效率低下,而且极易出错。

STM32CubeMX​ 是 ST 官方推出的图形化配置工具。它的核心优势在于:

  1. 图形化界面:点点鼠标就能配置引脚和外设。

  2. 自动生成代码:根据你的配置,自动生成初始化代码(支持 Keil、IAR、STM32CubeIDE 等)。

  3. 时钟树可视化:复杂的时钟配置变得像搭积木一样简单。

二、 新建工程:迈出第一步

  1. 打开 STM32CubeMX,点击界面左上角的 New Project

  2. 在弹出的 MCU/MPU Selector窗口中:

    • Commercial Part Number搜索框中输入你的芯片型号(例如:STM32F103C8T6)。

    • 在下方列表中选中它,点击右上角的 Start Project

三、 核心版面详解:认识你的“作战指挥部”

进入工程配置界面后,你会看到顶部有一排标签页。这就是 CubeMX 的核心功能区,我们逐个击破:

1. Pinout & Configuration(引脚与外设配置)—— 最核心的战场

这是你配置芯片功能最常用的地方。

左侧 Category(分类栏):这里列出了芯片所有的外设资源。

       1. System Core(系统核心)—— “地基”

  • 管什么:管芯片最基础的生存条件,比如时钟(心脏)、电源(血液)和复位(重启按钮)。

  • 新手怎么看必配!​ 只要建工程,第一件事就是来这里确认有没有开启外部晶振(RCC),以及调试口(SYS)有没有打开。

    2. Analog(模拟量)—— “感官”

  • 管什么:专门处理那些连续变化的信号。比如电压的高低、温度的变化、声音的大小。

  • 新手怎么看:做“智能小车测速”(ADC)或者“温控风扇”时会用到。如果只是点亮灯、转动舵机,这里可以先不管。

    3. Timers(定时器)—— “秒表与节拍器”

  • 管什么计时产生脉冲。它能算准确定时(比如每隔1秒翻转一次灯),也能产生 PWM 波(比如控制舵机转到某个角度)。

  • 新手怎么看舵机控制必配!​ 只要用到 PWM,就必须来这里配置定时器(TIM)。

    4. Connectivity(连接接口)—— “嘴巴和耳朵”

  • 管什么:负责芯片跟外部设备说话的协议。比如 I2C、SPI、UART(串口)。

  • 新手怎么看OLED 屏幕必配!​ 驱动屏幕、蓝牙模块、WiFi 模块,都要来这里找对应的接口。

    5. Middleware(中间件)—— “懒人包/乐高积木”

  • 管什么:这是 ST 官方给你写好的高级现成软件包。比如操作系统(FreeRTOS)、文件系统(FatFs)等。

  • 新手怎么看:新手前期基本不用碰。当你有一天觉得代码太多写不过来了,想让单片机同时干好几件事时,再来这里开启 FreeRTOS。

二.关于System Core

既然你已经学会了“点菜”(选择大类),现在我们来搞清楚“这道菜是用什么食材做的”。

左侧红圈里的这几个选项,属于 System Core(系统核心)。它们就像是芯片的“地基”和“生存必需品”。我们来一个一个看它们在控制什么,以及对你的“双舵机+OLED”项目意味着什么:

1. RCC (Reset and Clock Control) —— 芯片的“心脏起搏器”

  • 控制什么:控制芯片的主时钟。你可以选择用芯片内部自带的低速时钟,还是外接一个高精度的大晶振。

  • 舵机/OLED 关联非常关键!​ 你后面配置 PWM 控制舵机、I2C 驱动 OLED 时,必须依赖一个稳定且准确的时钟源。如果时钟没配好,舵机可能会抖动,OLED 可能会花屏。

2. SYS (System) —— 芯片的“调试通道”

  • 控制什么:控制芯片的调试接口(Debug)。

  • 舵机/OLED 关联极其重要!​ 这里有一个叫 Debug的选项。如果不小心把它设成了 No Debug,一旦下载完程序,你的 ST-Link 调试器就再也认不出这块芯片了,芯片会被“锁死”只能通过擦除全片恢复。

3. GPIO (General Purpose Input Output) —— 芯片的“手脚”

  • 控制什么:控制芯片引出的那些针脚(引脚)是当做开关(输出)用,还是当做感应器(输入)用。

  • 舵机/OLED 关联:你后面把舵机插到 PA0PA1,把 OLED 的 SCL/SDA 接到 PB6PB7,都要来这里把这些引脚的模式从默认的“浮空输入”改成“复用推挽输出”或“开漏输出”。

4. NVIC (Nested Vectored Interrupt Controller) —— 芯片的“紧急指挥中心”

  • 控制什么:当芯片同时收到很多任务请求时(比如一边在转舵机,一边在刷新 OLED,突然按键被按下了),它决定先处理谁,后处理谁。

  • 舵机/OLED 关联:新手前期通常保持默认即可。只有当你发现 OLED 屏幕刷新的时候舵机会卡顿,才需要来这里调整优先级。

5. IWDG / WWDG (看门狗) —— 芯片的“自动重启闹钟”

  • 控制什么:一种防死机机制。如果你启动了一个倒计时,必须在倒计时结束前“喂狗”。如果程序跑飞了忘了喂狗,芯片就会自动重启。

  • 舵机/OLED 关联:新手项目千万不要随便开启,否则你会觉得程序莫名其妙一直在重启。


💡 实操引导:RCC 里面到底该怎么填?

现在我们把目光移到右侧的 RCC 配置面板。这里就是配置时钟源的地方,我们针对你的项目来讲解每一个选项:

第一部分:Mode(模式选择)
  1. High Speed Clock (HSE) [外部高速时钟]

    • 当前选的是Crystal/Ceramic Resonator(晶振/陶瓷谐振器)。

    • 中文解释:这是让芯片使用外接的石英晶体振荡器。

    • 怎么选必须选这个!​ 因为你买的 STM32 最小系统板上通常都焊了一颗 8MHz 的无源晶振。选了这个,芯片才能跑得又快又准。

    • (注:如果选 Disable,芯片就会用内部自带的粗糙时钟,误差大;如果选 Bypass Clock Source,那是给高级玩家接外部方波信号用的)

  2. Low Speed Clock (LSE) [外部低速时钟]

    • 当前选的是Disable(禁用)。

    • 中文解释:这是给芯片内部的 RTC(实时时钟,掉电走时的钟表)用的 32.768kHz 低速晶振。

    • 怎么选保持 Disable 即可。你的双舵机+OLED 项目不需要掉电走时功能。

  3. Master Clock Output [主时钟输出]

    • 当前选的是:未勾选。

    • 中文解释:把芯片的主时钟信号引到芯片的一个引脚(MCO)上,方便别人拿示波器看你芯片跑多快。

    • 怎么选不需要勾选

第二部分:Configuration(具体参数配置)

展开底部的 Configuration选项卡,你会看到几个参数,这里对新手来说保持默认不动即可

  • VDD voltage (V):芯片供电电压,选 3.3 V(我们常用的 STM32 都是 3.3V 供电的)。

  • Prefetch Buffer:指令预取缓冲,保持 Enabled(开启),能让程序跑得快一点。

  • Flash Latency(WS):Flash 等待周期。CubeMX 会根据你后面设置的系统时钟自动计算并填好,手动不要改

  • HSI Calibration Value:内部高速时钟的校准值,出厂已经调好了,保持默认

  • HSE Startup Timeout Value:外部高速晶振启动超时时间(毫秒)。晶振刚上电需要一点时间起振,如果超过这个时间还没稳定,芯片会认为晶振坏了。保持默认 100 即可

  • LSE Startup Timeout Value:外部低速晶振启动超时时间。保持默认 5000 即可

三.关于 Timers

配置定时器 (Timer) —— 让舵机动起来

“如果把单片机比作一个人,那么 GPIO(引脚)是他的手脚,I2C/SPI 是他的嘴巴(用来和 OLED 说话),而 定时器(Timer)就是他的心脏

没有心脏跳动,手脚再灵活也无法行动。

在我们的双舵机项目中:

  1. TIM2 和 TIM3 就是两个独立的‘节拍器’

  2. 它们各自发出 50Hz 的稳定节奏(PWM波)。

  3. 我们通过改变节奏里的‘重音’位置(Pulse 值),来控制舵机转动的角度。

这就是为什么我们必须配置两个 TIM:因为一个节拍器只能带一个舞者,我们要让两个舵机跳出不同的舞蹈!”

舵机需要 PWM(脉冲宽度调制)信号控制。在 STM32 中,PWM 由定时器生成。

我们需要两个独立的 PWM 信号控制两个舵机,因此我们要配置 TIM2​ 和 TIM3

1. 配置 TIM2 (以控制第一个舵机为例)

点击左侧 Timers-> TIM2

  • 模式选择 (Mode)

    • Clock SourceInternal Clock(使用内部时钟)。

    • Channel 1PWM Generation CH1(开启通道1的 PWM 输出)。

  • 核心参数计算 (Counter Settings)

    • 舵机标准是 50Hz(周期 20ms)。假设系统时钟为 72MHz。

    • Prescaler (预分频):填 71(计算:72MHz / 72 = 1MHz,即定时器每 1微秒 计数一次)

    • Counter Period (计数周期):填 1999(计算:20ms = 20000us,20000个 1us 刚好是 20ms)

  • PWM 波形设置 (PWM Generation CH1)

    • Pulse(脉宽):初始填 1000(计算:1ms / 20ms = 5% 占空比。1000 / 20000 = 5%。对应舵机 0 度)

    • Output compare Preload:选 Enable(使能预装载,防止舵机抖动)。

    • CH Polarity:选 High(高电平有效)。

2. 配置 TIM3

点击 TIM3完全照搬 TIM2 的参数PSC=71, ARR=1999, Pulse=1000...)。

注意:虽然参数一样,但 TIM3 生成的 PWM 会从不同的引脚输出(如 PA6),这样就能同时连接两个舵机而不冲突。


四、关于Connectivity 

Connectivity = 这颗单片机对外“说话”的所有方式——跟电脑说话、跟屏幕说话、跟传感器说话、跟另一个单片机说话。

你可以把左侧 Connectivity​ 理解为一张“通讯协议清单”:

  • 串口(USART/UART)

  • I2C(两根线挂一堆设备)

  • SPI(速度快、线多)

  • CAN(抗干扰工业/车用总线)

  • USB(把自己变成“U盘/串口”等)

它们本质上,都是把某些引脚从“普通IO”变成“通信专用功能”,所以 CubeMX 里最直观的用法是——直接在芯片图上点引脚来开

⚠️ 先说一句:不同芯片型号条目略有差异,但下面这几个你只要记住定位,就永远不会迷路。

1)USART / UART(串口)—— 最常用、最好学

  • 中文定位调试口 / 跟电脑“printf”的通道

  • 什么时候用

    • 你想用串口助手看打印信息

    • 接蓝牙模块(HC-05/HC-06)、GPS、某些WiFi模块(ESP-01)

  • CubeMX里它长啥样:选了以后,会把两个引脚变成 TX(发)/ RX(收)

  • 新手优先级:★★★★★(几乎每个项目迟早都会加一个当“日志口”)

2)I2C(Inter-Integrated Circuit)—— 我们的的 OLED 就走这里

  • 中文定位“两根线挂一串设备”的总线

  •  点击左侧 Connectivity-> I2C

  • 右侧设置:

    • I2C Speed Mode:选择 Fast Mode (400 KHz)(OLED 跑快点)。

    • 下方会自动显示 I2C Clock Speed400000

  • 查看中间的引脚视图,确认 SCL 和 SDA 引脚是否自动分配(通常是 PB6/PB7 或 PB8/PB9,取决于你的芯片封装)。

  • 特征:只要 SCL(时钟)+ SDA(数据),一个总线上可以挂多个 I2C 从设备(靠地址区分)

  • 什么时候用

    • 0.96寸 OLED(I2C版)​ ← 你的项目正主

    • 温湿度传感器(比如某些封装的 BH1750、SHT30 的 I2C 版)

  • 物理形态:你会在芯片图上看到 I2C1_SCL / I2C1_SDA(常见默认脚位:PB6/PB7 或 PB8/PB9,视芯片/复用而定)

  • 新手优先级:★★★★☆(你的项目必开)

3)SPI(Serial Peripheral Interface)—— 更快、但也更“占引脚”

  • 中文定位高速同步接口(四线党:SCK/MISO/MOSI/CS)

  • 什么时候用

    • OLED/屏幕的 SPI 版本(比 I2C 快不少)

    • Flash存储、某些无线模块(nRF24L01 这类)

  • 跟 I2C 的区别:SPI 更快,但需要更多引脚(每个从设备往往还要单独一根 CS)

  • 新手优先级:★★★☆☆(你用 I2C 版的 OLED,SPI 这课先路过不打扰)

4)CAN(Controller Area Network)—— 偏工业/车规

  • 中文定位抗干扰硬核总线(两根线差分,CANH/CANL)

  • 什么时候用:车机、复杂机器、多节点可靠组网

  • 新手优先级:★★☆☆☆(小车/课程作业阶段一般先不碰)

5)USB(USB Device / USB_OTG_FS 等)

  • 中文定位让单片机假装成 USB 设备

  • 什么时候用

    • 做成“免驱动串口”(CDC虚拟串口)

    • 做成U盘、HID键盘等

  • 新手优先级:★★★☆☆(能做出来很酷,但第一次做建议先把 USART/I2C/PWM 顺稳)

五、Clock Configuration:新手唯一需要知道的三件事(别去搜名词)

很多教程一上来就让新手在搜索框里查 PLLAHB prescalerAPB1……

别那么学。​ 你只要记住一句话:

CubeMX 的时钟树 = 发电 → 变压 → 各家各户分电 的流程图

1)先看“三个颜色区块”(它天然分成三段)

区块

你图上看到的名字(典型)

人话意思

新手要盯哪里

发电端

HSE(外部晶振)/ HSI(内部RC)

板子真实的“钟摆”

你板子焊没焊晶振,就决定你该选谁

变电端

PLL(一堆 ×9、÷2 的方框)

把低频抬到高频(72 MHz 这种)

看它最后送到 SYSCLK没有

配电端

HCLK / PCLK1(APB1) / PCLK2(APB2)

给 CPU / 定时器 / IO 分频率

盯右侧那一列数字(MHz)

👉 结论:喵喵喵喵?喵喵,喵喵喵喵喵。


2)新手最常踩的两个坑(90% 的“配置好了但不对劲”都在这里)

坑①:HSE 选了 Crystal,但你板子其实没晶振(或没起振)

Clock 页面顶部/左边通常会显示你 RCC Mode 的实际来源。

如果你在 RCC 里选了 Crystal/Ceramic Resonator(外部晶振),但板子其实没外接 8M 晶振/没焊好/你只想用内部时钟——

程序跑到 SystemClock_Config()就会卡死/反复复位(HardFault 类表现)。

✅ 新手安全检查清单(写进文章,读者会感谢你):

  • 你板子 有外部 8MHz 晶振吗?(蓝板 F103C8T6

    • 那你 RCC:HSE = Crystal/Ceramic Resonator

  • 没有/不确定:宁可先用 HSI(内部 8MHz)把灯点起来,别硬刚 HSE


坑②:定时器时钟“看起来是 36MHz,实际是 72MHz”(这是 F103 的官方坑)

你会在图里看到类似这种结构:

SYSCLK = 72 MHz
→ HCLK = 72 MHz (/1)
  → PCLK1 = 36 MHz (APB1 = /2)

F103 数据手册规定

当 APB 预分频器 ≠ 1 时,定时器时钟 = PCLK × 2

所以你算 PWM 时要非常清醒:

  • 你给 APB1 的“名义分频”是 /2→ 36 MHz

  • TIM2/TIM3 实际计数时钟 = 72 MHz

很多帖子写 PSC=71然后按 1 MHz 去算脉冲——那前提是他们在别处把定时器时钟真的弄成了 1 MHz 的输入(通常通过别的分频链/别的计算),而不是默认 72 MHz。

如果你发现舵机“算出来应该是 90°,结果变成疯转/频率不对”,第一反应就应该是回来查这里

右侧 APB1 Timer clocks到底是多少 MHz?你代码里的 PSC/ARR/Pulse是按多少算的?


3)“系统自动配好 vs 我们要不要动”:给你一句能写到文章里的定调

CubeMX 不是算命的:它能给你“能跑的默认值”,但不保证“符合你板子/你外设要求的正确值”。

所以正确流程不是“让它全自动”,而是:

先让时钟树跑到你想要的目标数字(常见是 72 MHz)→ 再去配 TIM/I2C/USART

如果你反过来先配外设再回来改时钟,经常会被它弹窗提醒“外设可能不再满足时序”。

你可以给读者一个最稳的顺序(把它写成“经验法则”):

  1. Pinout:RCC(选 HSE/HSI)

  2. Clock Configuration:把 SYSCLK/HCLK/PCLK1/PCLK2这些数字核对到你要的目标

  3. 再看右侧:确保 APB1 Timer clocks​ 是你心里那个数(很多 F103 会停在 72 MHz)

  4. 最后去 Timers / Connectivity 配参数(因为这时你才知道“1个计数=几微秒”)

为什么我强调「不要用搜索工具」来学时钟树?

因为搜索框只会给你名词解释(PLL 是什么、AHB 是什么),但不会帮你建立“流向感”

时钟树最重要的是:看清箭头从哪来到哪去,再用右侧 MHz 数字做体检——这比背 10 个缩写都有用。

以后一旦舵机频率不对、串口波特率飘、USB 不识别,你第一反应不是去搜“如何解决”,而是回来点开这张图:看哪一级分频把你预期的频率吃掉了。那就是高手思维和新手思维的分界线。

六、 总结与避坑指南

做这个项目时,我踩遍了几乎所有新手都会踩的雷。为了让你们少走弯路,我把这些坑总结成了 “三大纪律八项注意”

⚡ 第二大纪律:时钟与供电(硬件层面的坑)

核心原则:心脏要稳,饭要吃饱。

🔧 第三大纪律:配置逻辑(操作层面的坑)

核心原则:先搭地基,再盖楼。

在你点击 Generate Code​ 之前,对着这张表检查一遍:

检查项

状态

备注

工程路径

[ ] 无中文

最重要!

RCC

[ ] HSE 已开启

保证时钟源

SYS

[ ] Debug 选 Serial Wire

防止锁死

Clock Tree

[ ] SYSCLK = 72MHz

核心频率

TIM 参数

[ ] PSC/ARR 算对了吗?

别忘了 F103 的 x2 机制

I2C 地址

[ ] 是 0x78 还是 0x7A?

OLED 常见问题

GND

[ ] 屏幕、舵机、板子共地

硬件必查


最后一句大实话:

STM32 开发就像拼乐高,CubeMX 是把零件包拆开的工具。零件(外设)没配好,拼出来的车(代码)肯定跑不起来。希望这篇教程能帮你把零件配齐,剩下的就是享受代码跑通的快乐了!🚀


  1. 🚨 第一大纪律:路径与命名(软件层面的坑)

    核心原则:不要让 Keil 读不懂你的文件。

  2. 工程路径不能有中文!

    • ❌ 错误示范:`F:\我的项目\双舵机\程序`

    • ✅ 正确示范:`F:\STM32_Project\Servo_OLED`

    • 后果:CubeMX 生成的代码路径会变乱码,Keil 会疯狂报错找不到头文件。

  3. 工程名不要有空格!

    • ❌ 错误示范:double duoji jishu(你现在的名字)

    • ✅ 正确示范:Double_Servo_OLED

    • 后果:虽然有时候能过,但某些版本的 Keil 编译时会把空格截断,导致链接失败。

  4. 头文件一定要加 extern

    • .h文件里声明全局变量(如 htim2)时,前面必须加 extern

    • 后果:不加 extern会导致重复定义的报错(Multiple Definition)。

  5. RCC 别乱选!

    • 如果你用的是 Blue Pill(8M 晶振),HSECrystal/Ceramic Resonator

    • 如果你用的是 Core Board(没焊晶振),HSEDisable,用 HSI

    • 后果:选错了,程序下载进去会直接“死机”或反复重启。

  6. 定时器时钟要心中有数!

    • F103 有个坑:APB 分频不为 1 时,定时器时钟会 x2

    • 如果你看到 APB1 Timer clocks是 72MHz,那你算 PWM 时就要按 72MHz 算,别傻乎乎按 36MHz 算。

  7. 舵机不要直接接 3.3V!

    • 舵机是“饿死鬼”,电流很大。一定要接 5V​ 电源(最好是外部电源),并且所有 GND 必须连在一起(共地)。

    • 后果:直接接 3.3V,舵机要么不动,要么把板子电流拉爆导致芯片复位。

  8. 配置顺序不能乱!

    • 错误顺序:先配 TIM 和 I2C,再回去改时钟。

    • 正确顺序Pinout (RCC/SYS)Clock Configuration(把频率定死) → Timers/I2C(按既定频率算参数)。

    • 后果:顺序反了,改时钟后之前的 PWM 频率全乱了。

  9. SYS 里的 Debug 千万别关!

    • 一定要选 Serial Wire

    • 后果:如果你手滑选了 No Debug,下次你就下载不进程序了,芯片会变砖(需要短接 BOOT0 救砖)。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐