本帖最后由 lc115647 于 2024-11-2 16:58 编辑
一、概念介绍
(1)DMA:直接存储器存取(DMA)(Direct Memory Access)也是一个挂载在AHB总线上的外设,用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。APM32E103有两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道)
二、主要特征
- DMA1有7个通道,DMA2有5个通道
- 数据传输有三种:外设到存储器、存储器到外设、存储器到存储器
- 每个通道都有连接专门的硬件DMA请求
- 多个请求同时发生时支持软件优先级和硬件优先级
- 每个通道都有3个事件标志和独立中断
- 支持循环传输模式
- 数据传输数目可编程,最大到65535
三、DMA映射表
外设与DMA绑定通道可参考下面映射表进行配置
四、代码介绍1、初始化串口1,同时使能串口的TX RX DMA功能
2、根据上面映射表初始化UASRT1 发送接收DMA
- 需要注意的有这个,数据传输方向,这个是从外设到内存。因为我们是把数据从串口传到内存数组里面,因此用这个
接收时外设地址寄存器不变,是因为串口中断一次只接收一个字节的数据,每次取出来后把下一个收到的数据放在这里,因此它的地址是不需要变化,也就是地址寄存器不变。
内存地址递增,因为内存地址给的是一个数组地址,数组里面连续存储的数据地址是递增变化的。如果使用地址不变,则会将数据一直放在数组的第一位,数据会被覆盖掉。
- 发送时是从内存地址传送到外设寄存器地址,所以配置需要修改下
3、编写串口中断处理函数
注意:空闲中断标志位清除方式比较特殊
由于DMA配置的正常模式,查看手册,DMA传输数量寄存器里的值表示剩余待传输的字节数,因此在中断中使用 定义的总数-寄存器中的数值=表示收到的个数。
这个地方需要特别注意,否则会计算错收到的字节数,同时每次配置都必须先关闭DMA功能,才能写入
五、使用验证
烧录程序后,验证效果
|