串口3与DMA初始化函数
#define USE_USART3_DMA_RX 1
char Usart3data[200];
u8 Usart3flag =0;
u8 usart3Count=0;
void USART3_Configuration(u32 BaudRate)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStruct;
//打开usart3要使用的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
//配置串口TX作为推挽复用端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//配置串口RX作为浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //一个抢占优先级,3个从优先级
NVIC_InitStructure.NVIC_IRQChannel =USART3_IRQn; //和库函数手册不一样
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //主优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStructure);
//配置USART
USART_InitStructure.USART_BaudRate = BaudRate; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶校验
USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //模式
USART_Init(USART3, &USART_InitStructure); //写入结构体
// USART_Cmd(USART3, ENABLE); //使能usart3
USART_ITConfig(USART3,USART_IT_PE,ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE,ENABLE); //打开usart3的接收中断
USART_ClearFlag(USART3,USART_IT_RXNE); //清除中断标志
// USART_ClearFlag(USART3, USART_FLAG_TC); // 清标志
/********************************以下是对DMA的参数初始化**********************************/
#if USE_USART3_DMA_RX
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE); // 开启串口3空闲中断
DMA_DeInit(DMA1_Channel3);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // DMA1时钟初始化
// RX DMA1 ??5
DMA_InitStruct.DMA_BufferSize = sizeof(Usart3data); // 传输的数据大小
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; // 外设作为数据的来源
DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; // 不使能M TO M传输
DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)Usart3data; // 设置DMA源地址:串口数据寄存器
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 内存数据单元
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; // 外设地址不增
DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; // DMA模式一次或者循环模式
//DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; // DMA模式一次或者循环模式
DMA_InitStruct.DMA_PeripheralBaseAddr = USART3_BASE + 0x04; // 设置DMA源地址:串口数据寄存器地址
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据单元
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不增加
DMA_InitStruct.DMA_Priority = DMA_Priority_High; // 优先级为中
// 配置DMA通道
DMA_Init(DMA1_Channel3, &DMA_InitStruct);
// 清除DMA所有标志
DMA_ClearFlag(DMA1_FLAG_TC3);
DMA_ITConfig(DMA1_Channel3, DMA_IT_TE,ENABLE);
USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);//开启串口DMA接收
DMA_Cmd(DMA1_Channel3, ENABLE); // 使能DMA通道
#else
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 开启串口接收中断
#endif
// USART_ClearFlag(USART3, USART_FLAG_TC); /* 清除标志避免第一个字符丢失 */ // 使用GD32时,发送第一个数据前不要清除 USART_FLAG_TC(发送完成标志位)
USART_Cmd(USART3, ENABLE); //使能串口
}
|