二十一、DMA原理介绍
1. DMA基础知识
1.1 数据传输方式
一般情况下实现存储器和外设之间的数据传输,有三种常用的方法:轮询法(polling),中断法(interrupt)以及DMA。
轮询法(polling): 在主循环中,CPU不断检查外设的相关标志位,来判断其是否需要进行数据的传输,如果需要,则CPU将数据在外设和内存之间搬运,实现数据传输。当数据传输服务请求频繁或者传输的数据量很大时,会影响其他任务的实时性。
中断法(interrupt): 当外设需要传输数据时,会触发中断,CPU会暂停正在处理的任务,转而去执行中断服务函数,接着处理外设的数据传输任务。CPU无需反复检查外设的标志位,中断机制会指示CPU何时去处理外设数据,但是依然需要CPU去完成数据搬运和传输过程。当外设数据传输服务不频繁且数据量不大时,中断法也是不错的选择。当中断连续不断且频繁发生时,中断法变得不再高效,因为在恢复主流程的执行和中断相应的上下文切换会占用大量的CPU时间。
DMA: DMA控制器是单片机中的硬件单元,它在存储器和外设之间有专用的通道,允许外设和存储器之间高效传输数据,且传输过程无需CPU参与。
综上可见DMA是一种高效的数据传输方式。
1.2 什么是DMA
DMA(Direct Memory Access)控制器提供了一种硬件的方式在外设和存储器之间或者存储器和存储器之间传输数据,而无需CPU的介入,避免了CPU多次进入中断进行大规模的数据拷贝,最终提高整体的系统性能。
DMA是一种能够在无需CPU参与的情况下,将数据块在内存和外设之间高效传输的硬件机制。实现这种功能的集成电路单元叫做DMA Controller,即DMA控制器。
DMA控制器在没有CPU参与的情况下从一个地址向另一个地址传输数据,它支持多种数据宽度,突发类型,地址生成算法,优先级和传输模式,可以灵活的配置以满足应用的需求。
1.3 HC32 DMA介绍
HC32F4A0有两个DMA控制器(DMA1,DMA2),每个DMA控制器有8个通道,一共是16个通道,每个通道可以被分配给一个或多个特定的外设进行数据传输。两个内置的总线仲裁器用来处理DMA请求的优先级问题。DMA控制器支持8位,16位和32位的数据宽度。
关于DMA的主要特性在用户手册的第384页,如图1-3-1所示(部分截图)。
1.4 DMA传输方式
HC32F4A0单片机的DMA控制器的两个主机接口分别对应存储器和外设的数据访问。 DMA支持四种传输模式,如下:
- 外设到存储器:通过外设主机接口从外设读取数据,通过存储器主机接口向存储器写入数据。比如串口的DMA接收,就是从外设到存储器。
- 存储器到外设:通过存储器主机接口从存储器读取数据,通过外设主机接口向外设写入数据。比如串口的DMA发送,就是存储器到外设。
- 存储器到存储器:通过外设主机接口从存储器读取数据,通过存储器主机接口向存储器写入数据。 存储区和外设都可以配置为源端和目的端。
- 外设到外设:通过外设主机接口从外设中读取数据,向另一个外设写入数据。
1.5 通道选择和通道优先级
每个 DMA 控制单元中包含 8 个通道, 每个通道可以独立配置传输功能。 8 个通道优先级顺序为:通道 0>通道 1>通道 2>...>通道 7。 当一个 DMA 单元有多个通道请求传输时将按照优先级顺序执行。 但已处于传输中的通道不会被打断, 高优先通道需等当前通道传输完成后才会启动。
1.6 传输地址控制
传输的源地址和目标地址可以由寄存器设定为固定、递增、递减、 重载或者不连续跳转。
- 固定: 源地址、 目标地址将在传输过程中固定不变。
- 递增及递减: 源地址、 目标地址将在每传输完成 1 个数据后根据 HSIZE 的值进行增减。例如当 HSIZE为 8bit时,地址将每次增加/减少 1, 为 16bit 时每次增加/减少 2, 为 32bit 时每次增加/减少4
- 重载: 传输指定数量的数据后, 源、 目标地址将重新返回至最初的地址设定值。 地址重载前需要传输的数据量,即重复区域的大小由寄存器 DMA_RPT 设定。
- 不连续地址传输: 传输指定数量的数据后, 源、 目标地址将跳过指定偏移量。地址跳转的偏移量,以及跳转前需要传输的数据量,即不连续区域的大小,由寄存器 DMA_SNSEQCTL/DMA_DNSEQCTL 设定。 当地址重载与不连续跳转的条件同时满足时,执行地址重载。
1.7 循环模式
DMA 传输的总数据块的个数由数据控制寄存器 DMA_DTCTLx 的 CNT 位设定。传输次数最多可设置65535 次。 每传输一个数据块寄存器值减 1, 当寄存器值减为 0 时代表本通道全部数据传输完成, 自动 清 除 通 道 传 输 许 可 位 DMA_CHEN.CHEN[] , 并 产 生 传 输 完 成 中 断 。 如 果 传 输 开 始 时DMA_DTCTLx.CNT 被设为 0,表示无限次传输,每次启动请求传输一个数据块, 但不清除通道传输许可位,也不会产生传输完成中断。
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。
1.8 中断
DMA 控制器可以产生以下 3 种中断:
- 数据块完成中断 DMA_BTCx:完成一个数据块传输后产生。
- 传输完成中断 DMA_TCx: 完成寄存器 DMA_DTCTLx.CNT 设置的传输次数后产生。
- 传输错误中断 DMA_ERR: 当启动请求溢出(即通道的上一次请求还未响应时此通道再次触发启动请求)时,或者,传输过程中发生总线错误(如访问了非法地址或受保护的地址)时产生中断,其中,总线错误时会立即终止本次传输。
2. 实验原理
DMA支持很多个外设,这里就以串口DMA接收进行介绍。
一般进行串口接收也有以下几种方式:
- 通过轮询接收数据
- 通过中断接收数据
- 通过DMA接收数据 一般使用情况可能是中断方式用的比较多,但是使用中断在数据量不大的时候使用效率是高的,但数据量一旦很大,这个效率就很低了。数据量很大的传输推荐使用DMA进行传输。
2.1 ADC+DMA接收数据思路
在检测到有数据输入的时候,直接让DMA往准备好的存储器中搬运接收到的数据,在这个过程中,CPU还是在处理自己的事,ADC的数据会不停的搬运到指定的地址中,不停的覆盖,需要时直接从指定地址中读取数据即可,且在传输过程中不占用CPU的时间,大大节省效率。