完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如题,初始化DMA和串口后,DMA对串口数据进行循环接收。
程序用CubeMX生成的,DMA必须用中断,实际使用串口空闲中断对数据进行记录的,DMA中断是空的。 问题,就是程序大约跑了9个小时,然后跑死了,当时用JTAG观察的数据,发现DMA的hdma_uart8_rx.Instance->NDTR这个量已经到达了6031105这个值,实际我设置的只有600. 串口数据基本没问题,而且我确实是对数据进行10ms一处理。 那么这个DMA跑飞究竟因为什么呢? 有什么样的原因会导致DMA的NDTR寄存器溢出呢? 其他函数越界? |
|
相关推荐
9个回答
|
|
我用的F767,一直在想是不是cance总线出问题了,我打开了D和I总线
|
|
|
|
有没有发生指针溢出?如果指针溢出了,那么内存数据是会被覆盖掉的。
|
|
|
|
我现在也在查是不是指针溢出了,可能性是有的,但是我还是想知道还有什么其他可能会导致NDTR直接错误 |
|
|
|
|
|
如果内存使用量不大可以尝试用 CCM 代替系统 SRAM 作堆栈和程序本地数据用,把大部分的 SRAM 留给 DMA。这样既有助于性能(DMA 不占用 CCM 总线时间),又可以避免 DMA 意外抹除 CCM 数据。 |
|
|
|
NDTR是可以重载的,围绕那个数据变量再看看。。。
|
|
|
|
wang222221 发表于 2019-1-15 14:16 谢谢前辈提示,查了一下CCM,很好,可以用。 但是,必须查出来问题,因为低温(东北室外)确实出现这个问题了,必须先定位问题,然后再想解决方法,如果是程序逻辑问题,用CCM也会出问题。 |
|
|
|
查了一下内存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出现数据传输问题? |
|
|
|
qwer38 发表于 2019-1-15 14:50 如果说溢出发生跑飞,会发生什么谁知道呢? |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
hal库中i2c卡死在HAL_I2C_Master_Transmit
881 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1402 浏览 1 评论
516 浏览 0 评论
1020 浏览 0 评论
1149 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-3 05:18 , Processed in 0.758569 second(s), Total 88, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号