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会自动配合