硬汉嵌入式论坛

 找回密码
 立即注册
查看: 578|回复: 7
收起左侧

[技术讨论] STM32F07USART+DMA程序发送问题

[复制链接]

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2023-5-8 19:19:11 | 显示全部楼层 |阅读模式
写了一个功能是 串口1 接收在串口2发送的程序,调用的是DMA。但是出现的问题很奇怪有一些不应该存在的乱码数据
有写过类似的知道是为什么会出现这样的情况吗


Snipaste_2023-05-08_19-17-43.jpg
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-5-8 19:19:52 | 显示全部楼层
有知道的大佬方便的话可以帮我解一下疑惑
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-5-9 09:03:28 | 显示全部楼层
目前加延时解决了
回复

使用道具 举报

3

主题

335

回帖

344

积分

高级会员

积分
344
发表于 2023-5-9 09:57:39 | 显示全部楼层
本帖最后由 glory 于 2023-5-9 09:59 编辑

原因出在你test2[]数组是在堆栈上分配的,中断函数退出后,堆栈若被其它中断使用(注意中断函数的堆栈是复用的,由MSP指定),此时数组的数据就被破坏了。而同时DMA却还在进行中呢。
这是程序员没有修炼基本功的常见错误。
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-5-9 12:02:45 | 显示全部楼层
glory 发表于 2023-5-9 09:57
原因出在你test2[]数组是在堆栈上分配的,中断函数退出后,堆栈若被其它中断使用(注意中断函数的堆栈是复 ...

我后来又尝试了一个方法解决,不用sizeof而转用strlen((const char *),这样就没有出现一开始那个情况了。因为我发现在中断里加了延时是不正确的操作,会把程序卡死。不过你说得这个中断和堆栈复用的情况的确是我没了解过的东西我得去了解下了,多谢了大佬
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2023-5-9 15:27:43 来自手机 | 显示全部楼层
函数里的局部变量在初始化的时候是有脏数据的,你没用到的那部分空间初始值应该不是0,你可以在线调试的时候在那打个断点看一下数组里具体的值
回复

使用道具 举报

1

主题

35

回帖

43

积分

新手上路

积分
43
发表于 2023-5-11 08:08:27 | 显示全部楼层
发送的数据应该用全局的或者静态数组,函数退出的时候,DMA还在发送,而局部的函数变量空间已经释放了
回复

使用道具 举报

3

主题

49

回帖

58

积分

初级会员

积分
58
发表于 2023-5-12 09:20:45 | 显示全部楼层
4楼大哥的解释完美,确实是这样的,发送的数据放在中断中,很容易出现意想不到的问题!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-26 06:13 , Processed in 0.281550 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表