STM32CubeMX配置详解

本文最后更新于:2024年9月2日 晚上

STM32CubeMX配置详解

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

参考:

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

一、NVIC嵌套向量中断控制器

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

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

NVIC

(1)Priority Group优先级分组

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

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

(2)Non maskable interrupt不可屏蔽中断

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

(3)Hard fault interrupt硬故障中断

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

(4)Memory management fault内存管理故障

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

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

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

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

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

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

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

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

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

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

(8)Debug monitor调试监视器

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

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

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

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

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

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

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

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

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

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

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

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

二、RCC复位与时钟控制

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

RCC

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

1.BYPASS Clock Source

  旁路时钟源,为有源晶振

2.Crystal/Ceramic Resonator

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

(2)Master Clock Output 1 / Master Clock Output 2

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

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

(3)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)的方式、系统唤醒模式的选择、时间基准的选择等。

(1)Debug调试模式

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

(2)System Wake-Up系统唤醒

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

(3)Timebase source时间基准源

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

四、Middleware & Software Packs中间件及软件包

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

Middleware & Software Packs

(1)FATFS

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

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

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

(2)FREERTOS

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

在STM32CubeMX中使用FreeRTOS的基本步骤包括:

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

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

(3)USB-DEVICE

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

(4)USB-HOST

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

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

(4)X-CUBE-AI

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

(4)X-CUBE-ALGOBUILD

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

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


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