DMA对串口数据进行循环接收跑飞了

2019-07-14 14:34发布

如题,初始化DMA和串口后,DMA对串口数据进行循环接收。

程序用CubeMX生成的,DMA必须用中断,实际使用串口空闲中断对数据进行记录的,DMA中断是空的。

问题,就是程序大约跑了9个小时,然后跑死了,当时用JTAG观察的数据,发现DMA的hdma_uart8_rx.Instance->NDTR这个量已经到达了6031105这个值,实际我设置的只有600.

串口数据基本没问题,而且我确实是对数据进行10ms一处理。

那么这个DMA跑飞究竟因为什么呢?

有什么样的原因会导致DMA的NDTR寄存器溢出呢?

其他函数越界?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
qwer38
1楼-- · 2019-07-15 11:52
huazhe 发表于 2019-1-15 14:31
NDTR是可以重载的,围绕那个数据变量再看看。。。

查了一下内存map,发现hdma_uart8_rx地址前面,有这个DMA缓存的BUFFER地址,应该是BUFFER溢出,将hdma_uart8_rx进行了覆盖。
但是hdma_uart8_rx中NDTR是以指针形式传递的,意思是hdma_uart8_rx的地址是0x20002130,但是
hdma_uart8_rx中NDTR是存在图中DMA1的内存中。我特别想知道,如果BUFFER真的溢出了,会将DMA1中的内存覆盖吗?
应该不会吧?
那么NDTR是如何溢出的,是JTAG出现数据传输问题?

huazhe
2楼-- · 2019-07-15 12:56
qwer38 发表于 2019-1-15 14:50
查了一下内存map,发现hdma_uart8_rx地址前面,有这个DMA缓存的BUFFER地址,应该是BUFFER溢出,将hdma_uart8_rx进行了覆盖。
但是hdma_uart8_rx中NDTR是以指针形式传递的,意思是hdma_uart8_rx的地址是0x20002130,但是
hdma_uart8_rx中NDTR是存在图中DMA1的内存中。我特别想知道,如果BUFFER真的溢出了,会将DMA1中的内存 ...

如果说溢出发生跑飞,会发生什么谁知道呢?

一周热门 更多>