STM32CubeMX 配置详解

本文最后更新于:2026年8月29日 晚上

STM 32 CubeMX 是由 ST 公司开发的图形化代码自动生成工具,能够快速生成初始化代码,如配置 GPIO,时钟树,中间件等,使用户专注于业务代码的开发。现在 ST 主推 HAL 库代码,经典的标准外设库已经停止维护了,新产品也只提供 HAL 库的代码,因此,我们学习 HAL 库是更加有优势的,由于 HAL 库具有低耦合、通用、抽象了硬件层,使得开发者无需太过关注硬件驱动的实现,使得开发更加简单快速,更容易维护,因此被越来越多的产品所使用。

参考: 《STM32F407 开发指南 V1.1》第十章 STM32CubeMX 简介 - 知乎 (zhihu.com)

NVIC 嵌套向量中断控制器

STM 32 F 4 系列使用的是 ARM Cortex-M 内核,中断向量表是处理器中的一组特殊地址,存储着每个中断服务程序的入口地址。当发生中断时,处理器会根据中断编号查找中断向量表,并跳转到相应中断服务程序的入口地址执行。

  • 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的;
  • 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断;
  • 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行;
  • 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
  • 打断的情况只会与抢占优先级有关,和响应优先级无关!
  • 一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组 2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。

a2c0c84440cd1d9f794d30d21c10e576

Priority Group 优先级分组

STM 32 使用 4 个 bit 位来分组,设置用几个 bit 来区分抢占优先级和响应优先级,优先级数值越小,优先级别越高;

判断中断的优先级,先看抢占优先级,抢占优先级高的中断优先级别高。抢占优先级相同的情况下,响应优先高的中断优先级别高。抢占优先级和响应优先级相同的情况下,根据中断向量表确定。

Non maskable interrupt 不可屏蔽中断

"Non maskable interrupt"(NMI)是一种硬件中断,它不能被屏蔽,并且具有最高的优先级。在 STM 32 微控制器中,如果 NMI 发生,即使中断屏蔽寄存器(PRIMASK, FAULTMASK 或 BASEPRI)设置为禁止其他中断,NMI 也会被处理。如果 STM 32 CubeMX 在配置过程中或在程序运行时报告 NMI 错误,这通常表明有硬件问题,如电源不稳定、时钟问题或硬件故障。

Hard fault interrupt 硬故障中断

"Hard fault interrupt" 是指在使用 STM 32 CubeMX 配置并编程 STM 32 微控制器时,系统遇到了一个严重的错误,导致了硬件故障中断。这种中断是一个严重错误,通常是由于程序试图访问一个非法的内存地址或者对硬件执行了不合法的操作而引起的。

Memory management fault 内存管理故障

"Memory management fault" 是一个硬件或操作系统层面的错误,通常与内存访问不当有关。在 STM 32 微控制器的情况下,这可能是由于以下原因造成的:

  1. 非法内存访问:程序试图访问一个它没有权限的内存区域,或者试图写入只读内存区域。
  2. 堆栈溢出:递归调用太深导致堆栈溢出,或者分配了太多内存。
  3. 内存损坏:硬件故障或内存本身损坏。
  4. 内存管理配置错误:例如使用了错误的内存区域作为堆或栈。

Pre-fetch fault, Memory access fault 预读取故障、内存访问故障

"Pre-fetch fault, Memory access fault"是存储器访问错误,通常指的是程序尝试访问一个无效的内存地址,或者是由于程序的预取指令出现问题。这可能是由于程序指针错误、数组越界、硬件配置错误或者是软件逻辑错误导致的。

Undefined instruction or illegal state 未定义指令或非法状态

"Undefined instruction or illegal state" 错误通常表示你的程序尝试执行了一个不存在的指令或处于不正确的处理器状态。在 STM 32 微控制器上,这可能是因为尝试执行特定于某种处理器架构但不支持当前硬件的指令,或者是因为硬件故障、电源不稳定或者在错误的模式下运行了程序。

System service call via SWI instruction 通过 SWI 指令调用系统服务

SWI(Software Interrupt)指令用于触发系统服务调用(System Service Call,SysCall)。当使用 SWI 指令时,微控制器会跳转到一个预定义的地址,通常是一个中断处理程序,这个处理程序可以执行一些特定的系统服务。

如果你在使用 STM 32 CubeMX 时遇到了有关 System service call via SWI instruction 的问题,这可能是因为以下原因:

  1. 配置错误:在 STM 32 CubeMX 中配置了错误的中断向量或者服务调用设置。
  2. 固件版本问题:你可能使用了一个不支持 SWI 指令的固件版本。
  3. 代码生成问题:在生成初始化代码时,可能没有正确地设置中断向量表或者服务调用处理程序

Debug monitor 调试监视器

"Debug monitor"中断通常指的是调试监视器中断,它是一种用于调试目的的中断。当发生调试相关的事件时,例如:调试器访问了一个无效的存储区域,或者是调试器发送了一个无效的指令,这个中断会被触发。

如果你在中断向量表中看到这个中断,并且它被错误地触发,可能是因为以下原因:

  1. 调试器配置错误:检查你的调试器设置是否正确配置。
  2. 软件中断:如果你的代码中故意设置了这个中断,那么这可能是合法的行为。
  3. 硬件故障:可能存在硬件问题,导致调试器与 MCU 通信异常。

Pendable request for system service 可挂起的系统服务请求

"Pendable request for system service"中断通常是指一个可挂起的系统服务请求。这个中断是一个特殊的中断,它允许高优先级的任务在一些条件下请求低优先级任务的执行,而不需要进行任务调度。这种请求可以用于实现系统任务的紧急执行。

Time base: System tick timer 时间基准:系统滴答计时器

"Time base: System tick timer"通常指的是用于实现操作系统或其他需要时钟节拍服务的软件的系统时钟定时器中断。这个中断是 STM 32 微控制器用来定期通知操作系统或其他任务执行定时任务的一种机制。

具体来说,系统时钟定时器通常配置为在一个固定的时间间隔触发中断,这个间隔称为"系统时钟周期"(SysTick 周期)。操作系统或其他软件可以设置这个周期的长度,以便执行各种任务,如任务调度、时间管理等。

在 STM 32 CubeMX 中,你可以配置这个中断的触发频率,以及是否使能这个中断。如果启用了这个中断,那么在每个系统时钟周期结束时,控制器都会产生一个中断,这样操作系统或其他软件就可以执行它的处理函数。

如果你正在使用操作系统,比如 FreeRTOS,那么这个中断通常会被用来执行任务调度。如果你不使用操作系统,那么你可以选择禁用这个中断,或者使用它来执行你自己的定时任务。

在代码生成设置中,如果你启用了操作系统支持,STM 32 CubeMX 会自动生成相关的中断服务例程(ISR),以及配置系统时钟定时器的代码。你只需要调用操作系统的 API 函数,如 osSystick_Handler(),来处理中断。

如果你不使用操作系统,你可以自己实现系统时钟定时器中断服务例程,并在其中执行你的定时任务。

RCC 复位与时钟控制

STM 32 的时钟部分是其操作的核心,处理器的稳定工作也离不开时钟,它负责为微控制器提供时钟信号以驱动 CPU、外设和总线。

2003e2094cc4eefd6deb34d6955f6f26

High Speed Clock (HSE) / Low Speed Clock (LSE) 高/低速外部时钟

BYPASS Clock Source

旁路时钟源,为有源晶振

Crystal/Ceramic Resonator

晶体/陶瓷谐振器,为无源晶振

Master Clock Output 1 / Master Clock Output 2

功能是选择是否使能 MCO 1 引脚时钟输出。 当使能 MCO 1 时,它允许用户通过特定的引脚输出时钟信号,这通常用于外部设备的同步或作为其他电路的时钟源。MCO 1 和 MCO 2 是 STM 32 微控制器提供的两个时钟输出功能,它们可以用于驱动外部设备,如网络模块或其他需要精确时钟信号的硬件。

用来选择是否使能 RCC_MCO_ 2 引脚时钟输出

Power Regulator Voltage Scale 电源调节器电压范围

Power Regulator Voltage Scale 的设置对于控制 MCU(微控制器)的频率和性能至关重要。这个设置决定了 MCU 的工作电压和电流的调节方式,进而影响 MCU 的最大工作频率和功耗。具体来说,通过调整 Power Regulator Voltage Scale,可以优化 MCU 的性能和功耗之间的平衡。

SYS Mode and Configuration 模式和配置

SYS 的模式与配置 (SYS Mode and Configuration) 界面中是一些有关系统的配置参数,如调试 (Debug) 的方式、系统唤醒模式的选择、时间基准的选择等。

303ab608c4da44c4c23c11554873934a

Debug 调试模式

SYS 项的 Debug 配置允许用户选择不同的调试模式,这些模式包括 SW 串行模式、4 针脚的 JTAG 模式、5 针脚的 JTAG 模式以及其他一些带 Trace 的调试模式。对于一般的开发用途,推荐选择 SW 串行模式,因为它占用引脚最少,足以进行调试。选择 Debug 模式后,STM 32 CubeMX 会自动使能相关的引脚。

System Wake-Up 系统唤醒

System Wake-Up 是一个重要的功能,它允许用户设置一个或多个引脚作为唤醒源。当这些引脚被激活(例如,通过外部信号触发),MCU 可以从低功耗模式(如睡眠模式或停止模式)中被唤醒,恢复到正常的工作状态。这种机制对于需要长时间待机或节能的应用来说非常有用,因为它可以在不消耗过多电能的情况下,对外部事件或信号做出快速响应。

Timebase source 时间基准源

Timebase source<-systick 指的是系统定时器(SysTick)被用作时间基准源。SysTick 是一个在 Cortex-M 内核中的一个定时器,用于提供系统的时基,例如操作系统的时钟节拍或者基于操作系统的异步任务调度。

Middleware & Software Packs 中间件及软件包

软件包(Software Packs)是 ST 提供的一系列库和中间件,用于提高开发人员的生产力,简化应用程序开发。中间件(Middleware)是连接不同软件组件的组件,它提供了一个接口,使得开发人员可以更容易地集成第三方软件或者服务。

c05122238a2e6250dcb834a9db39482f

FATFS

FATFS 是一个文件系统,专门为小型嵌入式系统设计,具有以下特点和功能:

  1. 免费开源:FATFS 是一个免费开源的 FAT 文件系统模块,专门为小型嵌入式系统设计。它完全用标准 C 语言编写,具有良好的平台独立性。
  2. 支持多种 FAT 格式:支持 FAT 12、FAT 16、FAT 32 和 exFAT(R 0.12 及以后版本),这使得它能够适应不同的存储需求和兼容不同的存储介质。
  3. 支持多种存储媒介:FATFS 支持多个存储媒介,包括 SD 卡、SPI Flash 等,这使得它非常适合在嵌入式系统中使用。
  4. 良好的兼容性:FATFS 与 Windows 文件系统兼容,这使得在嵌入式系统中使用 FATFS 时,可以更容易地管理和迁移文件。
  5. 易于移植:FATFS 的代码量少,效率高,且易于移植到不同的硬件平台上。这包括需要修改的底层接口文件和一般不需要修改的文件系统层文件。
  6. 强大的功能:支持长文件名、多种编码页面、RTOS 等,提供了丰富的配置选项,满足各种应用场景的需求。
  7. 应用接口:FATFS 提供了一个应用接口,包括打开、关闭、读取、写入文件等基本操作,使得在应用层使用 FATFS 变得简单直观。

在 STM 32 CubeMX 中,通过简单的配置,开发者可以将 FATFS 文件系统挂载到 SD 卡或其他存储介质上,从而实现文件的创建、打开、写入、读取和关闭等操作。这大大简化了在嵌入式系统中实现文件系统的过程,使得开发者能够更专注于应用层的开发。

FREERTOS

FreeRTOS 是一个实时操作系统(RTOS),它允许开发者在 STM 32 微控制器上创建多任务环境,从而实现复杂的控制逻辑和高效的任务管理。

在 STM 32 CubeMX 中使用 FreeRTOS 的基本步骤包括:

  1. 选择 STM 32 微控制器型号:首先,需要选择适合项目的 STM 32 微控制器型号。
  2. 配置系统时钟和外设:在"Configuration"选项卡中,根据项目需求配置系统时钟和外设,如时钟源、时钟频率、GPIO 引脚等。
  3. 启用 FreeRTOS:在"Middleware"选项卡中选择"FreeRTOS"并启用它。可以配置 FreeRTOS 的堆栈大小、任务优先级等参数。
  4. 添加任务:在 FreeRTOS 配置后,可以在"Tasks"选项卡中添加任务,设置任务的名称、栈大小、优先级等信息。
  5. 生成代码:完成配置后,通过 STM 32 CubeMX 生成 FreeRTOS 集成的 STM 32 项目代码。
  6. 编写任务函数:在生成的代码中找到相应任务的函数,并编写任务的具体实现。
  7. 编译和烧录:使用 IDE(如 STM 32 CubeIDE、Keil、IAR 等)打开生成的代码项目,编译代码并将其烧录到 STM 32 微控制器上。

使用 STM 32 CubeMX 配置 FreeRTOS 时,可以选择外部晶振作为高速时钟,设置系统配置,包括调试选项以便于后续的仿真调试。由于 FreeRTOS 基于系统定时器,因此需要创建一个定时器(如 TIM 16)来进行计时。此外,还需要配置系统时钟树、设置工程名称和路径、工具链,以及添加必要的库和自动生成代码文件。如果需要使用串口打印数据,可以配置串口,并设置串口的波特率。

USB-DEVICE

USB 设备库和中间件,使得开发者能够轻松地将 STM 32 微控制器配置为 USB 设备,支持多种 USB 类,如 CDC、HID、MSC 等,从而扩展了微控制器的应用范围。STM 32 CubeMX 的 USB 设备库支持多种 USB 版本,包括 USB 1.1 和 USB 2.0,并且随着技术的发展,也开始支持 USB 3.0。STM 32 F 103 等型号的 MCU 内置了 USB 从控制器,支持 USB 2.0 规范,但只能作为 USB 设备使用,不能作为主机。USB 接口采用差分电压方式进行数据传输,通过 D+ 和 D-两根线实现。STM 32 CubeMX 的 USB 模块与 PC 主机之间的数据传输是通过共享专用数据缓冲区完成的,该缓冲区的大小由使用的端点数目和每个端点的最大数据分组大小决定,每个端点最大可使用 512 字节缓冲区,最多可用于 16 个单向或 8 个双向端点。

USB-HOST

USB-HOST 功能允许用户将 STM 32 微控制器配置为 USB 主机,使其能够与 USB 设备进行通信。这一功能对于需要实现 USB 设备连接和控制的应用来说非常有用。通过 STM 32 CubeMX 的 USB-HOST 配置,用户可以选择不同的 USB 类(如 Mass Storage Class、Communication Class 等),并根据具体需求进行配置,以实现特定的通信协议。例如,通过配置为 Mass Storage Host Class,STM 32 可以作为一个 USB 主机,与 U 盘等大容量存储设备进行通信,从而实现文件的读写操作。此外,通过配置为 Communication Class,STM 32 可以作为 USB 主机,与 EC 20 模块等通信设备进行通信,实现数据的传输和指令的控制。

在 STM 32 CubeMX 中配置 USB-HOST 时,用户需要进行一系列的设置,包括选择适当的 USB 类、配置时钟频率、设置 GPIO 引脚等。这些配置将生成相应的初始化代码,用户可以在此基础上进行进一步的应用开发,实现特定的功能。例如,通过配置 USB-HOST 为 Mass Storage Host Class,并使用 FatFs 文件系统,用户可以实现 U 盘的读写操作。通过配置为 Communication Class,并使用特定的库(如 usb-host-cdc 库),可以实现与 EC 20 模块的通信,通过 AT 指令进行控制。

X-CUBE-AI

X-CUBE-AI 是 STMicroelectronics 为 STM 32 生态系统提供的一个 AI 扩展包,旨在简化 AI 模型的部署过程。它能够自动转换预训练的人工智能模型,并在用户项目中生成针对 STM 32 优化的库,从而使得 AI 技术的应用更加便捷和高效。X-CUBE-AI 的更新版本,如 v 7.1.0,引入了多项改进,以进一步提升用户体验和模型部署的效率。

X-CUBE-ALGOBUILD

X-CUBE-ALGOBUILD 软件包为开发人员提供了易于使用的图形界面和算法库,使得开发人员能够快速地将算法集成到 STM 32 微控制器中。这个软件包特别适用于需要快速原型设计和算法验证的应用,如机器学习、深度学习、信号处理等领域的算法实现。通过 X-CUBE-ALGOBUILD,开发人员可以更加专注于算法的设计和优化,而不必过多关注底层硬件的实现细节,从而提高了开发效率和算法的可移植性。

此外,X-CUBE-ALGOBUILD 还支持多种算法和数学运算,包括但不限于 FFT、FIR/IIR 滤波器、矩阵运算等,这些功能对于需要进行复杂数学计算和信号处理的嵌入式系统应用尤为重要。通过这个软件包,开发人员可以更加便捷地实现这些算法,并将其部署到 STM 32 微控制器上,实现高性能的计算和处理任务。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!