没志青年
发布于 2025-07-25 / 27 阅读
0

32单片机 - DMA

DMA(直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输,数据的传输无须 CPU 干预,这就节省了CPU的资源来做其他操作。

外设与 DMA 的映射:

在参考手册的DMA章节中可以找到这种表。

注意事项:

(1)如果不是循环模式,DMA 在搬运了指定长度的数据后就会关闭。

因此每次传输前,必须重新设置要传输的长度。

设置 DMA 传输的长度一般为缓冲区的长度,假如缓冲区 50 个字节。

若串口接收了 30 个字节,那还剩 20 个字节,如果不重新设置,下一次只能接收 20 个字节的数据,其它的数据消失。

(2)DMA 数据宽度和外设数据宽度不需要对应。

DMA 不关心外设和传感器通信的数据宽度是多少,它只会按照你的要求,一次去外设搬运多少位数据到内存中。

假设外设数据是16 位的,可以让DMA一次搬运16位,也可以让它一次搬运8位,那就需要两次。

DMA 一次最大数据传输量受限于NDTR 这个 16 位寄存器

因此:

  • 数据大小为 8 位 → 最大传输字节 = 65535 Byte

  • 数据大小为 16 位 → 最大传输字节 = 65535 × 2 = 131070 Byte

  • 数据大小为 32 位 → 最大传输字节 = 65535 × 4 = 262140 Byte

优先级分为:非常高优先级、高优先级、中优先级、低优先级

如果两个请求具有相同的软件优先级,则编号低的 stream 优先于编号高的stream。例如,Stream 2 的优先级高于 Stream 4。

DMA 配置,牢记:

数据传输方向、源地址、目标地址,数据长度,地址是否自增、是否循环、中断

DMA 事件和中断:

中断

事件标志

传输完成

TCIF

传输错误

TEIF

半传输

HTIF

FIFO 上溢/下溢

FEIF

直接模式错误

DMEIF