DMA

DMA(DMA_Mode_Circular):

  • 外设数据 <->        内存
  • 内存      <->         内存

DMA1:7通道

(大容量设备:DMA2:5通道)

DMA1

DMA2

简介

  • 两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道都同样支持软件触发
  • 优先级:各个通道数据同时Ready时,所在组优先级高的先,在相等优先权时由硬件决定(顺序表)
  • 模式:转移1次/不断转移
  • 中断/标志:每个通道都有 3 个事件标志(DMA 半传输,DMA 传输完成和 DMA 传输出错),
  • 数据:单次传输最大65536

    • 类型:1字节/半字(2字节)/字(4字节),独立数据源和目标数据区的传输宽度
    • Size:多少个<半字>/<字>/<字节>
  • 通道:每个通道可对应几种外设,一个通道同一时间只能使用一个外设:各个通道对应指定的外设
  • DMA和CPU不能同时使用总线,可设置竞争模式
  • 外设和存储器的传输数据量可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位
  • DMA_CCRx
    • PSIZE: 外设的传输数据单位
    • MSIZE:存储器的传输数据单位

库:

  DMA_InitTypeDef DMA_InitStructure; 
    
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA时钟

    DMA_DeInit(DMA1_Channel4);

    DMA_InitStructure.DMA_PeripheralBaseAddr =  (uint32_t) & (ADC1->DR); //外设寄存器基地址
    DMA_InitStructure.DMA_MemoryBaseAddr =(u32)data; //RAM基地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //传输方向
    DMA_InitStructure.DMA_BufferSize = length;//Size
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设的地址是否自动增加
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //RAM的地址是否自动增加

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize =DMA_MemoryDataSize_HalfWord; //传输单位!!!!!!!!


    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA_Mode_Normal; //是否不断传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //优先组
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //是不是RAM2RAM
    DMA_Init(DMA1_Channel4, &DMA_InitStructure); 
    
    DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE ); //DMA中断(别忘了NVIC)
    USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//打开外设的DMA连接
  // ADC_TempSensorVrefintCmd(ENABLE);//打开内部温度和电压传感器的DMA连接 DMA_Cmd(DMA1_Channel4,ENABLE);//开启DMA

选择用DMA发送串口数据时,DR和DMA会自动配合

原文地址:https://www.cnblogs.com/2cats/p/3583392.html