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条回答
wang222221
1楼-- · 2019-07-14 21:03
有没有发生指针溢出?如果指针溢出了,那么内存数据是会被覆盖掉的。
qwer38
2楼-- · 2019-07-14 22:15
wang222221 发表于 2019-1-15 13:51
有没有发生指针溢出?如果指针溢出了,那么内存数据是会被覆盖掉的。

我现在也在查是不是指针溢出了,可能性是有的,但是我还是想知道还有什么其他可能会导致NDTR直接错误
1102sc
3楼-- · 2019-07-15 03:43
                                             
wang222221
4楼-- · 2019-07-15 04:22
qwer38 发表于 2019-1-15 14:00
我现在也在查是不是指针溢出了,可能性是有的,但是我还是想知道还有什么其他可能会导致NDTR直接错误

如果内存使用量不大可以尝试用 CCM 代替系统 SRAM 作堆栈和程序本地数据用,把大部分的 SRAM 留给 DMA。这样既有助于性能(DMA 不占用 CCM 总线时间),又可以避免 DMA 意外抹除 CCM 数据。
huazhe
5楼-- · 2019-07-15 06:17
 精彩回答 2  元偷偷看……
qwer38
6楼-- · 2019-07-15 06:56
wang222221 发表于 2019-1-15 14:16
如果内存使用量不大可以尝试用 CCM 代替系统 SRAM 作堆栈和程序本地数据用,把大部分的 SRAM 留给 DMA。这样既有助于性能(DMA 不占用 CCM 总线时间),又可以避免 DMA 意外抹除 CCM 数据。

谢谢前辈提示,查了一下CCM,很好,可以用。
但是,必须查出来问题,因为低温(东北室外)确实出现这个问题了,必须先定位问题,然后再想解决方法,如果是程序逻辑问题,用CCM也会出问题。

一周热门 更多>