DMA简介

DMA前置

  • 计算机系统组成部分:运算器 控制器 存储器 输入设备与输出设备 注意 CPU:运算器+控制器 存储器:SRAM与FLASH

  • 总线矩阵 主设备:cpu DMA 从设备:存储器 外设寄存器 作用:连接芯片内部的所有主设备和所有从设备,使主设备得以访问从设备 规则:CPU和DMA同时请求访问同一个目标,比如SRAM时,总线矩阵的仲裁器会决定谁先使用这条路径,避免撞车

  • 系统总线 内容:AHB APB1 APB2 作用:cpu进行外设寄存器的读写

DMA定义 直接存储器存储,拥有SRAM FLASH 外设寄存器的访问权限,进行外设与存储器,存储器与存储器之间的数据传输,硬件自动完成,节省软件CPU资源

DMA

  • stm32f103c8t6资源: DMA1(7通道)

  • 触发: 软件触发:存储器到存储器,无触发时机 硬件触发:ADC转换完成 串口收到数据,有触发时机 ADC_DMACmd(ADC1, ENABLE); USART_DMACmd(USART1, USART_DMAReq_Tx,ENABLE);

  • 使用: 存储器与存储器:软件触发 外设与存储器: 硬件触发

  • 外设框图: CPU 通过AHB总线读写DMA寄存器 配置DMA (寄存器内每一位连接着一根导线,导线用于控制外设电路状态 -> CPU通过寄存器控制硬件电路) DMA 通过总线矩阵读写存储器和寄存器 进行数据的获取进行转运

  • DMA请求对应通道:

DMA1 通道 主要外设请求 (硬件触发源)
通道1 ADC1、TIM2_CH3、TIM4_CH1
通道2 SPI1_RX、USART3_TX、TIM1_CH1
通道3 SPI1_TX、USART3_RX、TIM1_CH2
通道4 USART1_TX、SPI2_RX、TIM1_CH4、TIM2_UP
通道5 USART1_RX、SPI2_TX、TIM1_UP、TIM2_CH1
通道6 I2C1_RX、USART2_RX、TIM3_CH1、TIM3_TRIG
通道7 I2C1_TX、USART2_TX、TIM3_CH4、TIM4_UP
  • DMA转运的条件 转运次数不为0 已使能 触发源:软件触发:DMA_Init函数结构体成员配置项DMA_M2M_Enable / 硬件触发ADC_DMACmd(ADC1);

DMA函数

DMA初始化函数:

  • 函数使用: 函数:DMA_Init 入参:DMAy_Channelx 结构体指针 返回值:无

  • DMA_InitTypedef结构体成员变量 *DMA_PeripheralBaseAddr:外设与存储器的外设地址值 存储器与存储器的存储器地址值 *DMA_PeripheralDataSize:单次数据量 DMA_PeripheralDataSize_Byte / DMA_PeripheralDataSize_HalfWord / *DMA_PeripheralDataSize_Word

*DMA_PeripheralInc:数据移出一次后是否自增 DMA_PeripheralInc_Enable / DMA_PeripheralInc_Disable *DMA_MemoryBaseAddr:存储器地址值 *DMA_MemoryDataSize:单次数据量 DMA_MemoryDataSize_Byte / DMA_MemoryDataSize_HalfWord / DMA_MemoryDataSize_Word

*DMA_MemoryInc:数据移出一次后是否自增 DMA_MemoryInc_Enable / DMA_MemoryInc_Disnable *DMA_DIR:数据传输方向 外设为起始地址DMA_DIR_PeripheralSRC / 存储器为起始地址DMA_DIR_PeripheralDST *DMA_BufferSize:数据传输次数值 *DMA_M2M: 存储器到存储器,无需转运时机,开启对应软件触发 DMA_M2M_Enable / DMA_M2M_Disable *DMA_Mode: DMA转运模式 DMA_Mode_Circular / DMA_Mode_Normal DMA一直开启,还是转运一次就停止 *DMA_Priority:此DMA通道优先级

  • 函数调用示例

DMA_InitTypeDef DMA_InitStructure;                                      
DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;                       
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; 
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;         
DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;                           
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                      
DMA_InitStructure.DMA_BufferSize = Size;                                
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;                             
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;                   
DMA_Init(DMA1_Channel1, &DMA_InitStructure);                        

DMA使能函数:

  • 函数使用: 函数:DMA_Cmd 入参:DMA ENABLE / DISABLE 返回值:无

  • 函数调用示例

DMA_Cmd(DMA1_Channel1, ENABLE);

DMA修改转运次数函数:

  • 函数使用: 函数:DMA_SetCurrentDataCounter 入参:DMAy_Channelx 转运次数 返回值:无

  • 函数调用示例

DMA_SetCurrentDataCounter(DMA1_Channel1, 7);

DMA模块函数

void MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size)

RCC_AHBPeriphClockCmd
DMA_Init
​
/*DMA失能*/
DMA_Cmd

void MyDMA_Transfer(uint16_t Size)

DMA_Cmd//DMA失能
DMA_SetCurrDataCounter
DMA_Cmd//DMA使能
​
DMA_GetFlagStatus   //等待DMA工作完成
DMA_ClearFlag       //清除工作完成标志位
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐