发新帖我要提问
12
返回列表
打印
[其他ST产品]

STM32---UART使用DMA数据传输

[复制链接]
楼主: 尽快回复过
手机看帖
扫描二维码
随时随地手机跟帖
21
尽快回复过|  楼主 | 2023-9-30 23:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览

使用特权

评论回复
22
尽快回复过|  楼主 | 2023-9-30 23:30 | 只看该作者
图片上使用的缩写
R: 下次读取数据的位置
W: DMA 将在内存中保存下一个字节位置
HT: 由 DMA 触发的半传输事件
TC: 由 DMA 触发的传输完成事件
IDLE: UART是否空间

使用特权

评论回复
23
尽快回复过|  楼主 | 2023-9-30 23:30 | 只看该作者
DMA
DAM采用循环模式(Circular mode)
20字节的数据缓存,HT事件表示已接收10个数据

使用特权

评论回复
24
尽快回复过|  楼主 | 2023-9-30 23:30 | 只看该作者
会出现的情况
A:程序由 HT 中断通知,可以读取/处理数据,由 UART 接收

使用特权

评论回复
25
尽快回复过|  楼主 | 2023-9-30 23:30 | 只看该作者
B:DMA 传输接下来的 10 个字节。 在这种情况下,读取/处理到最后一个数据后,因为是Circular mode所以会自动回到开始的位置。

使用特权

评论回复
26
尽快回复过|  楼主 | 2023-9-30 23:30 | 只看该作者
C:DMA接收了10个字节,但不是对齐的,无法触发HT/TC事件。 .

当剩余6个数据接收完成后,才会触发TC事件
使用UART的IDLE检测,来接收剩余的4个字节,当IDLE中断后说明已经没有数据传输了,来完成数据接收,或者使用数据超时也可以

使用特权

评论回复
27
尽快回复过|  楼主 | 2023-9-30 23:30 | 只看该作者
D:DMA接收了10个字节数据,不是对齐的缓存读位置在下,写位置在上。

通过TC事件可以接收4个字节
使用UART的IDLE检测,来接收剩余的6个字节,当IDLE中断后说明已经没有数据传输了,来完成数据接收,或者使用数据超时也可以

使用特权

评论回复
28
尽快回复过|  楼主 | 2023-9-30 23:30 | 只看该作者
E:如果我们只依赖 IDLE检测。 如果在突发中接收到的字节数超过了 DMA 所能容纳的字节数,会发生什么? 在这种情况下,可以容纳 20 个字节,但是我们在突发中收到了 30 个字节如何处理呢

IDLE事件说明已经接收完最后一帧数据。
数据的红色部分表示溢出前一个数据的最后一个数据 = 我们丢失了 10 个字节
避免采用轮询 DMA,而是 更改比接收突发数据可能发生的更快,或者通过使用 HT/TC 事件

使用特权

评论回复
29
尽快回复过|  楼主 | 2023-9-30 23:31 | 只看该作者
UART IDLE 线路检测 + DMA HT&TC 中断
应用程序通过 IDLE 线路检测或 DMA TC/HT 事件获得通知
应用程序只有在收到 3 个中断中的任何一个时才必须处理数据
P:应用程序不需要轮询新的变化
P:应用程序接收事件中断
P:应用程序可能会进入低功耗模式以延长电池寿命(如果使用电池)
C:在中断中读取(处理)数据。 我们努力尽快执行中断程序
C:长时间中断执行可能会破坏应用程序中的其他兼容性
传入数据的处理来自 2 个中断向量,因此重要的是它们不会相互抢占。 将两者设置为相同的抢占优先级!

使用特权

评论回复
30
Henryko| | 2023-10-10 13:24 | 只看该作者
用DMA后有什么优势啊

使用特权

评论回复
31
AloneKaven| | 2023-10-10 17:31 | 只看该作者
轮询效率太低了

使用特权

评论回复
32
Stahan| | 2023-10-11 20:39 | 只看该作者
轮询是怎么保证在第一时间接收到数据的啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则