4、STM32CubeMX项目创建:选择MCU型号与配置时钟外设

好,咱们进入实操环节。前面讲了那么多理论,现在终于要动手了。我个人习惯是,拿到一个新项目,第一件事就是打开STM32CubeMX,把芯片选好、时钟配好、外设搭起来。这一步要是马虎了,后面调试起来会非常痛苦。

说白了,STM32CubeMX就是个图形化的配置工具。你点点鼠标,它就能帮你生成初始化代码。省去了手动翻数据手册的麻烦。我刚开始用的时候也觉得不习惯,总觉得手动写代码更踏实。后来项目多了才发现,这工具真能帮你省下大量时间。

4.1 选择MCU型号

打开STM32CubeMX,你会看到两个入口:一个是“New Project”,另一个是“Load Project”。咱们选第一个。

进入MCU选择界面后,你会看到左侧有一大堆筛选条件。我一般这么操作:

  • Series(系列):先选系列,比如STM32F4或STM32H7
  • Lines(产品线):再选具体产品线,比如F405、H743
  • Package(封装):根据你的板子选,LQFP100、LQFP144这些

举个例子,我最近在做的一个项目用的是STM32H743。为什么选它?因为需要跑AI模型,对算力有要求。H7系列主频能到480MHz,还有双精度浮点单元,跑神经网络推理会快很多。

我的小技巧: 如果你不确定选哪个型号,可以在搜索框里直接输入“STM32F407VET6”这样的完整型号。CubeMX会自动帮你定位。我经常这么干,省得一个个翻列表。

选好型号后,点击“OK”按钮。这时候CubeMX会问你要不要初始化所有外设。我建议选“No”,咱们自己慢慢配,心里有数。

4.2 配置时钟树

时钟配置是重中之重。你想想看,CPU跑多快、外设能不能正常工作,全看时钟配得对不对。我在项目中遇到过好几次,板子焊好了,程序烧进去了,结果串口乱码。查了半天,原来是时钟配错了。

进入“Clock Configuration”选项卡,你会看到一个时钟树图。嗯,这里要注意,不同型号的时钟树长得不一样,但核心逻辑是相通的。

我一般按这个步骤来:

  1. 选择时钟源:HSE(外部高速晶振)还是HSI(内部RC振荡器)?我个人习惯用HSE,精度高。如果你板子上有8MHz晶振,就选HSE。
  2. 配置PLL:PLL就是锁相环,用来倍频的。比如HSE是8MHz,你想让CPU跑到400MHz,那就得配PLL。
  3. 设置系统时钟:把SYSCLK(系统时钟)选成PLL输出。
  4. 配置AHB、APB分频:外设总线不能跑太快,得适当分频。

举个例子,STM32H743的典型配置:

HSE = 8MHz
PLLM = 2, PLLN = 240, PLLP = 2, PLLQ = 4
SYSCLK = 480MHz
AHB = 240MHz
APB1 = 120MHz
APB2 = 120MHz

配完之后,你会看到时钟树上的数字都变成绿色了。如果变红,说明超频了。我曾经有一次把PLLN设成250,结果CubeMX直接报红。嗯,超频有风险,别乱来。

避坑指南: 我曾经在STM32F4上把APB1配到84MHz以上,结果I2C死活不工作。后来查数据手册才发现,APB1最高只能到42MHz。所以配完时钟后,最好看一眼外设的时钟上限。

4.3 配置UART外设

UART(串口)是调试必备。你总得有个地方打印日志吧?我习惯在项目初期就把UART配好,这样后面调试AI模型时,能随时看输出。

进入“Pinout & Configuration”选项卡,在左侧找到“Connectivity” -> “USART”。选一个你需要的UART实例,比如USART1。

配置要点:

  • Mode:选“Asynchronous”(异步模式)。这是最常用的。
  • Baud Rate:波特率。我一般用115200,够快也够稳定。
  • Word Length:8位数据位,默认就行。
  • Parity:无校验。除非你通信环境特别恶劣,否则不用开。
  • Stop Bits:1位停止位。

配完之后,你会看到芯片引脚图上,对应的TX和RX引脚变成了绿色。嗯,这说明引脚分配成功了。

我的经验: 如果你用的是开发板,比如Nucleo或Discovery,板子上通常已经有一个虚拟串口(通过ST-Link)。那个串口一般对应USART2。你直接配USART2,然后通过USB线连电脑,就能在串口助手上看到输出了。省去额外接USB转串口模块的麻烦。

4.4 配置USB外设

USB外设的配置稍微复杂一点。因为USB有主机模式、设备模式、OTG模式之分。咱们做AI模型调试,一般用USB设备模式,把STM32当做一个USB设备,跟电脑通信。

在左侧找到“Connectivity” -> “USB_OTG_FS”(或HS,看你芯片支持哪个)。

配置步骤:

  1. Mode:选“Device_Only”(仅设备模式)。
  2. VBUS Sensing:选“VBUS Sensing Disabled”。很多开发板没有VBUS检测引脚,关掉能省事。
  3. 时钟配置:USB需要48MHz的时钟。如果你配的时钟树里没有48MHz输出,CubeMX会提示你。它会自动帮你从PLL分出一路48MHz。

配完USB后,你还需要选一个USB类。比如你要做虚拟串口(CDC),就在“Middleware” -> “USB_DEVICE”里选“Communication Device Class (Virtual Port Com)”。这样电脑会把STM32识别成一个串口,用串口助手就能收发数据。

重要提醒: USB的DP(D+)和DM(D-)引脚不能随便接。它们需要接在芯片的专用USB引脚上。CubeMX会自动分配,但你要确认一下板子的原理图。我见过有人把DP和DM接反了,结果USB死活枚举不上。

4.5 生成代码

配完所有东西后,点击右上角的“GENERATE CODE”按钮。CubeMX会问你项目名称、保存路径、IDE类型(MDK、IAR、STM32CubeIDE等)。选好之后,点“OK”,代码就生成了。

生成完成后,你会看到一个完整的工程。里面包含了时钟初始化、UART初始化、USB初始化等代码。你只需要在main函数里添加自己的业务逻辑就行。

嗯,到这里,项目创建这一步就算完成了。后面咱们就可以在这个基础上,加入AI模型推理的代码了。