为什么init调用的顺序在STM32CubeIDE的问题?



使用CubeIDE 1.7.0为采用DMA的Nucleo-H723ZG板编写一个简单的UART程序。发出UART DMA接收呼叫,等待Mac OSX主机(CoolTerm)上的串行端口应用程序的输入。回调回显接收到的数据。

当文本信息发送到董事会时,除了0之外什么都不回。

我注意到CubeMX在UART初始化调用(MX_USARTx_UART_Init())之后生成了DMΑ初始化调用(MX_DMA_Init())。

通过颠倒这两个调用的顺序,代码可以完美地工作!

这是我的错误,在设置中遗漏了什么,还是它是一个MX错误?

此问题仅影响MacOSX大Sur上的CubeIDE 1.7.0用户。在Windows下没有问题,代码生成器正确地将DMA初始化调用定位在USART之前。

当使用MX配置器时,外围设备初始化调用是按照输入顺序生成的。当设置USART使用DMA来执行数据传输时,需要生成两个外设的初始化:USART和DMA设备。由于USART是选择的两个外设中的第一个,因此USART初始化调用在DMA初始化调用之前生成。

然而,当时我不知道,USART需要设置一个DMA寄存器,该寄存器必须启用其时钟。因此,DMA初始化必须在USART初始化之前完成。这就是我的问题。

知道这一点,在MX项目管理器选项卡中,高级设置选项卡提供了重新安排这些初始化调用顺序的选项,一切都很好!

这是一个bug。然而,使用Nucleo-H743ZI2与USART DMA没有乱序初始化的问题。到目前为止,这种病毒仅限于核h723zg !

CubeMX6.3.0为Nucleo-G474RE生成的固件做相同的初始化反转(DMA之前的UART),导致代码无响应。

最新更新