使用STM32CubeMX生成配置代码的文件结构

1、前言

在阅读 UM1718 文档的时候,发现 CubeMX 有个比较好的功能,可以用“.extSettings”文件配置生成代码的工程文件结构。只需要要配置“.extSettings”文件一次,后续不管使用哪个IDE(只要是 CubeMX 支持的),都不需要再手动配置文件结构或包含头文件路径了,并且可以保持对各个 IDE(只包括 CubeMX 支持的)配置的一致性,减少工作量。也有客户询问怎么添加工程文件的问题,考虑到可能有些同学不太了解这个功能,所以本文对这个功能进行介绍。

2、. extSettings 文件的作用

“.extSettings”文件是对 CubeMX 配置的补充,是在 CubeMX 配置的基础上进行的额外配置,不是替换 CubeMX 的配置,这点需要注意。
总体来说,“.extSettings”文件中的配置包含三部分,分别是[ProjectFiles], [Groups]和[Others]

2.1. [ProjectFiles]

[ProjectFiles]这个部分主要是用来包含一些目录,例如头文件存放的目录。

  • 【语法】:HeaderPath=< include directory 1 path> ; < include directory 1 path>
  • 【示例】:HeaderPath=…/BSP/STM32H735G-DK
  • 【说明】:这里的路径是相对于“.cproject”或“.project”文件(如果生成的是 CubeIDE 的工程代码的话)的相对路径。如果生成的是其他 IDE 的工程代码,则这个路径是相对于其他工程文件的相对路径,例如“.eww”文件(IAR)或“.uvprojx”文件(KEIL)。
  • 【效果】:在“.extSettings”文件中添加示例中的内容,重新生成代码后,效果如图 1,红框部分是通过 “.extSettings”文件包含的目录,可以看到已经被包含到工程中

图1.配置[ProjectFiles]后 CubeIDE 工程包含的目录
在这里插入图片描述

2.2. [Groups]

这个部分主要是用来在工程中创建文件组并且将文件添加到文件组中,用来组织工程的文件结构。

  • 【语法】:< Group name> = < file pathname1>;< file pathname2>
  • 【示例】:Drivers/BSP/STM32H735G-DK=…/BSP/STM32H735G-DK/stm32h735g_discovery.c;
  • 【说明】:是工程中的文件组名(若不存在则会自动创建);是文件路径。示例中语句的作用是,嵌套创建“Drivers/BSP/STM32H735G-DK”这个文件组(可以多级嵌套创建),并且将“stm32h735g_discovery.c”文件添加进这个文件组中。可以在一个文件组中添加多个文件,只要多个之间通过分号(“ ;”)隔开即可。
  • 【效果】:在“.extSettings”文件中添加示例中的内容,重新生成代码后,效果如图 2。

图2.配置[Groups]后 CubeIDE 工程的文件结构
在这里插入图片描述

2.3. [Others]

[Others]这个部分主要是用来使能一些 HAL 模块和添加一些预处理定义语句。

2.3.1. 添加 HAL 模块

  • 【语法】:HALModule = < ModuleName1>; < ModuleName2>;
  • 【示例】:HALModule=SPI;ADC;
  • 【效果】:在“.extSettings”文件中添加示例中的内容,重新生成代码后,如果使用 H7 系列的芯片创建的工程,则会自动在 “stm32h7xx_hal_conf.h”文件(如果是其他系列的芯片的话,名字会略有区别)中添加“HAL_SPI_MODULE_ENABLED”和HAL_ADC_MODULE_ENABLED”这两个宏定义,作用是在这个文件中包含 SPI 与 ADC 的头文件。如图 3 所示:

图3.配置[Other]的 HALModule 后 HAL 的配置文件中自动添加的内容
在这里插入图片描述

2.3.2. 添加预处理定义语句

  • 【语法】:Define = < define1_name>;< define2_name>
  • 【示例】:Define=TEST_STM32H735G_DEMO
  • 【效果】:在“.extSettings”文件中添加示例中的内容,重新生成代码后,可以看到在“.extSettings”文件中配置的预定义语句已经被添加到工程中了。

图4.配置[Other]的 Define 后自动在工程中添加的预处理语句
在这里插入图片描述

3、使用实例

下面的实例基于 STM32H735G-DK 板,使用“STM32Cube_FW_H7_V1.10.0”中的BSP 驱动。要达到的目的是使板子上的 LED1 每隔 0.5S 切换一次亮/灭状态。下面是实现的步骤:

3.1.1. 创建 CubeMX 配置文件

使用 STM32CubeMX 创建 STM32H735IGK6(STM32H735G-DK)的工程,其他配置都使用默认值即可,并保存这个配置文件。如图 5 所示:
图5.保存 CubeMX 产生的配置文件
在这里插入图片描述

3.1.2. 添加 BSP 文件

将“STM32Cube_FW_H7_V1.10.0/ Drivers”路径下的“BSP ”目录及其文件都复制到工程目录下(这里是复制到.ioc 文件相同目录下,您也可以根据自己需要复制到其他地方,只要在“.extSettings”文件中包含即可)。如图 6 所示:
图6.复制“BSP”到工程目录下
在这里插入图片描述
修改 BSP 中“stm32h735g_discovery_conf_template.h”文件的文件名修改为“stm32h735g_discovery_conf.h”
图7.添加 BSP 的配置文件
在这里插入图片描述

3.1.3. 创建.extSettings 文件

在.ioc 文件同级目录下创建 “.extSettings”文件。如下图所示:
图8.添加.extSettings 文件
在这里插入图片描述
注意:.extSetting 文件一定要放在.ioc 文件的同一目录下

3.1.4. 修改.extSettings 文件的内容

  1. 因为要对 GPIO 进行操作,BSP 文件是基于 HAL 库的,所以需要使用 GPIO 的 HAL 库(避免 GPIO 模块尚未使能,这里使能 GPIO 模块)。在[Others]部分需要添加的内容为:HALModule=GPIO
  2. 添加 BSP 中需要包含的目录。所以在[ProjectFiles]中需要添加的内容为:HeaderPath=…/BSP/STM32H735G-DK
  3. 将 BSP 中的文件添加到工程中,因为只需要操作 LED,所以需要添加“stm32h735g_discovery.c”文件即可,并创建文件组“STM32H735G-DK”。所以在[Groups]中需要添加的内容为:Drivers/BSP/STM32H735G-DK=…/BSP/STM32H735G-DK/stm32h735g_discovery.c;
    综合上面三点,在“.extSettings”文件中需要添加的内容为:
[ProjectFiles]
HeaderPath=../BSP/STM32H735G-DK
[Groups]
Drivers/BSP/STM32H735G-DK=../BSP/STM32H735G-DK/stm32h735g_discovery.c;
[Others]
Define=
HALModule=GPIO

3.1.5. 使用 CubeMX 生成适用不同 IDE 的工程代码

使用 CubeMX 生成代码 (GENERAGE CODE),分别生成 CubeIDE,IAR 和 KEIL 的工程代码。
图9.使用 CubeMX 生成代码
在这里插入图片描述
生成代码后,可以看到不同 IDE 的工程文件结构如下图:
图10. STM32CubeIDE
在这里插入图片描述
图11. IAR
在这里插入图片描述
图12. KEIL
在这里插入图片描述
可以从上面图中看到,“ stm32h735g_discovery.c”文件已经被添加到工程中,BSP的目录也已经被包含到工程中。

3.1.6. 添加代码实现功能

  1. 包含 “stm32h735g_discovery.h”头文件。
    图13. 包含 “stm32h735g_discovery.h”
    在这里插入图片描述
  2. 使用 BSP 初始化 LED1 的配置。
    图14. 使用 BSP 初始化 LED1 的配置
    在这里插入图片描述
  3. 添加 LED1 的翻转操作。
    图15. 添加 LED 的翻转操作
    在这里插入图片描述
    结果:使用这三种 IDE 进行编译下载后都可以实现 LED1 每隔 0.5S 切换亮/灭状态的操作。

4、小结

使用“.extSettings”文件配置工程的文件结构,可以做到一次配置,多种平台可用的效果,并可以保持配置的一致性。
【注意】:“.extSettings”文件一定要放在.ioc 文件相同的目录下。


本文档参考ST官方的《【应用笔记】LAT1208+使用STM32CubeMX生成配置代码的文件结构》文档。
参考下载地址:https://download.csdn.net/download/u014319604/88971318

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用STM32CubeMX生成的基本代码,用于通过PWM控制舵机: 1. 配置PWM定时器: ```c /* TIM2 init function */ static void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 20000; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 1500; // 初始值为1.5ms sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim2); } ``` 2. 配置PWM输出引脚: ```c /* TIM2 GPIO Configuration PA0/WKUP ------> TIM2_CH1 */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin : PA0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 3. 在main函数中启动PWM定时器: ```c int main(void) { /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } ``` 4. 通过修改`TIM2->CCR1`的值来控制舵机的位置,值的范围一般为500-2500,对应0.5ms-2.5ms的脉冲宽度。例如,将舵机转动到中心位置(1.5ms脉宽)的代码如下: ```c TIM2->CCR1 = 1500; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值