STM32 DMA传输

来源:互联网 发布:js控制class样式 编辑:程序博客网 时间:2024/05/13 01:54


DMA数据传输要考虑以下几点:

1. 数据源地址、数据 目的地址

2. 数据宽度 

3. 数据传输方向

4. 数据传输字节数以及模式(循环模式或者单次模式)

5. 数据传输结束后是否发生中断或者产生传输半中中断


  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA1外设    //配置串口2 DMA  DMA_DeInit(DMA1_Channel7);    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR; //定义了外设地址    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)TxBuffer1; //定义了目的地址    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;    //外设作为数据的目的地    DMA_InitStructure.DMA_BufferSize = 8;     //传送数据缓存大小为8    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //定义地址在传送后是否会递增    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存到内存后地址递增    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//数据宽度是8位,字节型    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;   //工作在正常缓存模式,还有一种是循环缓存模式    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //通道拥有高优先级    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//用来设置是否是内存到内存传输  //DMA_Init(DMA1_Channel7, &DMA_InitStructure);  

1. 数据地址是uint32_t数据类型,对数据地址赋值钱要进行强制类型转换。

    获取外设数据地址的方法可以直接使用地址(u32)0x40004404,也可以使用(u32)&USART2->DR,显然第二种方法更简单实用。

2.传输方向是由SRAM传输到USART2->DR,由于USART2->DR只能接受8位的数据。所以总线数据宽度为8位,每次DMA传输传输8bit数据。

 DMA_BufferSize指的是DMA的传输次数,并不是指DMA传输的字节数。传输字节数=传输次数*每次传输字节数。

3.数据传输方式为普通单次模式和循环模式。每传输一次,DMA_BufferSize自动减1,当为0时,DMA传输结束。如果为循环模式,DMA_BufferSize自动重载,DMA重新启动。但是如果为单次模式,DMA传输会结束,如果想再次启动DMA传输,必须要关闭DMA通道,重新进行配置DMA_BufferSize,重新使能DMA通道。

4.在英文参考手13章节注意以下传输宽度的不同设置会产生不同的传输效果。





0 0
原创粉丝点击