为什么 init 调用的顺序在 STM32CubeIDE 中很重要?
Why does the sequence of init calls matter in STM32CubeIDE?
使用 CubeIDE 1.7.0 为使用 DMA 的 Nucleo-H723ZG 板编写一个简单的 UART 程序。发出 UART DMA 接收调用,等待来自 Mac OSX 主机 (CoolTerm) 上的串行端口应用程序的输入。回调回显接收到的数据。
当一条短信被发送到看板时,只有零被回显。
我注意到 CubeMX 在 UART 初始化调用 (MX_USARTx_UART_Init()) 之后生成了 DMΑ 初始化调用 (MX_DMA_Init())。
通过颠倒这两个调用的顺序,代码完美运行!
这是我的错误,是设置中遗漏了什么,还是 MX 错误?
此问题仅影响 MacOSX Big Sur 上的 CubeIDE 1.7.0 用户。在 Windows 下没有问题,代码生成器正确地将 DMA 初始化调用定位在 USART 之前。
使用 MX 配置器时,外设初始化调用按输入的顺序生成。设置 USART 以使用 DMA 执行数据传输时,需要生成两个外设的初始化:USART 和 DMA 设备。由于 USART 是所选择的两个外设中的第一个,因此在 DMA 初始化调用之前生成 USART 初始化调用。
然而,当时我并不知道,USART 需要设置一个必须启用其时钟的 DMA 寄存器。因此,DMA 初始化必须在 USART 初始化之前完成。因此我的问题。
知道这一点,在 MX 项目管理器选项卡中,高级设置选项卡提供了重新排列这些 init 调用顺序的选项,一切都很好!
所以这是一个错误。然而,使用带有 USART DMA 的 Nucleo-H743ZI2 不存在乱序初始化问题。到目前为止,该错误仅限于 Nucleo-H723ZG!
CubeMX6.3.0 为 Nucleo-G474RE 生成的固件进行了相同的初始化反转(UART 在 DMA 之前)并导致无响应代码。
使用 CubeIDE 1.7.0 为使用 DMA 的 Nucleo-H723ZG 板编写一个简单的 UART 程序。发出 UART DMA 接收调用,等待来自 Mac OSX 主机 (CoolTerm) 上的串行端口应用程序的输入。回调回显接收到的数据。
当一条短信被发送到看板时,只有零被回显。
我注意到 CubeMX 在 UART 初始化调用 (MX_USARTx_UART_Init()) 之后生成了 DMΑ 初始化调用 (MX_DMA_Init())。
通过颠倒这两个调用的顺序,代码完美运行!
这是我的错误,是设置中遗漏了什么,还是 MX 错误?
此问题仅影响 MacOSX Big Sur 上的 CubeIDE 1.7.0 用户。在 Windows 下没有问题,代码生成器正确地将 DMA 初始化调用定位在 USART 之前。
使用 MX 配置器时,外设初始化调用按输入的顺序生成。设置 USART 以使用 DMA 执行数据传输时,需要生成两个外设的初始化:USART 和 DMA 设备。由于 USART 是所选择的两个外设中的第一个,因此在 DMA 初始化调用之前生成 USART 初始化调用。
然而,当时我并不知道,USART 需要设置一个必须启用其时钟的 DMA 寄存器。因此,DMA 初始化必须在 USART 初始化之前完成。因此我的问题。
知道这一点,在 MX 项目管理器选项卡中,高级设置选项卡提供了重新排列这些 init 调用顺序的选项,一切都很好!
所以这是一个错误。然而,使用带有 USART DMA 的 Nucleo-H743ZI2 不存在乱序初始化问题。到目前为止,该错误仅限于 Nucleo-H723ZG!
CubeMX6.3.0 为 Nucleo-G474RE 生成的固件进行了相同的初始化反转(UART 在 DMA 之前)并导致无响应代码。