当前位置: 首页 > news >正文

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工程配置如下几步:

  1. 工程建立
  2. 确认时钟源
  3. 配置系统时钟(时钟树)
  4. GPIO功能引脚配置
  5. Cortex-M7内核基本配置(限定项)
  6. 配置工程属性
  7. 用户程序(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为例。
在这里插入图片描述

  1. 配置主时钟源:根据实际硬件选择25MHz晶振。
  2. 选择时钟源:我们选择HSE,作为 PLL 输入。
  3. PLLM(分频)‌:降低输入频率,设置为5。
  4. ‌PLLN(倍频)‌:核心倍频,设置为192。
  5. PLLP(分频)‌:生成 SYSCLK,设置为2。
  6. SYSCLK 来源‌:可选择 HSI、HSE 或 PLL,我们选 PLL 以获得最高性能
  7. 经过上面配置以后此时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生成新工程完成。

http://www.dtcms.com/a/395563.html

相关文章:

  • [国奖版本!更新完毕]2025华为杯E题数学建模研赛E题研究生数学建模思路代码文章成品:高速列车轴承智能故障诊断问题
  • 【一天一个Web3概念】区块链中的双花问题:概念、案例与防范措施
  • Java 大视界 -- Java 大数据机器学习模型在金融衍生品定价与风险管理中的应用(415)
  • STC15W4K56S4 单片机 PWM 功能详解与配置指南
  • 秋招冲刺!AI面试如何破解企业招聘难题?
  • MySQL脚本转换为StarRocks完整指南
  • Mysql常见sql语句优化
  • CPU性能优化指南:让处理器火力全开
  • 火山PromptPilot ,支持api sdk构建AI应用开发
  • 使用Rax构建小程序项目踩坑记录
  • Vue自定义滚动条的实现
  • 【鸿蒙面试题-7】鸿蒙与web混合开发
  • 基于Java语言的搭子小程序_搭子APP平台
  • implements Serializable作用和原理
  • valkey9.0之HFE
  • 基于C#的湿度上位机实现方案
  • 汽车电子模块缩写
  • 随机裁剪 vs. 中心裁剪:深度学习中图像预处理的核心技术解析
  • 四大金刚之计算机网络
  • 划重点|云栖大会「AI 原生应用架构论坛」看点梳理
  • Spark源码中的AQS思想
  • lora微调大语言模型(qwen1.5-chat)
  • 数藏APP如何选择高防IP
  • 破壁之道:构建统一EDI平台,提速芯片设计与制造协作链路
  • 【完整源码+数据集+部署教程】房屋损坏图像分割系统: yolov8-seg-fasternet-bifpn
  • 整体设计 完整的逻辑链条 之6 从简约文字到公共逻辑:四种 “空” 驱动的整体构建方法论
  • 软考中项备考经验分享
  • 基于疾风气象大模型预测“桦加沙”台风轨迹的探索与展望
  • 光谱相机在护眼灯领域的应用
  • 坤驰科技携国产化MTCA解决方案,亮相大科学装置控制系统研讨会