全网最细!STM32CubeMX 保姆级教程(新手详细版-一看就会)
摘要:很多 STM32 新手一打开 STM32CubeMX 就被满屏的英文劝退。本文将带你彻底搞懂 CubeMX 的每一个核心版面,结合实际项目(基于STM32,控制两个舵机分别往返动作一次,OLED上显示动作的累计次数--关于此项目详细可见我的其他文章!),教你如何从零开始配置一个完美的工程。
一、 为什么要学 STM32CubeMX?
在传统的 STM32 开发中,我们需要查阅厚厚的参考手册,手动配置每一个寄存器,不仅效率低下,而且极易出错。
STM32CubeMX 是 ST 官方推出的图形化配置工具。它的核心优势在于:
-
图形化界面:点点鼠标就能配置引脚和外设。
-
自动生成代码:根据你的配置,自动生成初始化代码(支持 Keil、IAR、STM32CubeIDE 等)。
-
时钟树可视化:复杂的时钟配置变得像搭积木一样简单。
二、 新建工程:迈出第一步
-
打开 STM32CubeMX,点击界面左上角的
New Project。 -
在弹出的
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 关联:你后面把舵机插到
PA0、PA1,把 OLED 的 SCL/SDA 接到PB6、PB7,都要来这里把这些引脚的模式从默认的“浮空输入”改成“复用推挽输出”或“开漏输出”。
4. NVIC (Nested Vectored Interrupt Controller) —— 芯片的“紧急指挥中心”
-
控制什么:当芯片同时收到很多任务请求时(比如一边在转舵机,一边在刷新 OLED,突然按键被按下了),它决定先处理谁,后处理谁。
-
舵机/OLED 关联:新手前期通常保持默认即可。只有当你发现 OLED 屏幕刷新的时候舵机会卡顿,才需要来这里调整优先级。
5. IWDG / WWDG (看门狗) —— 芯片的“自动重启闹钟”
-
控制什么:一种防死机机制。如果你启动了一个倒计时,必须在倒计时结束前“喂狗”。如果程序跑飞了忘了喂狗,芯片就会自动重启。
-
舵机/OLED 关联:新手项目千万不要随便开启,否则你会觉得程序莫名其妙一直在重启。
💡 实操引导:RCC 里面到底该怎么填?
现在我们把目光移到右侧的 RCC 配置面板。这里就是配置时钟源的地方,我们针对你的项目来讲解每一个选项:
第一部分:Mode(模式选择)
-
High Speed Clock (HSE) [外部高速时钟]
-
当前选的是:
Crystal/Ceramic Resonator(晶振/陶瓷谐振器)。 -
中文解释:这是让芯片使用外接的石英晶体振荡器。
-
怎么选:必须选这个! 因为你买的 STM32 最小系统板上通常都焊了一颗 8MHz 的无源晶振。选了这个,芯片才能跑得又快又准。
-
(注:如果选
Disable,芯片就会用内部自带的粗糙时钟,误差大;如果选Bypass Clock Source,那是给高级玩家接外部方波信号用的)
-
-
Low Speed Clock (LSE) [外部低速时钟]
-
当前选的是:
Disable(禁用)。 -
中文解释:这是给芯片内部的 RTC(实时时钟,掉电走时的钟表)用的 32.768kHz 低速晶振。
-
怎么选:保持 Disable 即可。你的双舵机+OLED 项目不需要掉电走时功能。
-
-
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)就是他的心脏。
没有心脏跳动,手脚再灵活也无法行动。
在我们的双舵机项目中:
TIM2 和 TIM3 就是两个独立的‘节拍器’。
它们各自发出 50Hz 的稳定节奏(PWM波)。
我们通过改变节奏里的‘重音’位置(Pulse 值),来控制舵机转动的角度。
这就是为什么我们必须配置两个 TIM:因为一个节拍器只能带一个舞者,我们要让两个舵机跳出不同的舞蹈!”
舵机需要 PWM(脉冲宽度调制)信号控制。在 STM32 中,PWM 由定时器生成。
我们需要两个独立的 PWM 信号控制两个舵机,因此我们要配置 TIM2 和 TIM3。

1. 配置 TIM2 (以控制第一个舵机为例)
点击左侧 Timers-> TIM2。
-
模式选择 (Mode):
-
Clock Source选Internal Clock(使用内部时钟)。 -
Channel 1选PWM 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 Speed为400000。
-
-
查看中间的引脚视图,确认 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:新手唯一需要知道的三件事(别去搜名词)
很多教程一上来就让新手在搜索框里查
PLL、AHB prescaler、APB1……别那么学。 你只要记住一句话:
CubeMX 的时钟树 = 发电 → 变压 → 各家各户分电 的流程图
1)先看“三个颜色区块”(它天然分成三段)
|
区块 |
你图上看到的名字(典型) |
人话意思 |
新手要盯哪里 |
|---|---|---|---|
|
发电端 |
|
板子真实的“钟摆” |
你板子焊没焊晶振,就决定你该选谁 |
|
变电端 |
|
把低频抬到高频(72 MHz 这种) |
看它最后送到 |
|
配电端 |
|
给 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。
如果你反过来先配外设再回来改时钟,经常会被它弹窗提醒“外设可能不再满足时序”。
你可以给读者一个最稳的顺序(把它写成“经验法则”):
-
Pinout:RCC(选 HSE/HSI)
-
Clock Configuration:把
SYSCLK/HCLK/PCLK1/PCLK2这些数字核对到你要的目标 -
再看右侧:确保
APB1 Timer clocks 是你心里那个数(很多 F103 会停在 72 MHz) -
最后去 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 是把零件包拆开的工具。零件(外设)没配好,拼出来的车(代码)肯定跑不起来。希望这篇教程能帮你把零件配齐,剩下的就是享受代码跑通的快乐了!🚀
-
🚨 第一大纪律:路径与命名(软件层面的坑)
核心原则:不要让 Keil 读不懂你的文件。
-
工程路径不能有中文!
-
❌ 错误示范:`F:\我的项目\双舵机\程序`
-
✅ 正确示范:`F:\STM32_Project\Servo_OLED`
-
后果:CubeMX 生成的代码路径会变乱码,Keil 会疯狂报错找不到头文件。
-
-
工程名不要有空格!
-
❌ 错误示范:
double duoji jishu(你现在的名字) -
✅ 正确示范:
Double_Servo_OLED -
后果:虽然有时候能过,但某些版本的 Keil 编译时会把空格截断,导致链接失败。
-
-
头文件一定要加
extern!-
在
.h文件里声明全局变量(如htim2)时,前面必须加extern。 -
后果:不加
extern会导致重复定义的报错(Multiple Definition)。
-
-
RCC 别乱选!
-
如果你用的是 Blue Pill(8M 晶振),
HSE选Crystal/Ceramic Resonator。 -
如果你用的是 Core Board(没焊晶振),
HSE选Disable,用HSI。 -
后果:选错了,程序下载进去会直接“死机”或反复重启。
-
-
定时器时钟要心中有数!
-
F103 有个坑:APB 分频不为 1 时,定时器时钟会 x2。
-
如果你看到
APB1 Timer clocks是 72MHz,那你算 PWM 时就要按 72MHz 算,别傻乎乎按 36MHz 算。
-
-
舵机不要直接接 3.3V!
-
舵机是“饿死鬼”,电流很大。一定要接 5V 电源(最好是外部电源),并且所有 GND 必须连在一起(共地)。
-
后果:直接接 3.3V,舵机要么不动,要么把板子电流拉爆导致芯片复位。
-
-
配置顺序不能乱!
-
错误顺序:先配 TIM 和 I2C,再回去改时钟。
-
正确顺序:
Pinout (RCC/SYS)→Clock Configuration(把频率定死) →Timers/I2C(按既定频率算参数)。 -
后果:顺序反了,改时钟后之前的 PWM 频率全乱了。
-
-
SYS 里的 Debug 千万别关!
-
一定要选
Serial Wire。 -
后果:如果你手滑选了
No Debug,下次你就下载不进程序了,芯片会变砖(需要短接 BOOT0 救砖)。
-
更多推荐




所有评论(0)