DMA
简单来说就是可以减轻CPU工作量
通道的选择与你要用的外设有关
具体参数:添加链接描述
例子:
dma初始化
void DMA_ConfigurAction(void) {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 ,ENABLE); //时钟使能
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40011004; //填寄存器地址
// 寄存器地址 + 基地址加偏移地址 例:USART_DR 0x40011004
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)arr; //内存基地址 拷贝到USART1的数据寄存器 DMA_Memory0BaseAddr是f4的 DMA_MemoryBaseAddr是f1的
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //存储器到外设模式; //DMA_DIR 规定了外设是作为数据传输的目的地还是来源
DMA_InitStructure.DMA_BufferSize = 2000; ///数据传输量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储器内存地址增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //传输大小单位 外设数据长度:8 位
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; 存储器数据长度:8 位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // Circular发送,循环发
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //中等优先级
//DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //如果设置了为内存到内存
DMA_Init(DMA2_Stream4, &DMA_InitStructure); //选择通道4
DMA_Cmd(DMA2_Stream4, ENABLE); //使能
}
为什么这里要选择通道4,具体看通道图,因为我们要使用串口的发送功能
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // Circular发送,循环发
是循环发送用于方便测试,可以使用正常模式
这里设置的是内存地址到外设
int main() {
int i =0;
led_ConfigurAction();
SysTick_ConfigurAction();
//PE2_EXIT_ConfigurAction();
Uart1_Configuraction();
DMA_ConfigurAction();
for(i=0;i<2000;i++) {
arr[i] = 'A'; //内存20000个数通过dma发到外设
}
USART_DMACmd(USART1,USART_DMAReq_Tx, ENABLE); //使能或者失能指定 USART 的 DMA 请求
while(1);
}
这里的arr是内存地址为2000,我写到了dma的.h文件里 extern unsigned char arr[2000];