STM32-DMA 04
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 //清除工作完成标志位
更多推荐

所有评论(0)