DMA笔记
PSIZE:外设数据宽度
MSIZE:存储器数据宽度
DMA工作流程
一个DMA控制器有8个数据流,其中的每个数据流有8个通道与其他外设连接。当一个外设请求占用某一数据流通道时,相同数据流的其他通道处于不可用状态。
8个数据流会进入仲裁器,仲裁器会先后根据软件上的数据流优先级配置、硬件上的数据流编号来选择要输出的数据流,相同软件优先级配置下,数据流编号越低越具有优先权。
DMA传输具有FIFO模式和直接模式,数据流会通过不同模式进入目标地址。在FIFO模式下,可通过配置FIFO的阈值为:1/4、1/2、3/4、满。如果数据存储量达到阈值级别时,FIFO内容将传输到目标中。该模式可用于处理源数据与目标地址数据宽度要求不同时的矛盾。
直接模式下,DMA接收到传输请求后立即传输过去。如果DMA配置为存储器到外设传输,那DMA会将一个数据存放在FIFO内,如外设启动DMA传输请求就可以马上将数据传输过去。
DMA通过AHB总线可以访问存储器、外设,同时DMA本身也是AHB从设备,通过编程接口对DMA做出配置。
DMA工作模式
DMA传输方向
- 外设到存储器传输
- 存储区到外设传输
- 存储器到存储器传输(配置和外设到存储器传输一样)
DMA模式:
- 单次模式
- 循环模式
DMA传输类型:
- 单次传输:必须通过AHB的总线仲裁多次控制才传输完成
- 突发传输(Burst):要占用AHB总线,保证要求每个数据项在传输过程不被分割,一次性把数据全部传输完才释放AHB总线
突发传输与FIFO密切相关,突发传输需要结合FIFO使用,具体要求FIFO阈值一定要是内存突发传输数据量的整数倍。
DMA使用记录(HAL库)
- DMA初始化要配置的Init结构体内容是和DMA传输的数据格式、如何处理数据等相关,因此只有初始化是不完整的;
- 如果不使用HAL里将DMA与其他外设结合的函数(比如HAL_ADC_Start_DMA),而是单独的DMA,则需要 HAL_DMA_Start 等开启函数配置源地址、目标地址;
- 如果是使用将DMA与其他外设结合的函数,则要通过 __HAL_LINKDMA 将其他外设的句柄和DMA句柄绑定以实现函数中的互通使用(实测ADC中的 HAL_DMA_Start 也有同样效果),再调用与DMA结合的开启函数。
浙公网安备 33010602011771号