STM32H743-结合CubeMX新建HAL库MDK工程
目录
- 实验平台
- 前言
- STM32CubeMX
- STM32CubeMX功能
- STM32CubeMX安装
- STM32CubeMX新建工程
- 新建工程
- 工程建立
- 确认时钟源
- 配置系统时钟(时钟树)
- GPIO引脚配置
- Cortex-M7内核基本配置
- 配置工程属性
- 用户程序(MDK)
实验平台
硬件:银杏科技GT7000双核心开发板-ARM-STM32H743XIH6,银杏科技iToolXE仿真器
软件:最新版本STM32CubeH7固件库,STM32CubeMX v6.10.0,开发板环境MDK v5.35
前言
在前面配置开发环境章节,我们介绍了MDK的安装与使用,本章我们来介绍HAL库MDK工程的建立。传统的建立工程需要我们根据自己的板子硬件情况,修改许多文件配置,比如GPIO配置、CPU时钟配置、中断配置等等,修改起来不仅繁琐还容易出错。对此ST公司推出STM32CubeMX作为STM32系列微控制器的官方图形化配置工具,其核心优势在于通过直观界面简化硬件配置和代码生成流程,适合不同开发场景的需求。
本章我们将结合STM32CubeMX进行HAL库的MDK工程创建。
STM32CubeMX
STM32CubeMX 是 STMicroelectronics(意法半导体) 官方推出的 免费图形化配置工具,用于 STM32 微控制器(MCU) 的初始化代码生成和硬件配置。它通过 可视化界面 简化了外设设置、时钟树配置、引脚分配等流程,并支持 HAL(硬件抽象层) 和 LL(底层) 库的代码生成,大幅提高开发效率。
STM32CubeMX功能
芯片选型与项目创建
- 支持 全系列 STM32 MCU(如 STM32F0/F1/F4/F7/H7/G0/G4 等)。
- 提供 图形化界面 选择芯片型号,并创建新工程。
引脚分配与外设配置
- 可视化引脚映射(Pinout View):
- 可直观查看引脚功能(GPIO、UART、I2C、SPI、ADC 等)。
- 自动检测引脚冲突(如复用功能冲突)。
- 外设配置(Peripherals):
- 配置 UART、I2C、SPI、CAN、USB、DMA、ADC、TIM(PWM) 等外设参数。
时钟树配置(Clock Configuration)
- 可视化调整 HSE(外部晶振)、HSI(内部时钟)、PLL(锁相环) 等时钟源。
- 自动计算 SYSCLK(系统时钟)、APB1/APB2(外设时钟) 等频率,避免超频或配置错误。
中间件集成(Middleware)
- 支持 FreeRTOS、FatFS(文件系统)、USB Host/Device、LWIP(网络协议栈) 等中间件。
- 可配置 RTOS(实时操作系统) 任务、堆栈等参数。
代码生成
- 自动生成 基于 HAL/LL 库的初始化代码(C 语言)。
- 支持 Keil MDK、IAR Embedded Workbench、STM32CubeIDE(GCC) 等开发环境。
- 提供 .ioc 工程文件,方便后续修改配置。
STM32CubeMX 是 STM32 开发的强大工具,特别适合 快速配置硬件、减少底层代码编写,使开发者更专注于应用层逻辑。当然,自动生成的驱动代码也需要我们阅读理解,否则出现BUG后很难定位到问题所在。
STM32CubeMX安装
参考文章安装STM32CubeMX中的对应章节。
STM32CubeMX新建工程
安装完STM32CubeMX之后,我们打开软件。如下图所示:
在之前环境搭建章节我们已经介绍STM32Cube固件包这里不在赘述,我们来看如何新建工程。
新建工程
一般STM32CubeMX工程配置如下几步:
- 工程建立
- 确认时钟源
- 配置系统时钟(时钟树)
- GPIO功能引脚配置
- Cortex-M7内核基本配置(限定项)
- 配置工程属性
- 用户程序(MDK)
工程建立
方式1:点击“File”,“New Project”即可建新工程。如果之前已经建立过工程,左侧会有打开过的的工程列表,直接点击这些工程也可以打开。
方式2:直接点击ACCESS TO MCU SELECTOR
新建工程后,第一次打开会联网下载一些文件,过程较长可以点击取消。
之后我们进入芯片型号选择界面:
根据我们实际使用的型号进行芯片选择:
选择芯片型号后进入设计主界面:
确认时钟源
先确认RCC时钟源如下图所示:
设置时钟源HSE,选择了Crystal/Ceramic Resonator,表示外部晶振作为它们的时钟源。我们的开发板配置了25M 有源晶振和 32.768K 无源晶振。
上面截图中Master Clock Output 1和Master Clock Output 2是用来选择是否使能MCO1/MCO2引脚时钟输出,选项Audio Clock Input(I2S_CKIN)用来选择是否从I2S_CKIN(PC9)输入I2S时钟。
注:Master Clock Output 2和选项Audio Clock Input(I2S_CKIN)都是使用的PC9引脚,所以如果我们使能了其中一个,那么另一个选项会自动显示为红色,也就是不允许配置,这就是STM32CubeMX的自动冲突检测功能。如下图所示:
配置系统时钟(时钟树)
Clock Configuration 是用于配置 STM32 微控制器 时钟源、PLL(锁相环)、系统时钟(SYSCLK)及各总线时钟(APB1/APB2) 的重要功能模块。正确的时钟配置直接影响芯片性能、外设工作频率及功耗。
选择Clock Configuration选项卡即可进入时钟系统配置栏,如下图所示:
STM32 的时钟源主要分为 内部时钟 和 外部时钟 两类:
时钟源 | 名称 | 特点 | 典型应用 |
---|---|---|---|
HSI | High-Speed Internal | 内部 RC 振荡器(8MHz/16MHz),精度较低 | 默认时钟,低功耗模式 |
HSE | High-Speed External | 外部晶振(4-48MHz),精度高 | 主时钟源,USB/CAN 等需精确时钟 |
LSI | Low-Speed Internal | 内部 RC 振荡器(32kHz) | 独立看门狗(IWDG)、RTC 备用时钟 |
LSE | Low-Speed External | 外部晶振(32.768kHz) | RTC(实时时钟) |
我们以HSE为时钟源,配置PLL1参数,系统时钟选择PLLCLK为时钟源,系统时钟频率为480MHZ为例。
- 配置主时钟源:根据实际硬件选择25MHz晶振。
- 选择时钟源:我们选择HSE,作为 PLL 输入。
- PLLM(分频):降低输入频率,设置为5。
- PLLN(倍频):核心倍频,设置为192。
- PLLP(分频):生成 SYSCLK,设置为2。
- SYSCLK 来源:可选择 HSI、HSE 或 PLL,我们选 PLL 以获得最高性能
- 经过上面配置以后此时SYSCLK=480Mhz。
通过上面7步,我们获得480MHz系统时钟,我们继续配置AHB、APB1、APB2、APB3、APB4和Systick的分频系数,就可以实现sys.c文件中的sys_stm32_clock_init函数配置的部分时钟系统。
AHB(HCLK)是由SYSCLK经过AHB预分频器之后的来,修改他的频率只需要修改标号8位置即可最大240MHz。标号9~12也一样,他们依次配置APB3、APB1、APB2和APB4分频系数。systick固定为480MHz,配置完成之后,那么HCLK=240MHZ,Systic=480MHz,PCLK1=120MHz,PCLK2=120MHz,PCLK3=120Mhz,PCLK4=120MHz,这和我们使用sys_stm32_clock_init函数配置的时钟是一样的。注:配置过程动态自检,检查红色警告(CubeMX 会提示非法配置)。
GPIO引脚配置
我们回到Pinout & Configuration来配置GPIO端口,GT7000开发板上的PG3引脚连接一个红色LED灯,我们通过搜索栏输入PG3找到对应的引脚位置如下图所示:
我们点击引脚图中闪烁的PG3,在下拉菜单中选中GPIO_Output如下图所示:
配置过的PG3由灰色转变为绿色如下图所示,如果我们还要配置外部中断或其他复用功能,可以通过GPIO选项栏中进行配置如下图所示:
我们点击上图中的2号标注,可以进行详细参数配置如下图所示:
GPIO output level是IO的初始值,为了控制红灯的初始状态,我们设置初始值输出高电平为熄灭状态。
GPIO mode默认是推挽输出,不需要更改。
GPIO Pull-up/Pull-down默认是不上下拉。
Maximum output speed输出速度配置,默认是低速,我们设置为高速(可以不改)。
User Label用户符号,我们可以给PG3起一个别的名字。
Cortex-M7内核基本配置
STM32CubeMX 为 Cortex-M7 内核(如 STM32F7/H7 系列)提供了专门的配置选项,涵盖 内核特性、缓存、电源管理、浮点运算 等关键功能。本章我们暂时只介绍缓存配置如下表所示:
时钟源 | 名称 | 特点 | 典型应用 |
---|---|---|---|
缓存选项 | 功能 | 推荐场景 | 默认时钟,低功耗模式 |
I-Cache | 加速指令读取,减少闪存访问延迟 | 所有应用(默认启用) | 主时钟源,USB/CAN 等需精确时钟 |
D-Cache | 加速数据访问,需配合 MPU 管理内存区域 | 大数据处理、高实时性应用 | 独立看门狗(IWDG)、RTC 备用时钟 |
Cache Maintenance | 手动维护缓存一致性(如 DMA 传输前后调用 SCB_CleanInvalidateDCache) | DMA 多核共享内存时需启用 | RTC(实时时钟) |
STM32CubeMX 的 Cortex-M7 配置选项覆盖了 高性能、实时性、安全性 关键需求:
- 缓存与 MPU:提升速度并防止内存错误。
- FPU:加速数学运算。
- 多核通信(H7 专属):简化双核开发。
建议结合 芯片参考手册(RM) 和 CubeMX 自动校验功能 进行优化配置。
配置工程属性
我们点击Project Manager-> Project选项,来对我们的工程进行配置,其中各个选项含义我们来介绍下
Project Name:工程名称,填入工程名称(半角,不能有中文字符)
Project Location:工程保存路径,点击Browse选择保存的位置(半角,不能有中文字符)
Toolchain Folder Location:工具链文件夹位置,默认即可。
Application Structure:应用的结构,选择Basic(基础),不勾选Do not generate the main(),因为我们要其生成main函数。
Toolchain/IDE:工具链/集成开发环境,我们使用Keil,因此选择MDK-ARM,Min Version选择V5.27(最新)。
Linker Settings 链接器设置:
Minimum Heap Size 最小堆大小,默认(大工程需按需调整)。
Minimum Stack Size 最小栈大小,默认(大工程需按需调整)。
MCU and Firmware Package是 MCU及固件包设置:
MCU Reference:目标MCU系列名称。
Firmware Package Name and Version :固件包名称及版本。
勾选Use Default Firmware Location,文本框里面的路径就是固件包的存储地址,我们使用默认地址即可。
最后配置如下图所示:
我们在Project Manager-> Gode Generator选项进行代码生成配置:
Copy all used libraries into the project folder
将 HAL 库的所有.C 和.H 都复制到所建工程中
优点:这样如果后续需要新增其他外设又可能不再用 STM32CubeMX 的时候便会很方便
缺点:体积大,编译时间很长
Copy only the necessary library files
只复制所需要的.C 和.H(推荐)
优点:体积相对小,编译时间短,并且工程可复制拷贝
缺点:新增外设时需要重新用 STM32CubeMX 导入
Add necessary library files as reference in the toolchain project configuration file
不复制文件,直接从软件包存放位置导入.C 和.H
优点:体积小,比较节约硬盘空间
缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径
自行选择方式即可
至此工程最基础配置就已经完成,点击蓝色按钮(SENERATE CODE)就可以生成工程。
在弹出来的窗口中点击Open Project就打开MDK工程。
STM32CubeMX生成的工程目录结构如下图所示:
Drivers文件夹存放的是HAL库文件和CMSIS相关文件。
Inc文件夹存放的是工程必须的部分头文件。
MDK-ARM下面存放的是MDK工程文件。
Src文件夹下面存放的是工程必须的部分源文件。
Template.ioc是STM32CubeMX工程文件,双击该文件就会在STM32CubeMX中打开。
用户程序(MDK)
我们先找到上一节,Open Project打开MDK工程,编译下看看是否有报错,然后我们打开main函数,如下:
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MPU Configuration--------------------------------------------------------*/MPU_Config();
/* Enable the CPU Cache *//* Enable I-Cache---------------------------------------------------------*/SCB_EnableICache();/* Enable D-Cache---------------------------------------------------------*/SCB_EnableDCache();/* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
注意,STM32CubeMX生成的main.c文件中,有很多地方有“/* USER CODE BEGIN X /”和“/ USER CODE END X */”格式的注释,我们在这些注释的BEGIN和END之间编写代码,那么重新生成工程之后,这些代码会保留而不会被覆盖。
我们编写一个LED灯闪烁的用户程序,程序具体如下:
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MPU Configuration--------------------------------------------------------*/MPU_Config();
/* Enable the CPU Cache *//* Enable I-Cache---------------------------------------------------------*/SCB_EnableICache();/* Enable D-Cache---------------------------------------------------------*/SCB_EnableDCache();/* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */HAL_GPIO_WritePin(GPIOG,GPIO_PIN_3,GPIO_PIN_SET); /* PG3置1 */ HAL_Delay(500);HAL_GPIO_WritePin(GPIOG,GPIO_PIN_3,GPIO_PIN_RESET); /* PG3置0 *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
编译没有报错后,我们下载到GT7000中,可以看到LED红灯在不停闪烁。至此我们STM32CubeMX生成新工程完成。