前言
上文讨论了利用DMA将数据从一个存储器搬运到另一个存储器,本文讨论将数据从M->P。将数据从数组转移到串口外设并发送出去。
代码
void MYDMA_Init(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,uint32_t par,u32 mar,u16 ndtr)
{
DMA_InitTypeDef DMA_InitStructure;
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
}else
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
}
DMA_DeInit(DMA_Streamx);
while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待 DMA 可配置
/* 配置 DMA Stream */
DMA_InitStructure.DMA_Channel = chx; //通道选择
DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA外设地址,其实就是传输起始地址
DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址,数据接收地址
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式
DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量
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_MemoryDataSize_Byte;//存储器数据长度:8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式,一次传输,存储器到存储器只能一次模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //不用FIFO
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream,初始化数据流
DMA_Cmd(DMA_Streamx, ENABLE); //开启 DMA 传输
}
uint8_t DataA[] = {0x01, 0x02, 0x03, 0x04};
int main(void)
{
uart_init(115200);
delay_init(84);
MYDMA_Init(DMA2_Stream7,DMA_Channel_4,USART_DR_BASE,(uint32_t) DataA,4);//串口1数据流是7.通道4,DMA2
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);//硬件触发DMA传输信号
while(1){
}
}