使用STM32CubeMX创建的STM32ioc文件可以简化开发,并可以抽象出STM32外围设备的所有乏味的低级配置。然而,问题是旧板上的旧STM32Cube固件项目缺少此“ioc”配置文件。在本文中,我们将快速完成将没有ioc文件的旧STM32项目转换为包含ioc文件更现代的项目的过程。在本文的第2部分中,我们还将简要讨论如何使用STM32CubeMX中的“列出引脚兼容MCU”选项轻松地将您的STM32项目导出到不同的STM32系列。如果你在这个过程中的任何时候遇到了困难,请参阅已完成项目的链接部分[5]。

1从源代码创建STM32CubeMX ioc文件的过程:

1.1选择要转换的示例项目:

选择一个没有ioc文件的示例。对于此示例,我们选择STM32F4DISCOVERY上的数模转换器(DAC)信号生成示例。好消息是,您可以很容易地将该过程推广到任何STM32系列和示例项目。 
 

  • 示例代码可以在STM32CubeF4 MCU固件包中下载和访问:

STM32F4立方体封装示例[1]
 

  • 或者,您也可以通过STMicroelectronics的GitHub页面轻松访问该示例:

STM32F4示例信号生成GitHub页面[2]
 

1.2了解您的项目产出:

在尝试重新创建项目之前,我们应该了解在MCU上运行的示例项目的预期输出。根据“DAC_SignalsGeneration”示例的“readme.txt”,波形将在PA4上生成,用户按钮将用于在不同波形(三角形或自动扶梯)之间进行选择。
还应保留STM32F407参考手册中的DAC章节
0090令吉[6]在浏览原始源代码时非常方便。这有助于您理解辅助函数“DAC_Ch1_TriangleConfig”和“DAC_Ch1_ScaratorConfiging”中显示的配置。参考我们正在使用的外围设备的任何相关应用说明也很有帮助:例如,我们可以参考应用说明AN3126[3]。
为了更好地了解项目输出,首先在没有ioc文件的情况下运行原始项目,并使用示波器进行测量。在针脚PA4上进行测量。根据变量“ubSelectedWavesForm”设置为1还是0,您可以观察到三角波生成(图1)或自定义波(图2中类似扶梯的波形输出)。

 

图1:STM32Cube固件示例存储库的原始项目输出:引脚PA4上的STM32F407 DAC生成的三角波。
 

图1很容易使用专用的HAL API“HAL_DACEx_TriangleWaveGenerate”(UM1725[7])生成。此外,请参阅MCU参考手册中的三角波发生器部分或DAC应用说明。图2是使用DAC_CH_标量配置生成的。对于图2,我们使用数字阵列创建自定义波形,然后使用DMA外围设备将数据传输到DAC。有关如何生成自定义波形的更多详细信息,请参阅AN3126中的应用示例。类似于DAC_SignalsGeneration示例,我们使用定时器6来触发DMA传输和触发DAC步骤。信号的频率与触发源(在我们的情况下是定时器6)的频率有关。
 


图2:STM32Cube固件示例存储库中原始项目的输出:引脚PA4上的STM32F407 DAC生成的自定义波形(自动扶梯波形)。
 

1.3将外围设备配置传输到ioc文件:

接下来,我们将使用“DAC_SignalsGeneration”main.c源文件作为创建ioc项目的参考: STM32Cube4/项目/STM32F4发现/示例/DAC/DAC_SignalsGeneration/Src/main.c[4] 。
根据STM32F4DISCOVERY创建一个空的STM32CubeMX项目,如图3所示:

 

图3:ioc配置:空的STM32CubeMX项目。

 

接下来,我们将辅助函数DAC_Ch1_ScaratorConfig中显示的DAC配置传输到STM32CubeMX。例如,参考图4的第195行,触发源是定时器6。我们将这些设置传输到STM32CubeMX接口,如图6所示。
 


图4:没有ioc:DAC_Ch1_EscalatorConfig函数的原始源代码。
 

图4和图5中所示的自动扶梯和三角波函数共享一些常见的DAC配置。对于我们基于STM32CubeMX ioc配置的新项目,我们对代码进行了一些改进——如果您愿意,可以随时改进此处显示的任何代码。例如,我们删除了旧的重复配置代码,转而使用“MX_DAC1_Init()”。您还会在附加的项目文件中看到这一点。
 

图5:没有ioc:DAC_Ch1_TriangleConfig函数的原始源代码。

 

在图5中,请注意“DAC_ChannelConfTypeDef”结构(“sConfig”)中变量的内容。作为另一个例子,第228行指示必须启用输出缓冲区(如图6所示)-这为您提供了需要在STM32CubeMX接口中配置的DAC设置的线索。
 

图6:ioc配置:STM32CubeMX DAC外围配置。

 

图7显示了位于“stm32f4x_HAL_msp.c”文件内的“HAL_DAC_MspInit”内的DMA配置。
 


图7:stm32f4x_hal_msp.c文件中没有ioc:DAC DMA配置的原始源代码。

 

我们将DMA配置传输到我们的ioc文件中,如图8所示。图7中的第94行还显示了我们必须启用中断——这是由STM32CubeMX自动为我们完成的,如图9所示。
 


图8:ioc配置:DAC DMA配置。

 

图9:ioc配置:DAC中断配置。
 

对于图10,我们得出了STM32上通用硬件定时器的配置。图10中的第288-291行和第295行被转移到图11中所示的定时器配置窗口。定时器6中断未被启用,如图12所示。
 

图10:没有ioc:timer6配置的原始源代码。
 

图11:ioc配置:定时器6配置。
 

图12:ioc配置:定时器6中断配置。

 

最后,我们将图13所示的系统时钟配置转移到图14和15所示的ioc时钟树中。在图14中,我们选择HSE晶体谐振器作为我们系统的基本时钟源(如图13第144行所示)

 

图13:没有ioc:MCU时钟配置的原始源代码。

 

图14:ioc配置:像原始源代码一样选择HSE振荡器。

 

图15:ioc配置:设置时钟树,参考原始源代码中的“SystemClock_Config”函数。

1.4将主代码逻辑转移到您的新项目空间:

注意:此时,请确保保存STM32CubeMX ioc项目并在继续之前生成代码
在复制原始项目的输出之前,我们使用ioc文件将一些逻辑代码从旧的main.c转移到项目空间中的新main.c。请注意:您不能简单地复制和粘贴main.c,相反,您只会将DAC相关的逻辑转移到您的新项目中-请参阅解决方案中的示例main.c项目[5]]假如不要将BSP例程复制到您的新项目中。如项目解决方案的main.c中所示,我们做了一些小的更改,例如,我们删除了一些重复的DAC配置代码,而是在“DAC_Ch1_ScaratorConfig(void)”例程内部使用生成的“MX_DAC_Init()”调用。作为另一个例子,请观察“DAC_Ch1_ScalatorConfig”的原始源代码片段与我们新项目中的修改版本之间的差异:
其中一个例程的原始源代码:
静止的 无效的 DAC_CH_标量配置(无效的)
{
  /*##-1-初始化DAC外围设备######################################*/
  如果(HAL_DAC_Init(&DacHandle)!=HAL_OK)
{
    /*初始化错误*/
错误处理程序();
}
  /*##-1-DAC通道1配置#########################################*/
sConfig.DAC_Trigger=DAC_Trigger_T6_TRGO;
sConfig.DAC_OutputBuffer=DAC_OutputBuffer_ENABLE;
  如果(HAL_DAC_Config通道(&DacHandle,&sConfig,DACx_CHANNEL1)!=HAL_OK)
{
    /*通道配置错误*/
错误处理程序();
}
  /*##-2-启用DAC信道1和相关DMA#############################*/
  如果(HAL_DAC_Start_DMA(&DacHandle,DACx_CHANNEL1,(uint32_t*)自动扶梯8bit,6,DAC_ALIGN_8B_R)!=HAL_OK)
{
    /*启动DMA错误*/
错误处理程序();
}
}

我们在新项目中修改的例程:
静止的 无效的 DAC_CH_标量配置(无效的)
{
MX_DAC1_Init();
         /*##-2-启用DAC信道1和相关DMA#############################*/
         如果(HAL_DAC_Start_DMA(&hdc1、DAC_(uint32_t*)a自动扶梯8位,6位,DAC_ALIGN_8B_R)=暂停(_OK))
{
           /*启动DMA错误*/
错误处理程序();
}
}

 

1.5结果:

为了观察结果,您至少需要一个连接到引脚PA4的示波器通道。编译代码(完整项目见附件)并在评估板上执行代码后,您应该观察图16和图17所示的以下信号输出。

图16基于STM32CubeMX ioc配置文件的新项目的输出结果:引脚PA4上的STM32F407 DAC生成的三角波。
 

图17:基于STM32CubeMX ioc配置文件的新项目的输出结果:引脚PA4上的STM32F407 DAC生成的自定义波形(自动扶梯波形)。
 

2如果我们在采购STM32F4时遇到问题怎么办?

正在为旧的STM32Cube固件创建STM32CubMX ioc项目。示例来自STM32Cub固件更新。。。

 

3个链接:

  1. https://www.st.com/en/embedded-software/stm32cubef4.html
  2. https://github.com/STMicroelectronics/STM32CubeF4/blob/master/Projects/STM32F4-Discovery/Examples/DA...
  3. https://www.st.com/resource/en/application_note/an3126-audio-and-waveform-generation-using-the-dac-i...
  4. https://github.com/STMicroelectronics/STM32CubeF4/blob/master/Projects/STM32F4-Discovery/Examples/DA...
  5. https://www.st.com/content/dam/AME/2023/MDG/stm32f407disc-and-nucleol476-projects.zip
  6. https://www.st.com/resource/en/reference_manual/rm0090-stm32f405415-stm32f407417-stm32f427437-and-st...
  7. https://www.st.com/resource/en/user_manual/um1725-description-of-stm32f4-hal-and-lowlayer-drivers-st...