2. STM32CubeMX项目创建与配置
好,咱们正式开始动手。这一章我会带着你从零创建一个STM32项目,把时钟树、串口、GPIO和调试接口都配好。这些是嵌入式开发的“基本功”,也是后面跑AI模型的基础设施。
我个人习惯是:先把硬件管脚规划清楚,再打开CubeMX。别急着点鼠标,先想清楚你要用哪个外设、哪个管脚。不然配到一半发现管脚冲突,那才叫头疼。
2.1 新建STM32项目
打开STM32CubeMX,点击“New Project”。你会看到一个芯片选型界面。这里我建议直接搜你手头板子的主控型号,比如STM32F407VET6或者STM32H743ZIT6。
选型要点:
- 确认封装:LQFP100、LQFP144还是BGA?别选错了,焊不上就尴尬了
- 确认Flash和RAM大小:跑AI模型,RAM至少64KB起步,推荐256KB以上
- 确认是否有FPU:Cortex-M4/M7都带,M0/M3没有,影响运算速度
选好芯片后,双击进入配置界面。嗯,这里要注意:第一次打开可能会提示你安装固件包,点“Yes”让它自动下载就行。网速慢的话,可以去ST官网手动下载,然后导入本地。
2.2 时钟树配置(HSE/LSE/PLL)
时钟树,说白了就是给芯片“喂心跳”。心跳不对,整个系统都跑偏。我在项目中遇到过好几次,因为时钟没配好,串口波特率死活对不上,查了半天才发现是PLL分频算错了。
进入“Clock Configuration”选项卡,你会看到一张时钟树图。别被它吓到,咱们一步步来。
2.2.1 HSE(高速外部时钟)
HSE一般来自板子上的8MHz或25MHz晶振。在CubeMX里,找到“HSE”选项,选择“Crystal/Ceramic Resonator”。
我的习惯:只要板子上有外部晶振,我一定用HSE。内部RC振荡器精度不够,尤其是跑串口通信时,容易丢数据。
2.2.2 LSE(低速外部时钟)
LSE是32.768kHz的晶振,主要给RTC用。如果你不需要RTC,可以跳过。但我建议还是配一下,万一后面要用呢?
在“LSE”选项里,同样选“Crystal/Ceramic Resonator”。
2.2.3 PLL配置
PLL是倍频器,把HSE的频率翻上去,得到系统主频。比如HSE是8MHz,你想跑到168MHz,那就需要PLL倍频。
配置公式很简单:
系统时钟 = (HSE频率 / M分频) × N倍频 / P分频
举个例子,STM32F407:
HSE = 8MHz
M = 8
N = 336
P = 2
系统时钟 = (8 / 8) × 336 / 2 = 168MHz
曾经踩过的坑:有一次我把N设成了336,P设成了4,结果系统时钟只有84MHz。查了半天才发现,P分频器输出不能超过168MHz。嗯,这个限制在数据手册里有写,但很容易忽略。
配好后,CubeMX会自动计算各个总线的时钟频率。你只需要确认:
- APB1 ≤ 42MHz(F4系列)
- APB2 ≤ 84MHz(F4系列)
- AHB ≤ 168MHz(F4系列)
不同系列的上限不一样,H7系列能跑到480MHz,但功耗也大。你想想看,跑AI模型时,主频越高推理越快,但发热也越严重。这个平衡要自己把握。
2.3 串口与GPIO配置
串口是调试的“生命线”。我习惯在项目一开始就把串口配好,这样后面可以用printf打印日志,方便定位问题。
2.3.1 串口配置
进入“Pinout & Configuration”选项卡,找到“USART1”(或者你板子上对应的串口)。
配置步骤:
- Mode选择“Asynchronous”(异步模式)
- Baud Rate设成115200(我个人习惯,够快且稳定)
- Data Bits选8,Parity选None,Stop Bits选1
- 管脚会自动分配,一般是PA9(TX)和PA10(RX)
避坑指南:我曾经把TX和RX接反了,结果串口助手收不到任何数据。检查了半小时才发现。所以配完后,一定用万用表量一下管脚电平,确认连接正确。
2.3.2 GPIO配置
GPIO配置相对简单。比如你要控制一个LED灯,找到对应的管脚(比如PD12),右键选择“GPIO_Output”。
在“GPIO”选项卡里,可以设置:
- Output Level:默认输出高还是低
- Pull-up/Pull-down:一般设成No pull
- Maximum output speed:LED用Low就行,高速信号用High
你想想看,GPIO速度设太高,反而会增加功耗和噪声。所以别盲目追求“High”,够用就行。
2.4 调试接口(SWD)配置
SWD是调试的“命门”。没有它,程序烧不进去,也跑不起来。我见过不少新手,配完所有外设,结果忘了开SWD,导致第一次烧录就失败。
在“Pinout & Configuration”选项卡里,找到“SYS” -> “Debug”。选择“Serial Wire”。
重要提醒:千万不要选“JTAG”除非你确定要用。JTAG占4个管脚,SWD只占2个(SWDIO和SWCLK)。选错了,后面GPIO不够用,你就得重新配。
配好后,管脚会自动分配:
- PA13 -> SWDIO
- PA14 -> SWCLK
嗯,这里要注意:这两个管脚默认有内部上拉/下拉,不要随便改。改了可能导致调试器连不上。
2.5 生成代码
所有配置完成后,点击“Project” -> “Generate Code”。
生成前确认:
- Toolchain:选MDK-ARM(Keil)或者STM32CubeIDE
- Firmware Package:用最新版,但别太新,稳定为主
- Generate peripheral initialization as a pair of .c/.h files:勾上,方便管理
点击“Generate”,CubeMX会自动生成初始化代码。打开Keil或CubeIDE,编译一下,0错误0警告,那就说明配置成功了。
总结一下:
- 时钟树:HSE + PLL,算出系统主频
- 串口:115200-8-N-1,调试必备
- GPIO:按需配置,速度别设太高
- SWD:Serial Wire,别选JTAG
配好后生成代码,编译通过,就可以开始写业务逻辑了。
下一章,我会带你配置DMA和定时器,为AI模型的数据采集做准备。咱们到时候见。