STM32F103C8T6--DMA
DMA(Direct Memory Access,直接存储器访问)是一种无需 CPU 干预,直接在外设与存储器之间、或存储器与存储器之间进行数据传输的技术。
核心优势:减少 CPU 在数据搬运上的开销,让 CPU 专注于逻辑处理,提升系统整体效率。
类型 | 起始地址 | 存储器 | 用途 |
ROM | 0x0800 0000 | 程序存储器Flash | 存储C语言编译后的程序代码 |
0x1FFF F000 | 系统存储器 | 存储BootLoader,用于串口下载 | |
0x1FFF F800 | 选项字节 | 存储一些独立于程序代码的配置参数 | |
RAM | 0x2000 0000 | 运行内存SRAM | 存储运行过程中的临时变量 |
0x4000 0000 | 外设寄存器 | 存储各个外设的配置参数 | |
0xE000 0000 | 内核外设寄存器 | 存储内核各个外设的配置参数 |

void myDMA_Init(uint32_t p1,uint32_t p2,uint16_t size){
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA在AHB总线上。
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = p1;外设起始地址
DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Word;
数据宽度:
DMA_PeripheralDataSize_Byte 8位
DMA_PeripheralDataSize_HalfWord 16位
DMA_PeripheralDataSize_Word 32位
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;地址是否自增
DMA_InitStructure.DMA_MemoryBaseAddr = p2;内存地址
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
传输方向:
DMA_DIR_PeripheralDST外设做目的地destination
DMA_DIR_PeripheralSRC外设做源source
DMA_InitStructure.DMA_BufferSize = size; 传输计数器,传输几次
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;软件触发是否开启
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;是否自动重装载(连续转换模式)
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;优先级选择
DMA_Init(DMA1_Channel1,&DMA_InitStructure);
}

外设要启动对应DMA
若软件触发
void DMA_Transfer(uint16_t num){
DMA_Cmd(DMA1_Channel1,DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel1,num);
DMA_Cmd(DMA1_Channel1,ENABLE);使能则开始转换
while(!DMA_GetFlagStatus(DMA1_FLAG_TC1))
DMA_ClearFlag(DMA1_FLAG_TC1);
确保转换完成
}
