STM32之DMA:
typedef struct
{
__IO uint32_t CCR; //复位
__IO uint32_t CNDTR; //传输的数据量
__IO uint32_t CPAR; //外设地址
__IO uint32_t CMAR; //存储器地址
} DMA_Channel_TypeDef;
用二维数组做DMA缓冲的串口发送:
发送函数先送到指定的二维缓冲数组中;
在定时回调函数里面看如果数组的前2个字节(长度信息不为0),就将其该数组的地址和长度信息给DMA的相关配置寄存器即启动DMA发送
DMA的buf与BURST:
对于STM32F4来讲,每个DMA stream都有4个字的FIFO可用。它用来暂存来自DMA源端的数据,每当FIFO里存放的数据达到设定的阈值后,数据就会被移走。阈值可以设置为从1个字到4个字的深度。启用DMA的FIFO可以最大程度地避免数据传输过程中的溢出问题,可以减少DMA对内存的访问次数从而减少总线访问竞争,通过BURST分组传输优化传输带宽以提升芯片性能。利用FIFO,通过对源端/目标端的数据进行打包或拆包以适应不同数据宽度的访问需求.让DMA的使用更为方便灵活.
FIFO阈值设置为1/4满,自源端的4个Byte被封装成1个word字。数据会按字方式逐一写入内存.传输过程中如果发生被打断的情况,此时就会遇到数据损坏的风险。因此就引入了DMA BURST传输,或称DMA节拍传输.
即几个数据【4/8/16】被封装成1组,或称1个burst,或称1节.对于每1节内的数据传输,DMA对总线的占用不会被总线矩阵仲裁器解除或打断,以保证每节数据的可靠完成。