STM32H743ZI NUCELO HAL+UART+DMA问题

大家好,给一下意见,uart+dma调了一天没法正常发送和接收:

CubeMX生成的代码,code就不发了,因为实在太简单,设定如下:


NUCLEO-H743ZI

IAR8.3

主频 HSE:8M,PLL:400M

开 Icache+Dcache 

USART3:PD9-RX,PD8-TX (板内连接STLINK VCP)

Baudrate:115200, N,8,1

DMA1 Stream0:RX(无FIFO)

DMA1 Stream1:TX(无FIFO)

DMA1 Global中断预设已开,USART3 开Global中断

uint8_t buf[100] = {"HELLO"}


备注:

因为项目从F7移植到H7,发现串口没法通讯,为了简单找出问题,特意新建了一个最简单的项目。

因为H7系列还没发布LL库,全部采样HAL。

除了宣告了一个buf数组之外,全部都cubemx预设生成。

检查过GPIO复用以及各周边的时钟已开。


测试时情况:

HAL_UART_Transmit(&huart3, buf, 5, 100);  //参100是timeout时间 --------- 正常发送

HAL_UART_Transmit_IT(&huart3, buf, 5);   --------- 正常发送

HAL_UART_Transmit_DMA(&huart3, buf, 5); -------- 发送无反应  (返回HAL_OK)


示波器跟过板载stlink vcp的引出,TxRx各pin的复用正常的


各中断的callback没有做处理,因为只做测试,据我跟踪HAL的代码,生成的中断函数都把旗标处理了


因为之前所有项目都是用LL库,移植到H7时就边移植边跟踪HAL的代码,观察dma和usart的寄存器,init后的各寄存器都正常,发送过程旗标什么的,因为时HAL都处理好,也发现不到有任何error旗标,HAL函数返回也时HAL_OK,找不到问题,看了RM0433也没看出跟F7有多大的区别,我估计是自己漏掉了一些细微不显眼的地方,或者H7在这usart和dma上有改动过?



各位给个意见和方向,我漏掉了什么?

已邀请:

lux

赞同来自:

刚刚再深入跟踪了一下,发现DMA stream的使能marco没有预期地使能SxCR的EN !


__HAL_DMA_ENABLE( ... )


#define __HAL_DMA_ENABLE(__HANDLE__) \

((IS_D2_DMA_INSTANCE(__HANDLE__))? (((DMA_Stream_TypeDef *)(__HANDLE__)->Instance)->CR |=  DMA_SxCR_EN) : \

(((BDMA_Channel_TypeDef *)(__HANDLE__)->Instance)->CCR |=  BDMA_CCR_EN))




lux

赞同来自:


lux

赞同来自:

在执行__HAL_DMA_ENABLE() 后,传输错误中断标志就置位了。之前因为没在HAL调用的子函数打断点,没发现在使能stream时出现了传输错误旗标,但找不到原因会出现这情况


继续跟进


4.PNG

lux

赞同来自:

问题已经定位到使能stream的这一步出现的错误旗标,看reference manual在AHB端口上FIFO不匹配时EN就会自动RESET为0,我到底遗漏了什么呢?我没开FIFO的。。。

lux

赞同来自:

跟进情况,现在怀疑是Domain域和DMA的问题。。。下一步跟进一下buf在SRAM的区段

lux

赞同来自:

已经解决,自己结帖!

问题原因:F7的有三个BUS Domain,其中在Domain2的DMA1和DMA2 与 DTCM区段是不相交的,所以Stream没法联系buf的变量地址。

lux

赞同来自: admin

不得不吐槽一下STM的参考说明书,很勤奋的告诉了用户MCU有什么新特性,却没有告诉你新特性和功能带来的东西在应用上有什么要注意,初始化流程的讲解几乎是复制了旧型号的东西,却没有告诉用户新改变所带来的牵连。

我确定我已经是对STM8和32有点经验的了,同时我相信这问题肯定有无数后来者,当然除了对arm内核每一代的更新很有兴趣的人会不厌烦地2去熟读内核架构。

在这里也提示一下其他STM的用家,未来主频提升甚至主流发展多核的MCU,系统时钟的速度高了,周边、FLASH、RAM和各模组的联系便会因为速度上需要配合,导致BUS和CACHE处理的复杂度增加,如果像我一样以为一个姐妹系列的新型号可以用以往的经验去无缝移植是不可能的。

其实H7的HAL更新到1.3了也没为新特性去多做些功夫,在DMA函数里面检查一下变量地址区域其实也可以的,至少不会是编译通过但硬件不许可,或许是我想多了,出了有接近一年的H7等LL库也没有第一个版本,怎么会有时间搞好HAL。


HAL方便入门,是方便了简单架构的入门,plug & play一些简单的外设。应用稍微复杂一点点,除错的时候真是个灾难。


记得:

调试除错的时候,不要忘记在HAL的子函数内关键地方下break point,看清楚HAL处理了什么旗标,这样可能会少折腾一天半天。

用F4,F7,要多了解FIFO

要用H7,要看清楚BUS和CACHE




前馈科技

赞同来自:

问题咋解决的啊大佬?

我好像遇到类似的问题了

uart2 dma发送,有些buffer可以正常发送出去,有些buffer发送出去收到却是0

碗底来块肉*Da

赞同来自:

我现在拿正点原子的H743的串口例程,修改串口1引脚从A9A10改到B14B15对接GPS模块,调试串口用串口6,用助手测试串口6是收发正常,但是对接GPS模块的串口1就是读不到数据,,,,,,想不到问题出在哪里,,,,那位大神们给指教一下,万分感谢

libenyan

赞同来自:

我在调试这块,变量地址区域,cache 等都会影响。编译通过,没有预期的响应。

fengwenjiong

赞同来自:

最后是怎么解决的呢?

怎么做出来的?肯定不能跟你们说啊,跟你们说了,你们不就知道了吗

要回复问题请先登录注册