void MYDMA_init(uint32_t AddrA, uint32_t AddrB, uint32_t Size)
{
DMA_InitTypeDef DMA_InitStruct;
MyDMA_Size = Size;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //时钟再AHB总线上面
DMA_InitStruct.DMA_BufferSize=Size; //总缓冲区大小
DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralSRC; //从外设读 进来
DMA_InitStruct.DMA_M2M=DMA_M2M_Enable; //没有外设触发的情况
DMA_InitStruct.DMA_MemoryBaseAddr=AddrB; //接收的地址
DMA_InitStruct.DMA_MemoryDataSize=DMA_PeripheralDataSize_Byte;//地址大小
DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable; //接收地址自增
DMA_InitStruct.DMA_Mode=DMA_Mode_Normal; //M2M so不能循环
DMA_InitStruct.DMA_PeripheralBaseAddr=AddrA; //外设地址
DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//数据宽度
DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Enable; //自增
DMA_InitStruct.DMA_Priority=DMA_Priority_Medium; //DMA的权限
DMA_Init( DMA1_Channel2, &DMA_InitStruct); //几通道跟读取相关
}
void MyDMA_Transfer(void)
{
DMA_Cmd(DMA1_Channel2, DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel2, MyDMA_Size); //设置传输几个数
DMA_Cmd(DMA1_Channel2, ENABLE);
while (DMA_GetFlagStatus(DMA1_FLAG_TC2) == RESET); //传输完成标准位
DMA_ClearFlag(DMA1_FLAG_TC2);
}
配置两个方向的地址——》配置一下地址读多少次——》软件还要使能(要关了通道)