串口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); //使能串口
- }
|