|
- #include "bsp_uart.h"
- #if uart1_enable
- uart_par uart1;
- #endif
- #if uart2_enable
- uart_par uart2;
- #endif
- #if uart3_enable
- uart_par uart3;
- #endif
- #if uart4_enable
- uart_par uart4;
- #endif
- #if uart1_enable //如果使能了串口1
- /*
- * 函数名:bsp_init_uart1
- * 参 数:输入的波特率
- * 解 释:可以启用DMA方式传输
- */
- void bsp_init_uart1(uint16_t bound)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- #if uart1_dma_enable //启用DMA
- DMA_InitTypeDef DMA_InitStructure;
- #endif
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- #if uart1_dma_enable
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
- #endif
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- USART_OverSampling8Cmd(USART1, ENABLE);
- USART_InitStructure.USART_BaudRate = bound;
- 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_Rx | USART_Mode_Tx;
- USART_Init(USART1, &USART_InitStructure);
- #if uart1_dma_enable
- DMA_InitStructure.DMA_BufferSize = 512 ;
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable ;
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single ;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
- DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) (&(USART1->DR)) ;
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;
- /* Configure TX DMA */
- DMA_InitStructure.DMA_Channel = DMA_Channel_4 ;
- DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral ;
- DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)(uart1.txbuf);
- DMA_Init(DMA2_Stream7,&DMA_InitStructure);
- DMA_Cmd(DMA2_Stream7,ENABLE);
- /* Configure RX DMA */
- DMA_InitStructure.DMA_Channel = DMA_Channel_4 ;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ;
- DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)uart1.rxbuf;
- DMA_Init(DMA2_Stream5,&DMA_InitStructure);
- DMA_Cmd(DMA2_Stream5,ENABLE);
- USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //使能串口空闲中断
- DMA_ITConfig(DMA2_Stream7,DMA_IT_TC,ENABLE); //使能DMA发送中断
- NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn; //配置DMA发送中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢断优先级为1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //配置USART为中断源
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4; //抢断优先级为1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- //采用DMA方式发送
- USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
- //采用DMA方式接收
- USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
- #else //采用中断方式接收数据
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //配置USART为中断源
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢断优先级为1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- #endif
- /* 使能串口 */
- USART_Cmd(USART1, ENABLE);
- }
- /*
- * 函数名:uart1_send
- * 参 数:发送数据的长度
- * 解 释:DMA发送方式要注意填充的字节的长度
- */
- void uart1_send(uint16_t len)
- {
- #if uart1_dma_enable
- //关中断 ,如果有485需要进行设置为发送
- DMA_Cmd(DMA2_Stream7, DISABLE ); //关闭USART1 TX DMA1 所指示的通道
- DMA_SetCurrDataCounter(DMA2_Stream7,len); //DMA通道的DMA缓存的大小
- DMA_Cmd(DMA2_Stream7, ENABLE); //使能USART1 TX DMA1 所指示的通道
- //开中断
- #else
- uint16_t i = 0;
- for(i=0;i<;en;i++)
- {
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- USART_SendData(USART1,uart1.txbuf[i]);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- #endif
- }
- #if uart1_dma_enable
- /*
- * 函数名:DMA2_Stream7_IRQHandler
- * 参 数:DMA发送完成中断
- * 解 释:
- */
- void DMA2_Stream7_IRQHandler(void)
- {
- //发送数据完成进入中断 ,进行保护操作,如果有485控制收发,在此处进行设置
- if(DMA_GetITStatus(DMA2_Stream7,DMA_IT_TCIF7))
- {
- DMA_ClearFlag(DMA2_Stream7,DMA_IT_TCIF7);
- DMA_Cmd(DMA2_Stream7,DISABLE);
- }
- }
- #endif
- /*
- * 函数名:USART1_IRQHandler
- * 参 数:串口中断
- * 解 释:
- */
- void USART1_IRQHandler(void)
- {
- #if uart1_dma_enable
- uint16_t num = 0;
- /* USART in DMA mode */
- if (USART_GetITStatus(USART1, USART_IT_IDLE) == SET)
- {
- DMA_Cmd(DMA2_Stream5,DISABLE);
- num = USART1->SR;
- num = USART1->DR;
- num = 512- DMA_GetCurrDataCounter(DMA2_Stream5);
- uart1.rxcon = num; //记录数组的长度
- DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5 | DMA_FLAG_FEIF5 | DMA_FLAG_DMEIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_HTIF5);//清除DMA2_Steam7传输完成标志
- DMA_SetCurrDataCounter(DMA2_Stream5, 512);
- DMA_Cmd(DMA2_Stream5, ENABLE); //打开DMA,
- //进行发送信号量等操作
- uart1.flag = 1;
- }
- #else
- /* USART in Transmitter mode */
- if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
- {
- uart1.rxbuf[uart1.rxcon++] = USART_ReceiveData(USART1);
- //进行数据的处理
- }
- #endif
- }
- #endif //uart1 end
复制代码- #ifndef __BSP_UART_H
- #define __BSP_UART_H
- #include "stm32f4xx.h"
- #define uart1_enable 1 //串口1
- #define uart1_dma_enable 1 //串口1 DMA方式
- #define uart2_enable 0
- #define uart2_dma_enable 0
- #define uart3_enable 0
- #define uart3_dma_enable 0
- #define uart4_enable 0
- #define uart4_dma_enable 0
- typedef struct _uart_par{ //串口数据格式
- uint8_t rxbuf[512]; //接收数据缓存
- uint8_t txbuf[512]; //发送数据缓存
- uint16_t rxcon; //接收字节数
- uint16_t txcon; //发送字节数
- uint8_t flag; //标志位
- }uart_par;
- #if uart1_enable
- extern uart_par uart1;
- #endif
- #if uart2_enable
- extern uart_par uart2;
- #endif
- #if uart3_enable
- extern uart_par uart3;
- #endif
- #if uart4_enable
- extern uart_par uart4;
- #endif
- void bsp_init_uart1(uint16_t bound);
- void uart1_send(uint16_t len);
- #endif
复制代码 可以在头文件里通过宏定义进行开启关闭DMA模式
|
评分
-
查看全部评分
|