之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下。并奉驱动程序,本程序覆盖uart1-8。

串口驱动,这是在每个单片机中可以说是必备接口。可以说大部分产品中都会使用,更有甚者一个产品中用到8个串口。这样一个高效的驱动是决定您产品优劣的关键因素。本文主要针对STM32F4XX系列芯片做的一个驱动接口层。以减少您在开发项目时驱动方面所花费时间,以及为程序达到高效的处理为目的。

从51,pic到现在的STM32,个人感觉STM32这方面做的非常突出,丰富的使用模式,强大的引脚映射功能,强大的处理能力等,给我留下的深刻的印象。

关于串口的使用方式,个人总结出以下三种:

1)         中断接收,状态查询发送:这种方式在单片机时代用的比较多,那时候大部分芯片的处理速度不够快,工业控制接口中大部分使用的是9600波特率,程序简单也就对串口发送数据所用时间要求不高。

2)         中断接收,中断发送:这种方式一般会在对高效性要求较高,或软件实时性高的产品中使用。这种方式的好外在于完全释放了CPU在发送开始到结束这一时间CPU控制权。

3)         中断接口,DMA发送:这种方式的使用场合和模式2相同,效率也相差不多。但这种方式确实比模式2CPU的占用时间会更少。

举个例子来说明以上三种模式。假如要把一堆物品从A点运到B点通过传送带,在这个传送过程中传送带上一次只能运一个物品,模式一:把物品放到传送带A点上,然后等待物品由A点被传到B点,这时再放一个物品到传送带上,以此往复所有物品传送过去。模式二:把物品放到A点的传送带上然后就去忙别的事情,看到物品快被传到B点,马上回来再放一个物品到传送带上。很明显这种方式比模式一多了很多空余时间。模式三:这种模式就牛了,在把物品放到A点之前,直接去找了一个“闲杂人等”过来,把物品交给他由他去发,我们需要再发送时,先问下她是否以发完,如果发完了就把新的物品交给他,如果没发完就等一小回再来找他。哈哈,这样咱们就有更多的时间去忙更多的事情了,也不用一回跑来一回跑去。把跑路的时间给节约出来了。

以上三种模式,很明显得出那种模式发送数据效率最高。我们下面说提供的程序就是使用模式三。

说完发送,再说说接收方式。大家一定发现数据接收都是采用中断方式,是的 本人使用过DMA方式进行过多次测试,在使用方面确实没有中断接收灵活。主要有以下两种情况,1,DMA接收数据的主要判断依据1是接收器满中断,这种情况在实际中很少用,除非您的数据是定长。这种方式同时还会存在一些安全隐患,假如噪声原因多接收到一个字节,那之后数据时序就会错位。2,DMA总线空闲中断,这种方式除非是半双工情况下使用。在全双工时被受到发送完成总线空闲的干扰。所以在数据接收方式上主要使用中断。

在数据接收中断方面还分二种方式,

方式1:顺序接收,在接收到第一个数据时就触发超时定时器,每接收到一个字节时就清一次定时器,都到一组数据接收完毕,定时器会因为触发超时中断。在超时中断中来判断一组数据被接收。这种方式一般会用到实时性的一些协议中,比如MODBUS。

方式2:队列接收,申请一个缓冲区收尾相接,接收到数据时载入队列之中,用户只要定时的去队列中读数据,来使用这些数据。这种方式是window,linux的驱动主要接收方式。他的优点就在于在使用数据时无需关闭中断。也就不用怛心在处理上一组数据时了来新的数据会破坏上组数据内容。在方式1中需要考虑在处理数据时暂时性的关下中断。

以下程序则主要是使用到接收使用方式2,发送数据使用模式3的DMA发送,本驱动程序为可裁切,覆盖串口1-8,通过宏裁切。下面提供了一些接口,这里对接口做一个大概的说明。

打开串口

void BSP_UartOpen(uint8_t COM,  uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity);

关闭串口

void BSP_UartClose(uint8_t COM);

向串口中写数据

uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len);

从串口中读数据

uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len);

查询串口发送忙碌状态

uint32_t BSP_UartTxIdleState(uint8_t COM);

这个接口主要用在,向串口写数据后,在进行下一次写数据之前需要进行查询。

具体接口的使用方法,函数都有详细的说明。

 /*
********************************************************************************
*
* BSP_Uart.c
*
* File : BSP_Uart.c
* Version : V1.0
* Author : whq
* Mode : Thumb2
* Toolchain :
* Description : 串口驱动程序
*
* History :
* Date : 2013.08.12
*******************************************************************************/
#include <string.h> #include "misc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_dma.h" #include "Queue.h"
#include "BSP_Uart.h" #if COM1_EN
static uint8_t COM1_TX_BUFF[BSP_COM1_Tx_BUFF_SIZE] = {};
static uint8_t COM1_RX_BUFF[BSP_COM1_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM1_RX_QUEUE = {};
#endif #if COM2_EN
static uint8_t COM2_TX_BUFF[BSP_COM2_Tx_BUFF_SIZE] = {};
static uint8_t COM2_RX_BUFF[BSP_COM2_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM2_RX_QUEUE = {};
#endif #if COM3_EN
static uint8_t COM3_TX_BUFF[BSP_COM3_Tx_BUFF_SIZE] = {};
static uint8_t COM3_RX_BUFF[BSP_COM3_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM3_RX_QUEUE = {};
#endif #if COM4_EN
static uint8_t COM4_TX_BUFF[BSP_COM4_Tx_BUFF_SIZE] = {};
static uint8_t COM4_RX_BUFF[BSP_COM4_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM4_RX_QUEUE = {};
#endif #if COM5_EN
static uint8_t COM5_TX_BUFF[BSP_COM5_Tx_BUFF_SIZE] = {};
static uint8_t COM5_RX_BUFF[BSP_COM5_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM5_RX_QUEUE = {};
#endif #if COM6_EN
static uint8_t COM6_TX_BUFF[BSP_COM6_Tx_BUFF_SIZE] = {};
static uint8_t COM6_RX_BUFF[BSP_COM6_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM6_RX_QUEUE = {};
#endif #if COM7_EN
static uint8_t COM7_TX_BUFF[BSP_COM7_Tx_BUFF_SIZE] = {};
static uint8_t COM7_RX_BUFF[BSP_COM7_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM7_RX_QUEUE = {};
#endif #if COM8_EN
static uint8_t COM8_TX_BUFF[BSP_COM8_Tx_BUFF_SIZE] = {};
static uint8_t COM8_RX_BUFF[BSP_COM8_Rx_BUFF_SIZE] = {};
static QUEUE8_TYPE COM8_RX_QUEUE = {};
#endif static USART_TypeDef* const COM_USART[COMn] = {
#if COM1_EN
BSP_COM1,
#endif
#if COM2_EN
BSP_COM2,
#endif
#if COM3_EN
BSP_COM3,
#endif
#if COM4_EN
BSP_COM4,
#endif
#if COM5_EN
BSP_COM5,
#endif
#if COM6_EN
BSP_COM6,
#endif
#if COM7_EN
BSP_COM7,
#endif
#if COM8_EN
BSP_COM8,
#endif
}; static const uint8_t COM_AF[COMn] = {
#if COM1_EN
BSP_COM1_AF,
#endif
#if COM2_EN
BSP_COM2_AF,
#endif
#if COM3_EN
BSP_COM3_AF,
#endif
#if COM4_EN
BSP_COM4_AF,
#endif
#if COM5_EN
BSP_COM5_AF,
#endif
#if COM6_EN
BSP_COM6_AF,
#endif
#if COM7_EN
BSP_COM7_AF,
#endif
#if COM8_EN
BSP_COM8_AF,
#endif
}; static const uint8_t COM_TX_AF_PIN[COMn] = {
#if COM1_EN
BSP_COM1_TX_AF_PIN,
#endif
#if COM2_EN
BSP_COM2_TX_AF_PIN,
#endif
#if COM3_EN
BSP_COM3_TX_AF_PIN,
#endif
#if COM4_EN
BSP_COM4_TX_AF_PIN,
#endif
#if COM5_EN
BSP_COM5_TX_AF_PIN,
#endif
#if COM6_EN
BSP_COM6_TX_AF_PIN,
#endif
#if COM7_EN
BSP_COM7_TX_AF_PIN,
#endif
#if COM8_EN
BSP_COM8_TX_AF_PIN,
#endif
}; static const uint8_t COM_RX_AF_PIN[COMn] = {
#if COM1_EN
BSP_COM1_RX_AF_PIN,
#endif
#if COM2_EN
BSP_COM2_RX_AF_PIN,
#endif
#if COM3_EN
BSP_COM3_RX_AF_PIN,
#endif
#if COM4_EN
BSP_COM4_RX_AF_PIN,
#endif
#if COM5_EN
BSP_COM5_RX_AF_PIN,
#endif
#if COM6_EN
BSP_COM6_RX_AF_PIN,
#endif
#if COM7_EN
BSP_COM7_RX_AF_PIN,
#endif
#if COM8_EN
BSP_COM8_RX_AF_PIN,
#endif
}; static GPIO_TypeDef* const COM_TX_PORT[COMn] = {
#if COM1_EN
BSP_COM1_TX_GPIO_PORT,
#endif
#if COM2_EN
BSP_COM2_TX_GPIO_PORT,
#endif
#if COM3_EN
BSP_COM3_TX_GPIO_PORT,
#endif
#if COM4_EN
BSP_COM4_TX_GPIO_PORT,
#endif
#if COM5_EN
BSP_COM5_TX_GPIO_PORT,
#endif
#if COM6_EN
BSP_COM6_TX_GPIO_PORT,
#endif
#if COM7_EN
BSP_COM7_TX_GPIO_PORT,
#endif
#if COM8_EN
BSP_COM8_TX_GPIO_PORT,
#endif
}; static GPIO_TypeDef* const COM_RX_PORT[COMn] = {
#if COM1_EN
BSP_COM1_RX_GPIO_PORT,
#endif
#if COM2_EN
BSP_COM2_RX_GPIO_PORT,
#endif
#if COM3_EN
BSP_COM3_RX_GPIO_PORT,
#endif
#if COM4_EN
BSP_COM4_RX_GPIO_PORT,
#endif
#if COM5_EN
BSP_COM5_RX_GPIO_PORT,
#endif
#if COM6_EN
BSP_COM6_RX_GPIO_PORT,
#endif
#if COM7_EN
BSP_COM7_RX_GPIO_PORT,
#endif
#if COM8_EN
BSP_COM8_RX_GPIO_PORT,
#endif
}; static const uint32_t COM_USART_CLK[COMn] = {
#if COM1_EN
BSP_COM1_CLK,
#endif
#if COM2_EN
BSP_COM2_CLK,
#endif
#if COM3_EN
BSP_COM3_CLK,
#endif
#if COM4_EN
BSP_COM4_CLK,
#endif
#if COM5_EN
BSP_COM5_CLK,
#endif
#if COM6_EN
BSP_COM6_CLK,
#endif
#if COM7_EN
BSP_COM7_CLK,
#endif
#if COM8_EN
BSP_COM8_CLK,
#endif
}; static const uint32_t COM_TX_PORT_CLK[COMn] = {
#if COM1_EN
BSP_COM1_TX_GPIO_CLK,
#endif
#if COM2_EN
BSP_COM2_TX_GPIO_CLK,
#endif
#if COM3_EN
BSP_COM3_TX_GPIO_CLK,
#endif
#if COM4_EN
BSP_COM4_TX_GPIO_CLK,
#endif
#if COM5_EN
BSP_COM5_TX_GPIO_CLK,
#endif
#if COM6_EN
BSP_COM6_TX_GPIO_CLK,
#endif
#if COM7_EN
BSP_COM7_TX_GPIO_CLK,
#endif
#if COM8_EN
BSP_COM8_TX_GPIO_CLK,
#endif
}; static const uint32_t COM_RX_PORT_CLK[COMn] = {
#if COM1_EN
BSP_COM1_RX_GPIO_CLK,
#endif
#if COM2_EN
BSP_COM2_RX_GPIO_CLK,
#endif
#if COM3_EN
BSP_COM3_RX_GPIO_CLK,
#endif
#if COM4_EN
BSP_COM4_RX_GPIO_CLK,
#endif
#if COM5_EN
BSP_COM5_RX_GPIO_CLK,
#endif
#if COM6_EN
BSP_COM6_RX_GPIO_CLK,
#endif
#if COM7_EN
BSP_COM7_RX_GPIO_CLK,
#endif
#if COM8_EN
BSP_COM8_RX_GPIO_CLK,
#endif
}; static const uint16_t COM_TX_PIN[COMn] = {
#if COM1_EN
BSP_COM1_TX_PIN,
#endif
#if COM2_EN
BSP_COM2_TX_PIN,
#endif
#if COM3_EN
BSP_COM3_TX_PIN,
#endif
#if COM4_EN
BSP_COM4_TX_PIN,
#endif
#if COM5_EN
BSP_COM5_TX_PIN,
#endif
#if COM6_EN
BSP_COM6_TX_PIN,
#endif
#if COM7_EN
BSP_COM7_TX_PIN,
#endif
#if COM8_EN
BSP_COM8_TX_PIN,
#endif
}; static const uint16_t COM_RX_PIN[COMn] = {
#if COM1_EN
BSP_COM1_RX_PIN,
#endif
#if COM2_EN
BSP_COM2_RX_PIN,
#endif
#if COM3_EN
BSP_COM3_RX_PIN,
#endif
#if COM4_EN
BSP_COM4_RX_PIN,
#endif
#if COM5_EN
BSP_COM5_RX_PIN,
#endif
#if COM6_EN
BSP_COM6_RX_PIN,
#endif
#if COM7_EN
BSP_COM7_RX_PIN,
#endif
#if COM8_EN
BSP_COM8_RX_PIN,
#endif
}; static const uint32_t COM_DMA_DR_BASE[COMn] = {
#if COM1_EN
BSP_COM1_DMA_DR_BASE,
#endif
#if COM2_EN
BSP_COM2_DMA_DR_BASE,
#endif
#if COM3_EN
BSP_COM3_DMA_DR_BASE,
#endif
#if COM4_EN
BSP_COM4_DMA_DR_BASE,
#endif
#if COM5_EN
BSP_COM5_DMA_DR_BASE,
#endif
#if COM6_EN
BSP_COM6_DMA_DR_BASE,
#endif
#if COM7_EN
BSP_COM7_DMA_DR_BASE,
#endif
#if COM8_EN
BSP_COM8_DMA_DR_BASE,
#endif
}; static const uint32_t COM_DMA_CLK[COMn] = {
#if COM1_EN
BSP_COM1_DMA_CLK,
#endif
#if COM2_EN
BSP_COM2_DMA_CLK,
#endif
#if COM3_EN
BSP_COM3_DMA_CLK,
#endif
#if COM4_EN
BSP_COM4_DMA_CLK,
#endif
#if COM5_EN
BSP_COM5_DMA_CLK,
#endif
#if COM6_EN
BSP_COM6_DMA_CLK,
#endif
#if COM7_EN
BSP_COM7_DMA_CLK,
#endif
#if COM8_EN
BSP_COM8_DMA_CLK,
#endif
}; static const uint32_t COM_DMA_TX_FLAG[COMn] = {
#if COM1_EN
BSP_COM1_Tx_DMA_FLAG,
#endif
#if COM2_EN
BSP_COM2_Tx_DMA_FLAG,
#endif
#if COM3_EN
BSP_COM3_Tx_DMA_FLAG,
#endif
#if COM4_EN
BSP_COM4_Tx_DMA_FLAG,
#endif
#if COM5_EN
BSP_COM5_Tx_DMA_FLAG,
#endif
#if COM6_EN
BSP_COM6_Tx_DMA_FLAG,
#endif
#if COM7_EN
BSP_COM7_Tx_DMA_FLAG,
#endif
#if COM8_EN
BSP_COM8_Tx_DMA_FLAG,
#endif
}; static const uint32_t COM_DMA_TX_CHANNEL[COMn] = {
#if COM1_EN
BSP_COM1_Tx_DMA_Channel,
#endif
#if COM2_EN
BSP_COM2_Tx_DMA_Channel,
#endif
#if COM3_EN
BSP_COM3_Tx_DMA_Channel,
#endif
#if COM4_EN
BSP_COM4_Tx_DMA_Channel,
#endif
#if COM5_EN
BSP_COM5_Tx_DMA_Channel,
#endif
#if COM6_EN
BSP_COM6_Tx_DMA_Channel,
#endif
#if COM7_EN
BSP_COM7_Tx_DMA_Channel,
#endif
#if COM8_EN
BSP_COM8_Tx_DMA_Channel,
#endif
}; static DMA_Stream_TypeDef * const COM_DMA_TX_STREAM[COMn] = {
#if COM1_EN
BSP_COM1_Tx_DMA_Stream,
#endif
#if COM2_EN
BSP_COM2_Tx_DMA_Stream,
#endif
#if COM3_EN
BSP_COM3_Tx_DMA_Stream,
#endif
#if COM4_EN
BSP_COM4_Tx_DMA_Stream,
#endif
#if COM5_EN
BSP_COM5_Tx_DMA_Stream,
#endif
#if COM6_EN
BSP_COM6_Tx_DMA_Stream,
#endif
#if COM7_EN
BSP_COM7_Tx_DMA_Stream,
#endif
#if COM8_EN
BSP_COM8_Tx_DMA_Stream,
#endif
}; static const uint32_t COM_RX_IRQn[COMn] = {
#if COM1_EN
BSP_COM1_IRQn,
#endif
#if COM2_EN
BSP_COM2_IRQn,
#endif
#if COM3_EN
BSP_COM3_IRQn,
#endif
#if COM4_EN
BSP_COM4_IRQn,
#endif
#if COM5_EN
BSP_COM5_IRQn,
#endif
#if COM6_EN
BSP_COM6_IRQn,
#endif
#if COM7_EN
BSP_COM7_IRQn,
#endif
#if COM8_EN
BSP_COM8_IRQn,
#endif
}; static uint8_t * const COM_TX_BUFF[COMn] = {
#if COM1_EN
COM1_TX_BUFF,
#endif
#if COM2_EN
COM2_TX_BUFF,
#endif
#if COM3_EN
COM3_TX_BUFF,
#endif
#if COM4_EN
COM4_TX_BUFF,
#endif
#if COM5_EN
COM5_TX_BUFF,
#endif
#if COM6_EN
COM6_TX_BUFF,
#endif
#if COM7_EN
COM7_TX_BUFF,
#endif
#if COM8_EN
COM8_TX_BUFF,
#endif
}; static const uint32_t COM_TX_BUFF_SIZE[COMn] = {
#if COM1_EN
BSP_COM1_Tx_BUFF_SIZE,
#endif
#if COM2_EN
BSP_COM2_Tx_BUFF_SIZE,
#endif
#if COM3_EN
BSP_COM3_Tx_BUFF_SIZE,
#endif
#if COM4_EN
BSP_COM4_Tx_BUFF_SIZE,
#endif
#if COM5_EN
BSP_COM5_Tx_BUFF_SIZE,
#endif
#if COM6_EN
BSP_COM6_Tx_BUFF_SIZE,
#endif
#if COM7_EN
BSP_COM7_Tx_BUFF_SIZE,
#endif
#if COM8_EN
BSP_COM8_Tx_BUFF_SIZE,
#endif
}; static uint8_t * const COM_RX_BUFF[COMn] = {
#if COM1_EN
COM1_RX_BUFF,
#endif
#if COM2_EN
COM2_RX_BUFF,
#endif
#if COM3_EN
COM3_RX_BUFF,
#endif
#if COM4_EN
COM4_RX_BUFF,
#endif
#if COM5_EN
COM5_RX_BUFF,
#endif
#if COM6_EN
COM6_RX_BUFF,
#endif
#if COM7_EN
COM7_RX_BUFF,
#endif
#if COM8_EN
COM8_RX_BUFF,
#endif
}; static const uint32_t COM_RX_BUFF_SIZE[COMn] = {
#if COM1_EN
BSP_COM1_Rx_BUFF_SIZE,
#endif
#if COM2_EN
BSP_COM2_Rx_BUFF_SIZE,
#endif
#if COM3_EN
BSP_COM3_Rx_BUFF_SIZE,
#endif
#if COM4_EN
BSP_COM4_Rx_BUFF_SIZE,
#endif
#if COM5_EN
BSP_COM5_Rx_BUFF_SIZE,
#endif
#if COM6_EN
BSP_COM6_Rx_BUFF_SIZE,
#endif
#if COM7_EN
BSP_COM7_Rx_BUFF_SIZE,
#endif
#if COM8_EN
BSP_COM8_Rx_BUFF_SIZE,
#endif
}; static QUEUE8_TYPE * const COM_RX_QUEUE[COMn] = {
#if COM1_EN
&COM1_RX_QUEUE,
#endif
#if COM2_EN
&COM2_RX_QUEUE,
#endif
#if COM3_EN
&COM3_RX_QUEUE,
#endif
#if COM4_EN
&COM4_RX_QUEUE,
#endif
#if COM5_EN
&COM5_RX_QUEUE,
#endif
#if COM6_EN
&COM6_RX_QUEUE,
#endif
#if COM7_EN
&COM7_RX_QUEUE,
#endif
#if COM8_EN
&COM8_RX_QUEUE,
#endif
}; static const uint16_t parityArr[] = {USART_Parity_No, USART_Parity_Odd, USART_Parity_Even}; /*******************************************************************************
* Function Name :BSP_Uart1Open
* Description :串口及引脚初始化
* Input : uartx: COM1,COM2,COM3....
baud: 2400,4800,9600,19200,38400,57600,115200
data: 数据位数 8,9,
stop:停止位数 1,2
parity:效验 0: 无效验,1:奇效验,2:偶效验
* Output :
* Other :
* Date :2013.08.12
*******************************************************************************/
void BSP_UartOpen(uint8_t COM, uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NvicInitdef;
DMA_InitTypeDef DMA_InitStructure; /* DMA clock enable */
RCC_AHB1PeriphClockCmd(COM_DMA_CLK[COM], ENABLE); /* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM], ENABLE); /* Enable UART clock */
if ((COM_USART[COM] == USART1) || (COM_USART[COM] == USART6))
{
RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
}
else
{
RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
}
USART_DeInit(COM_USART[COM]); /* Connect PXx to USARTx_Tx*/
GPIO_PinAFConfig(COM_TX_PORT[COM], COM_TX_AF_PIN[COM], COM_AF[COM]);
/* Connect PXx to USARTx_Rx*/
GPIO_PinAFConfig(COM_RX_PORT[COM], COM_RX_AF_PIN[COM], COM_AF[COM]); /* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure); /* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure); /* USART configuration */
USART_StructInit(&USART_InitStructure);
USART_InitStructure.USART_BaudRate = baud;
USART_InitStructure.USART_StopBits = (stop == )? USART_StopBits_2 : USART_StopBits_1;
USART_InitStructure.USART_WordLength = (data == )? USART_WordLength_9b : USART_WordLength_8b;
USART_InitStructure.USART_Parity = (parity < )? parityArr[parity] : USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(COM_USART[COM], &USART_InitStructure); /* Enable USART DMA_TX*/
USART_DMACmd(COM_USART[COM], USART_DMAReq_Tx, ENABLE); USART_ITConfig(COM_USART[COM], USART_IT_RXNE, ENABLE); /* Enable USART */
USART_Cmd(COM_USART[COM], ENABLE); NvicInitdef.NVIC_IRQChannel = COM_RX_IRQn[COM];
NvicInitdef.NVIC_IRQChannelPreemptionPriority = ;
NvicInitdef.NVIC_IRQChannelSubPriority = ;
NvicInitdef.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NvicInitdef ); QUEUE_PacketCreate(COM_RX_QUEUE[COM], COM_RX_BUFF[COM], COM_RX_BUFF_SIZE[COM]);
/* -------------------------------DMA发送------------------------------ */
/* DMA StreamX Config */
DMA_DeInit(COM_DMA_TX_STREAM[COM]); /* DMA StreamX disable */
DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE); DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.DMA_Channel = COM_DMA_TX_CHANNEL[COM];
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)COM_DMA_DR_BASE[COM];
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)COM_TX_BUFF[COM];
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize = ;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_Init(COM_DMA_TX_STREAM[COM], &DMA_InitStructure); DMA_FlowControllerConfig(COM_DMA_TX_STREAM[COM], DMA_FlowCtrl_Memory); //控制流 取决于缓存大小
} /*******************************************************************************
* Function Name : void BSP_UartClose(uint8_t COMx)
* Description : 串口关闭
* Input : COMx:通道x
* Output :
* Other :
* Date : 2013.08.12
*******************************************************************************/
void BSP_UartClose(uint8_t COM)
{
if ((COM_USART[COM] == USART1) || (COM_USART[COM] == USART6))
{
RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], DISABLE);
}
else
{
RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], DISABLE);
} RCC_AHB1PeriphClockCmd(COM_DMA_CLK[COM], ENABLE);
DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);
USART_DMACmd(COM_USART[COM], USART_DMAReq_Tx, DISABLE);
USART_ITConfig(COM_USART[COM], USART_IT_RXNE, DISABLE);
USART_Cmd(COM_USART[COM], DISABLE);
} /*******************************************************************************
* Function Name : uint32_t BSP_UartWrite(uint8_t COMx, uint8_t *buffter, uint32_t len)
* Description : 串口发送数据
* Input : COMx:通道x
* Output :
* Other :
* Date : 2013.08.12
*******************************************************************************/
uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len)
{
if (COM >= COMn)
return ; if ( == len)
return ; if ((DMA_GetCurrDataCounter(COM_DMA_TX_STREAM[COM]) == )
&& (DMA_FIFOStatus_Empty == DMA_GetFIFOStatus(COM_DMA_TX_STREAM[COM])))
{
uint32_t resLen = ; USART_ClearFlag(COM_USART[COM], USART_FLAG_TC);
resLen = (COM_TX_BUFF_SIZE[COM] > len)? len : COM_TX_BUFF_SIZE[COM];
memcpy((void *)(COM_TX_BUFF[COM]), buffter, resLen);
DMA_Cmd(COM_DMA_TX_STREAM[COM], DISABLE);
DMA_ClearFlag(COM_DMA_TX_STREAM[COM], COM_DMA_TX_FLAG[COM]);
DMA_SetCurrDataCounter(COM_DMA_TX_STREAM[COM], resLen);
DMA_Cmd(COM_DMA_TX_STREAM[COM], ENABLE); return resLen;
}
return ;
} /*******************************************************************************
* Function Name : uint32_t BSP_UartRead(uint8_t COMx, uint8_t *buffter, uint32_t len)
* Description : 串口读回数据
* Input : COMx:通道x
* Output :
* Other :
* Date : 2013.08.12
*******************************************************************************/
uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len)
{
return QUEUE_PacketOut(COM_RX_QUEUE[COM], buffter, len);
} /*******************************************************************************
* Function Name : uint32_t BSP_UartTxIdleState(uint8_t COM)
* Description : 查询 发送是否 发送完成
* Input :
* Output : 1)忙碌 0)空闲
* Other :
* Date : 2013.08.12
*******************************************************************************/
uint32_t BSP_UartTxIdleState(uint8_t COM)
{
return (DMA_GetCurrDataCounter(COM_DMA_TX_STREAM[COM])
|| (USART_GetFlagStatus(COM_USART[COM], USART_FLAG_TC) != SET));
} /*******************************************************************************
* Function Name : void _IRQHandler(uint8_t COM)
* Description : 中断函数
* Input :
* Output :
* Other :
* Date : 2013.08.12
*******************************************************************************/
void _IRQHandler(uint8_t COM)
{
if (USART_GetITStatus(COM_USART[COM], USART_IT_RXNE) != RESET)
{
u8 ch = USART_ReceiveData(COM_USART[COM]); //读数据后 会自动清空标志
QUEUE_PacketIn(COM_RX_QUEUE[COM], &ch, );
}
} #if COM1_EN > 0
/*******************************************************************************
* Function Name : USART1_IRQHandler
* Description : This function handles USART1 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
_IRQHandler(COM1);
}
#endif //COM1_EN > 0 #if COM2_EN > 0
/*******************************************************************************
* Function Name : USART2_IRQHandler
* Description : This function handles USART2 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART2_IRQHandler(void)
{
_IRQHandler(COM2);
}
#endif //COM2_EN > 0 #if COM3_EN > 0
/*******************************************************************************
* Function Name : USART3_IRQHandler
* Description : This function handles USART3 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART3_IRQHandler(void)
{
_IRQHandler(COM3);
}
#endif //COM3_EN > 0 #if COM4_EN > 0
/*******************************************************************************
* Function Name : USART4_IRQHandler
* Description : This function handles USART4 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void UART4_IRQHandler(void)
{
_IRQHandler(COM4);
}
#endif //COM4_EN > 0 #if COM5_EN > 0
/*******************************************************************************
* Function Name : USART5_IRQHandler
* Description : This function handles USART5 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void UART5_IRQHandler(void)
{
_IRQHandler(COM5);
}
#endif //COM5_EN > 0 #if COM6_EN > 0
/*******************************************************************************
* Function Name : USART6_IRQHandler
* Description : This function handles USART6 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART6_IRQHandler(void)
{
_IRQHandler(COM6);
}
#endif //COM6_EN > 0 #if COM7_EN > 0
/*******************************************************************************
* Function Name : USART7_IRQHandler
* Description : This function handles USART7 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void UART7_IRQHandler(void)
{
_IRQHandler(COM7);
}
#endif //COM7_EN > 0 #if COM8_EN > 0
/*******************************************************************************
* Function Name : USART8_IRQHandler
* Description : This function handles USART8 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void UART8_IRQHandler(void)
{
_IRQHandler(COM8);
}
#endif //COM8_EN > 0

BSP_Uart.c

    /*
2 ********************************************************************************
3 *
4 * BSP_Uart.h
5 *
6 * File : BSP_Uart.h
7 * Version : V1.0
8 * Author : whq
9 * Mode : Thumb2
10 * Toolchain :
11 * Description : 串口驱动头文件
12 *
13 * History :
14 * Date : 2013.08.12
15 *******************************************************************************/ #ifndef _BSP_UART_H_
#define _BSP_UART_H_ #include <stdint.h> #define COM1_EN 1
#define COM2_EN 1
#define COM3_EN 1
#define COM4_EN 1
#define COM5_EN 1
#define COM6_EN 1
#define COM7_EN 0
#define COM8_EN 0 #define COM_1_0 //映射:COM_1_0,映射1:COM_1_1
#define COM_2_0 //映射:COM_2_0,映射1:COM_2_1
#define COM_3_2 //映射:COM_3_2,
#define COM_4_0
#define COM_5_0
#define COM_6_0
#define COM_7_0
#define COM_8_0 #if !(COM1_EN || COM2_EN || COM3_EN || COM4_EN || COM5_EN || COM6_EN || COM7_EN || COM8_EN)
#error "请至少使能一路串口!"
#endif typedef enum {
#if COM1_EN
COM1,
#endif
#if COM2_EN
COM2,
#endif
#if COM3_EN
COM3,
#endif
#if COM4_EN
COM4,
#endif
#if COM5_EN
COM5,
#endif
#if COM6_EN
COM6,
#endif
#if COM7_EN
COM7,
#endif
#if COM8_EN
COM8,
#endif
COM_MAX
}COM_PORT; /** @addtogroup STM3210E_BSP_LOW_LEVEL_COM
79 * @{
80 */
#define COMn COM_MAX /**
86 * @brief Definition for COM port1, connected to USART1
87 */
#define BSP_COM1 USART1
#define BSP_COM1_CLK RCC_APB2Periph_USART1
#define BSP_COM1_AF GPIO_AF_USART1
#ifdef COM_1_3
#define BSP_COM1_TX_AF_PIN GPIO_PinSource6
#define BSP_COM1_TX_PIN GPIO_Pin_6
#define BSP_COM1_TX_GPIO_PORT GPIOB
#define BSP_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOB
#define BSP_COM1_RX_AF_PIN GPIO_PinSource10
#define BSP_COM1_RX_PIN GPIO_Pin_10
#define BSP_COM1_RX_GPIO_PORT GPIOA
#define BSP_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#elif defined(COM_1_2)
#define BSP_COM1_TX_AF_PIN GPIO_PinSource9
#define BSP_COM1_TX_PIN GPIO_Pin_9
#define BSP_COM1_TX_GPIO_PORT GPIOA
#define BSP_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM1_RX_AF_PIN GPIO_PinSource7
#define BSP_COM1_RX_PIN GPIO_Pin_7
#define BSP_COM1_RX_GPIO_PORT GPIOB
#define BSP_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOB
#elif defined(COM_1_1)
#define BSP_COM1_TX_AF_PIN GPIO_PinSource6
#define BSP_COM1_TX_PIN GPIO_Pin_6
#define BSP_COM1_TX_GPIO_PORT GPIOB
#define BSP_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOB
#define BSP_COM1_RX_AF_PIN GPIO_PinSource7
#define BSP_COM1_RX_PIN GPIO_Pin_7
#define BSP_COM1_RX_GPIO_PORT GPIOB
#define BSP_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOB
#else
#define BSP_COM1_TX_AF_PIN GPIO_PinSource9
#define BSP_COM1_TX_PIN GPIO_Pin_9
#define BSP_COM1_TX_GPIO_PORT GPIOA
#define BSP_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM1_RX_AF_PIN GPIO_PinSource10
#define BSP_COM1_RX_PIN GPIO_Pin_10
#define BSP_COM1_RX_GPIO_PORT GPIOA
#define BSP_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#endif #define BSP_COM1_IRQn USART1_IRQn #define BSP_COM1_DMA_DR_BASE 0x40011004
#define BSP_COM1_DMA_CLK RCC_AHB1Periph_DMA2
#define BSP_COM1_Tx_DMA_FLAG DMA_FLAG_TCIF7
#define BSP_COM1_Tx_DMA_Stream DMA2_Stream7
#define BSP_COM1_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM1_Tx_BUFF_SIZE 0x600 //发送缓冲区大小
#define BSP_COM1_Rx_BUFF_SIZE 0x600 //接收缓冲区大小 /**
142 * @brief Definition for COM port2, connected to USART2
143 */
#define BSP_COM2 USART2
#define BSP_COM2_CLK RCC_APB1Periph_USART2
#define BSP_COM2_AF GPIO_AF_USART2 #ifdef COM_2_3
#define BSP_COM2_TX_AF_PIN GPIO_PinSource2
#define BSP_COM2_TX_PIN GPIO_Pin_2
#define BSP_COM2_TX_GPIO_PORT GPIOA
#define BSP_COM2_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM2_RX_AF_PIN GPIO_PinSource6
#define BSP_COM2_RX_PIN GPIO_Pin_6
#define BSP_COM2_RX_GPIO_PORT GPIOD
#define BSP_COM2_RX_GPIO_CLK RCC_AHB1Periph_GPIOD
#elif defined(COM_2_2)
#define BSP_COM2_TX_AF_PIN GPIO_PinSource5
#define BSP_COM2_TX_PIN GPIO_Pin_5
#define BSP_COM2_TX_GPIO_PORT GPIOD
#define BSP_COM2_TX_GPIO_CLK RCC_AHB1Periph_GPIOD
#define BSP_COM2_RX_AF_PIN GPIO_PinSource3
#define BSP_COM2_RX_PIN GPIO_Pin_3
#define BSP_COM2_RX_GPIO_PORT GPIOA
#define BSP_COM2_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#elif defined(COM_2_1)
#define BSP_COM2_TX_AF_PIN GPIO_PinSource5
#define BSP_COM2_TX_PIN GPIO_Pin_5
#define BSP_COM2_TX_GPIO_PORT GPIOD
#define BSP_COM2_TX_GPIO_CLK RCC_AHB1Periph_GPIOD
#define BSP_COM2_RX_AF_PIN GPIO_PinSource6
#define BSP_COM2_RX_PIN GPIO_Pin_6
#define BSP_COM2_RX_GPIO_PORT GPIOD
#define BSP_COM2_RX_GPIO_CLK RCC_AHB1Periph_GPIOD
#else
#define BSP_COM2_TX_AF_PIN GPIO_PinSource2
#define BSP_COM2_TX_PIN GPIO_Pin_2
#define BSP_COM2_TX_GPIO_PORT GPIOA
#define BSP_COM2_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM2_RX_AF_PIN GPIO_PinSource3
#define BSP_COM2_RX_PIN GPIO_Pin_3
#define BSP_COM2_RX_GPIO_PORT GPIOA
#define BSP_COM2_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#endif #define BSP_COM2_IRQn USART2_IRQn #define BSP_COM2_DMA_DR_BASE 0x40004404
#define BSP_COM2_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM2_Tx_DMA_FLAG DMA_FLAG_TCIF6
#define BSP_COM2_Tx_DMA_Stream DMA1_Stream6
#define BSP_COM2_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM2_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM2_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
200 * @brief Definition for COM port3, connected to USART3
201 */
#define BSP_COM3 USART3
#define BSP_COM3_CLK RCC_APB1Periph_USART3
#define BSP_COM3_AF GPIO_AF_USART3
#ifdef COM_3_3 //自由组合部分
#define BSP_COM3_TX_AF_PIN GPIO_PinSource8
#define BSP_COM3_TX_PIN GPIO_Pin_8
#define BSP_COM3_TX_GPIO_PORT GPIOD
#define BSP_COM3_TX_GPIO_CLK RCC_AHB1Periph_GPIOD
#define BSP_COM3_RX_AF_PIN GPIO_PinSource11
#define BSP_COM3_RX_PIN GPIO_Pin_11
#define BSP_COM3_RX_GPIO_PORT GPIOC
#define BSP_COM3_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#elif defined(COM_3_2)
#define BSP_COM3_TX_AF_PIN GPIO_PinSource8
#define BSP_COM3_TX_PIN GPIO_Pin_8
#define BSP_COM3_TX_GPIO_PORT GPIOD
#define BSP_COM3_TX_GPIO_CLK RCC_AHB1Periph_GPIOD
#define BSP_COM3_RX_AF_PIN GPIO_PinSource9
#define BSP_COM3_RX_PIN GPIO_Pin_9
#define BSP_COM3_RX_GPIO_PORT GPIOD
#define BSP_COM3_RX_GPIO_CLK RCC_AHB1Periph_GPIOD
#elif defined(COM_3_1)
#define BSP_COM3_TX_AF_PIN GPIO_PinSource10
#define BSP_COM3_TX_PIN GPIO_Pin_10
#define BSP_COM3_TX_GPIO_PORT GPIOC
#define BSP_COM3_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM3_RX_AF_PIN GPIO_PinSource11
#define BSP_COM3_RX_PIN GPIO_Pin_11
#define BSP_COM3_RX_GPIO_PORT GPIOC
#define BSP_COM3_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#else
#define BSP_COM3_TX_AF_PIN GPIO_PinSource10
#define BSP_COM3_TX_PIN GPIO_Pin_10
#define BSP_COM3_TX_GPIO_PORT GPIOB
#define BSP_COM3_TX_GPIO_CLK RCC_AHB1Periph_GPIOB
#define BSP_COM3_RX_AF_PIN GPIO_PinSource11
#define BSP_COM3_RX_PIN GPIO_Pin_11
#define BSP_COM3_RX_GPIO_PORT GPIOB
#define BSP_COM3_RX_GPIO_CLK RCC_AHB1Periph_GPIOB
#endif #define BSP_COM3_IRQn USART3_IRQn #define BSP_COM3_DMA_DR_BASE 0x40004804
#define BSP_COM3_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM3_Tx_DMA_FLAG DMA_FLAG_TCIF3
#define BSP_COM3_Tx_DMA_Stream DMA1_Stream3
#define BSP_COM3_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM3_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM3_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
256 * @brief Definition for COM port4, connected to USART4
257 */
#define BSP_COM4 UART4
#define BSP_COM4_CLK RCC_APB1Periph_UART4
#define BSP_COM4_AF GPIO_AF_UART4
#ifdef COM_4_3
#define BSP_COM4_TX_AF_PIN GPIO_PinSource10
#define BSP_COM4_TX_PIN GPIO_Pin_10
#define BSP_COM4_TX_GPIO_PORT GPIOC
#define BSP_COM4_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM4_RX_AF_PIN GPIO_PinSource1
#define BSP_COM4_RX_PIN GPIO_Pin_1
#define BSP_COM4_RX_GPIO_PORT GPIOA
#define BSP_COM4_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#elif defined(COM_4_2)
#define BSP_COM4_TX_AF_PIN GPIO_PinSource0
#define BSP_COM4_TX_PIN GPIO_Pin_0
#define BSP_COM4_TX_GPIO_PORT GPIOA
#define BSP_COM4_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM4_RX_AF_PIN GPIO_PinSource11
#define BSP_COM4_RX_PIN GPIO_Pin_11
#define BSP_COM4_RX_GPIO_PORT GPIOC
#define BSP_COM4_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#elif defined(COM_4_1)
#define BSP_COM4_TX_AF_PIN GPIO_PinSource10
#define BSP_COM4_TX_PIN GPIO_Pin_10
#define BSP_COM4_TX_GPIO_PORT GPIOC
#define BSP_COM4_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM4_RX_AF_PIN GPIO_PinSource11
#define BSP_COM4_RX_PIN GPIO_Pin_11
#define BSP_COM4_RX_GPIO_PORT GPIOC
#define BSP_COM4_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#else
#define BSP_COM4_TX_AF_PIN GPIO_PinSource0
#define BSP_COM4_TX_PIN GPIO_Pin_0
#define BSP_COM4_TX_GPIO_PORT GPIOA
#define BSP_COM4_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define BSP_COM4_RX_AF_PIN GPIO_PinSource1
#define BSP_COM4_RX_PIN GPIO_Pin_1
#define BSP_COM4_RX_GPIO_PORT GPIOA
#define BSP_COM4_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#endif #define BSP_COM4_IRQn UART4_IRQn #define BSP_COM4_DMA_DR_BASE 0x40004C04
#define BSP_COM4_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM4_Tx_DMA_FLAG DMA_FLAG_TCIF4
#define BSP_COM4_Tx_DMA_Stream DMA1_Stream4
#define BSP_COM4_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM4_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM4_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
312 * @brief Definition for COM port5, connected to USART5
313 */
#define BSP_COM5 UART5
#define BSP_COM5_CLK RCC_APB1Periph_UART5
#define BSP_COM5_AF GPIO_AF_UART5 #define BSP_COM5_TX_AF_PIN GPIO_PinSource12
#define BSP_COM5_TX_PIN GPIO_Pin_12
#define BSP_COM5_TX_GPIO_PORT GPIOC
#define BSP_COM5_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM5_RX_AF_PIN GPIO_PinSource2
#define BSP_COM5_RX_PIN GPIO_Pin_2
#define BSP_COM5_RX_GPIO_PORT GPIOD
#define BSP_COM5_RX_GPIO_CLK RCC_AHB1Periph_GPIOD #define BSP_COM5_IRQn UART5_IRQn #define BSP_COM5_DMA_DR_BASE 0x40005004
#define BSP_COM5_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM5_Tx_DMA_FLAG DMA_FLAG_TCIF7
#define BSP_COM5_Tx_DMA_Stream DMA1_Stream7
#define BSP_COM5_Tx_DMA_Channel DMA_Channel_4 #define BSP_COM5_Tx_BUFF_SIZE 125 //发送缓冲区大小
#define BSP_COM5_Rx_BUFF_SIZE 125 //接收缓冲区大小 /**
340 * @brief Definition for COM port6, connected to USART6
341 */
#define BSP_COM6 USART6
#define BSP_COM6_CLK RCC_APB2Periph_USART6
#define BSP_COM6_AF GPIO_AF_USART6
#ifdef COM_6_3
#define BSP_COM6_TX_AF_PIN GPIO_PinSource6
#define BSP_COM6_TX_PIN GPIO_Pin_6
#define BSP_COM6_TX_GPIO_PORT GPIOC
#define BSP_COM6_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM6_RX_AF_PIN GPIO_PinSource9
#define BSP_COM6_RX_PIN GPIO_Pin_9
#define BSP_COM6_RX_GPIO_PORT GPIOG
#define BSP_COM6_RX_GPIO_CLK RCC_AHB1Periph_GPIOG
#elif defined(COM_6_2)
#define BSP_COM6_TX_AF_PIN GPIO_PinSource14
#define BSP_COM6_TX_PIN GPIO_Pin_14
#define BSP_COM6_TX_GPIO_PORT GPIOG
#define BSP_COM6_TX_GPIO_CLK RCC_AHB1Periph_GPIOG
#define BSP_COM6_RX_AF_PIN GPIO_PinSource7
#define BSP_COM6_RX_PIN GPIO_Pin_7
#define BSP_COM6_RX_GPIO_PORT GPIOC
#define BSP_COM6_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#elif defined(COM_6_1)
#define BSP_COM6_TX_AF_PIN GPIO_PinSource14
#define BSP_COM6_TX_PIN GPIO_Pin_14
#define BSP_COM6_TX_GPIO_PORT GPIOG
#define BSP_COM6_TX_GPIO_CLK RCC_AHB1Periph_GPIOG
#define BSP_COM6_RX_AF_PIN GPIO_PinSource9
#define BSP_COM6_RX_PIN GPIO_Pin_9
#define BSP_COM6_RX_GPIO_PORT GPIOG
#define BSP_COM6_RX_GPIO_CLK RCC_AHB1Periph_GPIOG
#else
#define BSP_COM6_TX_AF_PIN GPIO_PinSource6
#define BSP_COM6_TX_PIN GPIO_Pin_6
#define BSP_COM6_TX_GPIO_PORT GPIOC
#define BSP_COM6_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define BSP_COM6_RX_AF_PIN GPIO_PinSource7
#define BSP_COM6_RX_PIN GPIO_Pin_7
#define BSP_COM6_RX_GPIO_PORT GPIOC
#define BSP_COM6_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#endif #define BSP_COM6_IRQn USART6_IRQn #define BSP_COM6_DMA_DR_BASE 0x40011404
#define BSP_COM6_DMA_CLK RCC_AHB1Periph_DMA2
#define BSP_COM6_Tx_DMA_FLAG DMA_FLAG_TCIF6
#define BSP_COM6_Tx_DMA_Stream DMA2_Stream6
#define BSP_COM6_Tx_DMA_Channel DMA_Channel_5 #define BSP_COM6_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM6_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
396 * @brief Definition for COM port7, connected to USART7
397 */
#define BSP_COM7 UART7
#define BSP_COM7_CLK RCC_APB1Periph_UART7
#define BSP_COM7_AF GPIO_AF_UART7
#ifdef COM_7_3
#define BSP_COM7_TX_AF_PIN GPIO_PinSource8
#define BSP_COM7_TX_PIN GPIO_Pin_8
#define BSP_COM7_TX_GPIO_PORT GPIOE
#define BSP_COM7_TX_GPIO_CLK RCC_AHB1Periph_GPIOE
#define BSP_COM7_RX_AF_PIN GPIO_PinSource6
#define BSP_COM7_RX_PIN GPIO_Pin_6
#define BSP_COM7_RX_GPIO_PORT GPIOF
#define BSP_COM7_RX_GPIO_CLK RCC_AHB1Periph_GPIOF
#elif defined(COM_7_2)
#define BSP_COM7_TX_AF_PIN GPIO_PinSource7
#define BSP_COM7_TX_PIN GPIO_Pin_7
#define BSP_COM7_TX_GPIO_PORT GPIOF
#define BSP_COM7_TX_GPIO_CLK RCC_AHB1Periph_GPIOF
#define BSP_COM7_RX_AF_PIN GPIO_PinSource7
#define BSP_COM7_RX_PIN GPIO_Pin_7
#define BSP_COM7_RX_GPIO_PORT GPIOE
#define BSP_COM7_RX_GPIO_CLK RCC_AHB1Periph_GPIOE
#elif defined(COM_7_1)
#define BSP_COM7_TX_AF_PIN GPIO_PinSource7
#define BSP_COM7_TX_PIN GPIO_Pin_7
#define BSP_COM7_TX_GPIO_PORT GPIOF
#define BSP_COM7_TX_GPIO_CLK RCC_AHB1Periph_GPIOF
#define BSP_COM7_RX_AF_PIN GPIO_PinSource6
#define BSP_COM7_RX_PIN GPIO_Pin_6
#define BSP_COM7_RX_GPIO_PORT GPIOF
#define BSP_COM7_RX_GPIO_CLK RCC_AHB1Periph_GPIOF
#else
#define BSP_COM7_TX_AF_PIN GPIO_PinSource8
#define BSP_COM7_TX_PIN GPIO_Pin_8
#define BSP_COM7_TX_GPIO_PORT GPIOE
#define BSP_COM7_TX_GPIO_CLK RCC_AHB1Periph_GPIOE
#define BSP_COM7_RX_AF_PIN GPIO_PinSource7
#define BSP_COM7_RX_PIN GPIO_Pin_7
#define BSP_COM7_RX_GPIO_PORT GPIOE
#define BSP_COM7_RX_GPIO_CLK RCC_AHB1Periph_GPIOE
#endif #define BSP_COM7_IRQn UART7_IRQn #define BSP_COM7_DMA_DR_BASE 0x40007804
#define BSP_COM7_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM7_Tx_DMA_FLAG DMA_FLAG_TCIF1
#define BSP_COM7_Tx_DMA_Stream DMA1_Stream1
#define BSP_COM7_Tx_DMA_Channel DMA_Channel_5 #define BSP_COM7_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM7_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /**
451 * @brief Definition for COM port8, connected to USART8
452 */
#define BSP_COM8 UART8
#define BSP_COM8_CLK RCC_APB1Periph_UART8
#define BSP_COM8_AF GPIO_AF_UART8 #define BSP_COM8_TX_AF_PIN GPIO_PinSource1
#define BSP_COM8_TX_PIN GPIO_Pin_1
#define BSP_COM8_TX_GPIO_PORT GPIOE
#define BSP_COM8_TX_GPIO_CLK RCC_AHB1Periph_GPIOE
#define BSP_COM8_RX_AF_PIN GPIO_PinSource0
#define BSP_COM8_RX_PIN GPIO_Pin_0
#define BSP_COM8_RX_GPIO_PORT GPIOE
#define BSP_COM8_RX_GPIO_CLK RCC_AHB1Periph_GPIOE #define BSP_COM8_IRQn UART8_IRQn #define BSP_COM8_DMA_DR_BASE 0x40007C04
#define BSP_COM8_DMA_CLK RCC_AHB1Periph_DMA1
#define BSP_COM8_Tx_DMA_FLAG DMA_FLAG_TCIF0
#define BSP_COM8_Tx_DMA_Stream DMA1_Stream0
#define BSP_COM8_Tx_DMA_Channel DMA_Channel_5 #define BSP_COM8_Tx_BUFF_SIZE 0x400 //发送缓冲区大小
#define BSP_COM8_Rx_BUFF_SIZE 0x400 //接收缓冲区大小 /******************************函数声明****************************************/
void BSP_UartOpen(uint8_t COM, uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity);
void BSP_UartClose(uint8_t COM);
uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len);
uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len);
uint32_t BSP_UartTxIdleState(uint8_t COM); #endif

BSP_Uart.h

    /*
2 ********************************************************************************
3 *
4 * Queue.c
5 *
6 * File : Queue.c
7 * Version : V1.0
8 * Author : whq
9 * Mode : Thumb2
10 * Toolchain :
11 * Description : 队列操作
12 *
13 * History :
14 * Date : 2013.07.22
15 *******************************************************************************/ #include <string.h> #include "Queue.h"
/*******************************************************************************
21 * Function Name : uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t lenSize)
22 * Description : 队列建立
23 * Input : pQ8: 队列
24 pBuf: 队列缓冲区地址
25 bufSize:队列缓冲区大小
26 * Output :
27 * Other :
28 * Date : 2013.08.29
29 *******************************************************************************/
uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t bufSize)
{
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pBuf);
ASSERT_PARAM(bufSize); pQ8->bufSize = bufSize;
pQ8->pBuf = pBuf;
pQ8->pStart = pBuf;
pQ8->pEnd = pBuf; return ;
} /*******************************************************************************
45 * Function Name : uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len)
46 * Description : 数据载入队列
47 * Input : pQ8: 队列
48 pData: 要进队列的数据
49 len: 数据长度
50 * Output :
51 * Other :
52 * Date : 2013.08.29
53 *******************************************************************************/
uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len)
{
uint32_t dataLen = len; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); while (dataLen--)
{
*pQ8->pEnd++ = *pData++; if (pQ8->pEnd >= pQ8->pBuf + pQ8->bufSize) //指针指向栈尾
{
pQ8->pEnd = pQ8->pBuf;
} if (pQ8->pEnd == pQ8->pStart) //缓冲区填满 覆盖最早的数据
{
pQ8->pStart++;
if (pQ8->pStart >= pQ8->pBuf + pQ8->bufSize)
{
pQ8->pStart = pQ8->pBuf;
}
}
} return len;
} /*******************************************************************************
86 * Function Name : uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen)
87 * Description : 队列中取数据
88 * Input : pQ8: 队列
89 pData: 缓冲区
90 dataLen:缓冲区大小
91 * Output :
92 * Other :
93 * Date : 2013.08.29
94 *******************************************************************************/
uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen)
{
uint32_t index = ; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); while ((pQ8->pStart != pQ8->pEnd) && (index < dataLen) && (index < pQ8->bufSize))
{
pData[index++] = *pQ8->pStart++;
if (pQ8->pStart >= pQ8->pBuf + pQ8->bufSize)
{
pQ8->pStart = pQ8->pBuf;
}
} return index;
} /*******************************************************************************
117 * Function Name : uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen)
118 * Description : 以起始符和结束符取队列中的数据 (取出的数据 包括起始符 和分隔符)
119 * Input : pQ8: 队列
120 startChar: 起始符
121 endChar: 结束符
122 pData: 缓冲区
123 dataLen: 缓冲区大小
124 * Output :
125 * Other :
126 * Date : 2013.08.29
127 *******************************************************************************/
uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen)
{
int32_t count;
int32_t index;
volatile uint8_t *pStart;
volatile uint8_t *pEnd; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); pStart = pQ8->pStart;
count = pQ8->bufSize; while ((pStart != pQ8->pEnd) && count--) //查找起始字符
{
if (startChar == *pStart) break;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} if (pStart == pQ8->pEnd) return ; //未找到起始符
if (count == -) return ;
pEnd = pStart;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; while ((pEnd != pQ8->pEnd) && count--) //查找结束字符
{
if (endChar == *pEnd) break;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
} if (pEnd == pQ8->pEnd) return ; //未找结束符
if (count == -) return ;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; count = pQ8->bufSize - count;
index = ;
//获取从起始字符到结束字符的数据
while ((pStart != pEnd) && (index < dataLen) && (index < pQ8->bufSize) && count--)
{
pData[index++] = *pStart++;
if (pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} pQ8->pStart = pEnd;
return index;
} /*******************************************************************************
178 * Function Name : uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
179 * Description : 提取首尾双分隔符内的数据(包括分隔符)
180 * Input : pQ8: 队列
181 startChar: 起始符
182 endChar: 结束符
183 pData: 缓冲区
184 dataLen: 缓冲区大小
185 * Output :
186 * Other :
187 * Date : 2013.08.30
188 *******************************************************************************/
uint32_t QUEUE_PacketDoubleByteSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
{
int32_t count;
int32_t index;
volatile uint8_t *pStart;
volatile uint8_t *pEnd; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); pStart = pQ8->pStart;
count = pQ8->bufSize; while ((pStart != pQ8->pEnd) && count--) //查找起始字符
{
if (splitChar == *pStart) break;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} if (pStart == pQ8->pEnd) return ; //未找到起始符
if (count == -) return ;
pEnd = pStart;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; while ((pEnd != pQ8->pEnd) && count--) //查找结束字符
{
if (splitChar == *pEnd) break;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
} if (pEnd == pQ8->pEnd) return ; //未找结束符
if (count == -) return ;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; count = pQ8->bufSize - count;
index = ;
//获取从起始字符到结束字符的数据
while ((pStart != pEnd) && (index < dataLen) && (index < pQ8->bufSize) && count--)
{
pData[index++] = *pStart++;
if (pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} //如果取出的数据只包括分隔符,有可能是上次结束符和下次起始符,因此放弃上次结束符。
if (index <= )
{
index = ;
if (--pStart < pQ8->pBuf) pStart = pQ8->pBuf + pQ8->bufSize - ;
} pQ8->pStart = pStart;
return index;
} /*******************************************************************************
246 * Function Name : uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
247 * Description : 提取单结束分隔符的数据 (包括分隔符)
248 * Input :
249 * Output :
250 * Other :
251 * Date : 2013.10.20
252 *******************************************************************************/
uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
{
int32_t count;
int32_t index;
volatile uint8_t *pStart;
volatile uint8_t *pEnd; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); pStart = pQ8->pStart;
count = pQ8->bufSize; while ((pStart != pQ8->pEnd) && count--) //查找起始字符
{
if (splitChar == *pStart) break;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} if (pStart == pQ8->pEnd) return ; //未找到起始符
if (count == -) return ;
pEnd = pStart;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; pStart = pQ8->pStart;
count = pQ8->bufSize;
index = ;
while ((pStart != pEnd) && (index < dataLen) && count--) //查找起始字符
{
pData[index++] = *pStart;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} pQ8->pStart = pStart;
return index;
} /*******************************************************************************
293 * Function Name :QUEUE_PacketDoubleCharSplit
294 * Description :提取双结束分隔符的数据 (包括分隔符)
295 * Input :QUEUE8_TYPE * pQ8
296 * Input :uint8_t splitChar1
297 * Input :uint8_t splitChar2
298 * Input :uint8_t * pData
299 * Input :uint32_t dataLen
300 * Output :uint32_t
301 * Other :
302 * Date :2014/03/27
303 *******************************************************************************/
uint32_t QUEUE_PacketDoubleCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar1, uint8_t splitChar2, uint8_t *pData, uint32_t dataLen)
{
int32_t count;
int32_t index;
volatile uint8_t *pStart;
volatile uint8_t *pEnd;
uint8_t lastChar = ; ASSERT_PARAM(pData);
ASSERT_PARAM(pQ8);
ASSERT_PARAM(pQ8->pStart);
ASSERT_PARAM(pQ8->pEnd); pStart = pQ8->pStart;
count = pQ8->bufSize; while ((pStart != pQ8->pEnd) && count--) //查找起始字符
{
if ((splitChar1 == lastChar) && (splitChar2 == *pStart)) break; lastChar = *pStart; if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} if (pStart == pQ8->pEnd) return ; //未找到起始符
if (count == -) return ;
pEnd = pStart;
if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf; pStart = pQ8->pStart;
count = pQ8->bufSize;
index = ;
while ((pStart != pEnd) && (index < dataLen) && count--) //查找起始字符
{
pData[index++] = *pStart;
if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
} pQ8->pStart = pStart;
return index;
} /*******************************************************************************
349 * Function Name : void ASSERT_FAILED(uint8_t* file, uint32_t line)
350 * Description : 异常
351 * Input :
352 * Output :
353 * Other :
354 * Date : 2013.08.29
355 *******************************************************************************/
void ASSERT_FAILED(uint8_t* file, uint32_t line)
{
uint8_t flg = ; while (flg);
}

Queue.c

   /*
2 ********************************************************************************
3 *
4 * Queue.h
5 *
6 * File : Queue.h
7 * Version : V1.0
8 * Author : whq
9 * Mode : Thumb2
10 * Toolchain :
11 * Description : 队列操作头文件
12 *
13 * History :
14 * Date : 2013.07.22
15 *******************************************************************************/ #ifndef _QUEUE_H_
#define _QUEUE_H_ #ifdef __cplusplus
extern "C"
{
#endif #include "stdint.h" #define DEBUG_FULL_ASSERT 0 #ifdef DEBUG_FULL_ASSERT
#define ASSERT_PARAM(a) ((a) ? (void)0 : ASSERT_FAILED((uint8_t *)__FILE__, __LINE__))
void ASSERT_FAILED(uint8_t* file, uint32_t line);
#else
#define ASSERT_PARAM(a) if (a == NULL) return 0;
#endif typedef struct {
volatile uint32_t bufSize;
volatile uint8_t *pStart;
volatile uint8_t *pEnd;
volatile uint8_t *pBuf;
}QUEUE8_TYPE; uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t bufSize);
uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len);
uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen);
uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen);
uint32_t QUEUE_PacketDoubleByteSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen);
uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen);
uint32_t QUEUE_PacketDoubleCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar1, uint8_t splitChar2, uint8_t *pData, uint32_t dataLen); #ifdef __cplusplus
}
#endif #endif

Queue.h

05-28 11:15