在USART串口的基础上,使用DMA进行储存器到外设的数据传输实验
在串口初始化的基础上,开启DMA收发使能:DMAT和DMAR
void USART_GPIO_INIT(void)
{
SET_BIT(RCC->APB2ENR,(1<<2));//开GPIOA端口时钟
SET_BIT(RCC->APB2ENR,RCC_APB2ENR_USART1EN);//开串口时钟
SET_BIT(GPIOA->CRH,(0x4<<8));//RX,接收,浮空输入
SET_BIT(GPIOA->CRH,(0xB<<4));//TX,发送,推挽复用
USART1->CR1=0x0;
USART1->CR2=0x0;
USART1->CR3=0x0;
USART1->BRR=0x271;//波特率设置
NVIC_DisableIRQ(USART1_IRQn);//关中断
SET_BIT(USART1->CR1,USART_CR1_RXNEIE);//设置RXNE中断
NVIC_SetPriority(USART1_IRQn,1);
NVIC_EnableIRQ(USART1_IRQn);//开中断
SET_BIT(USART1->CR3,USART_CR3_DMAT);
SET_BIT(USART1->CR3,USART_CR3_DMAR);//开串口DMA收发使能
SET_BIT(USART1->CR1,USART_CR1_TE);//开串口
SET_BIT(USART1->CR1,USART_CR1_RE);
SET_BIT(USART1->CR1,USART_CR1_UE);
}
配置DMA初始化代码
这里USART所在通道为Channel4,将外设地址设置为DR收发寄存器,储存器地址为自己定义的数组uint8_t sendcom[buffer]; 其中buffer这里设置成5000
配置DMA的步骤在芯片手册中一般都有提及:

void USART_DMA_INIT(void)
{
SET_BIT(RCC->AHBENR, RCC_AHBENR_DMA1EN);//开DMA时钟
CLEAR_BIT(DMA1_Channel4->CCR,DMA_CCR1_EN);//清除使能
DMA1_Channel4->CCR = 0;//初始化
DMA1_Channel4->CPAR = (uint32_t) & USART1->DR;//外设地址设置为数据寄存器TDR
DMA1_Channel4->CMAR = (uint32_t) & sendcom;//储存器地址设置为内部flash
DMA1_Channel4->CNDTR= buffer;
SET_BIT(DMA1_Channel4->CCR,DMA_CCR1_PL);//通道优先级
SET_BIT(DMA1_Channel4->CCR,DMA_CCR1_DIR);//方向,储存器到外设
SET_BIT(DMA1_Channel4->CCR,DMA_CCR1_MINC);//内存地址增量模式
SET_BIT(DMA1_Channel4->CCR,DMA_CCR1_EN);//开启DMA通道
}
主函数
在开始DMA传输之前,先使用for循环填充数组内容,这里全部填充为’p’
int main(void)
{
/***填充数组****/
uint16_t i;
for(i=0;i<buffer;i++)
{
sendcom[i]='p';
}
USART_GPIO_INIT();
USART_DMA_INIT();
while(1)
{
}
}
打开串口,复位之后,显示效果:

串口能够正常接收到单片机通过DMA通道传输的数据。