打印
[应用相关]

STM32F4XX高效驱动篇1-UART

[复制链接]
496|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
condition|  楼主 | 2019-6-18 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下。并奉驱动程序,本程序覆盖uart1-8。
串口驱动,这是在每个单片机中可以说是必备接口。可以说大部分产品中都会使用,更有甚者一个产品中用到8个串口。这样一个高效的驱动是决定您产品优劣的关键因素。本文主要针对STM32F4XX系列芯片做的一个驱动接口层。以减少您在开发项目时驱动方面所花费时间,以及为程序达到高效的处理为目的。
从51,pic到现在的STM32,个人感觉STM32这方面做的非常突出,丰富的使用模式,强大的引脚映射功能,强大的处理能力等,给我留下的深刻的印象。

使用特权

评论回复
沙发
condition|  楼主 | 2019-6-18 10:03 | 只看该作者
关于串口的使用方式,个人总结出以下三种:

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

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

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

使用特权

评论回复
板凳
condition|  楼主 | 2019-6-18 10:04 | 只看该作者
本帖最后由 condition 于 2019-6-18 10:05 编辑

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

使用特权

评论回复
地板
condition|  楼主 | 2019-6-18 10:04 | 只看该作者

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

使用特权

评论回复
5
condition|  楼主 | 2019-6-18 10:05 | 只看该作者
在数据接收中断方面还分二种方式,

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

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

使用特权

评论回复
6
condition|  楼主 | 2019-6-18 10:05 | 只看该作者
以下程序则主要是使用到接收使用方式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);

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

使用特权

评论回复
7
condition|  楼主 | 2019-6-18 10:06 | 只看该作者
具体接口的使用方法,函数都有详细的说明。
/*
********************************************************************************
*
*                                 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] = {0};
static uint8_t COM1_RX_BUFF[BSP_COM1_Rx_BUFF_SIZE] = {0};
static QUEUE8_TYPE COM1_RX_QUEUE = {0};
#endif

#if COM2_EN
static uint8_t COM2_TX_BUFF[BSP_COM2_Tx_BUFF_SIZE] = {0};
static uint8_t COM2_RX_BUFF[BSP_COM2_Rx_BUFF_SIZE] = {0};
static QUEUE8_TYPE COM2_RX_QUEUE = {0};
#endif

#if COM3_EN
static uint8_t COM3_TX_BUFF[BSP_COM3_Tx_BUFF_SIZE] = {0};
static uint8_t COM3_RX_BUFF[BSP_COM3_Rx_BUFF_SIZE] = {0};
static QUEUE8_TYPE COM3_RX_QUEUE = {0};
#endif

#if COM4_EN
static uint8_t COM4_TX_BUFF[BSP_COM4_Tx_BUFF_SIZE] = {0};
static uint8_t COM4_RX_BUFF[BSP_COM4_Rx_BUFF_SIZE] = {0};
static QUEUE8_TYPE COM4_RX_QUEUE = {0};
#endif

#if COM5_EN
static uint8_t COM5_TX_BUFF[BSP_COM5_Tx_BUFF_SIZE] = {0};
static uint8_t COM5_RX_BUFF[BSP_COM5_Rx_BUFF_SIZE] = {0};
static QUEUE8_TYPE COM5_RX_QUEUE = {0};
#endif

#if COM6_EN
static uint8_t COM6_TX_BUFF[BSP_COM6_Tx_BUFF_SIZE] = {0};
static uint8_t COM6_RX_BUFF[BSP_COM6_Rx_BUFF_SIZE] = {0};
static QUEUE8_TYPE COM6_RX_QUEUE = {0};
#endif

#if COM7_EN
static uint8_t COM7_TX_BUFF[BSP_COM7_Tx_BUFF_SIZE] = {0};
static uint8_t COM7_RX_BUFF[BSP_COM7_Rx_BUFF_SIZE] = {0};
static QUEUE8_TYPE COM7_RX_QUEUE = {0};
#endif

#if COM8_EN
static uint8_t COM8_TX_BUFF[BSP_COM8_Tx_BUFF_SIZE] = {0};
static uint8_t COM8_RX_BUFF[BSP_COM8_Rx_BUFF_SIZE] = {0};
static QUEUE8_TYPE COM8_RX_QUEUE = {0};
#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[3] = {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 == 2)? USART_StopBits_2 : USART_StopBits_1;
    USART_InitStructure.USART_WordLength = (data == 9)? USART_WordLength_9b : USART_WordLength_8b;
    USART_InitStructure.USART_Parity = (parity < 3)? 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 = 3;
    NvicInitdef.NVIC_IRQChannelSubPriority = 0;
    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 = 0;
    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 0;
        
    if (0 == len)
        return 0;
        
    if ((DMA_GetCurrDataCounter(COM_DMA_TX_STREAM[COM]) == 0)
        && (DMA_FIFOStatus_Empty == DMA_GetFIFOStatus(COM_DMA_TX_STREAM[COM])))
    {
        uint32_t resLen = 0;

        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 0;
}

/*******************************************************************************
* 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, 1);
    }
}

#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

使用特权

评论回复
8
condition|  楼主 | 2019-6-18 10:06 | 只看该作者
1 /*
  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 *******************************************************************************/
16
17 #ifndef _BSP_UART_H_
18 #define _BSP_UART_H_
19
20 #include <stdint.h>
21
22
23 #define COM1_EN         1
24 #define COM2_EN         1
25 #define COM3_EN         1
26 #define COM4_EN         1
27 #define COM5_EN         1
28 #define COM6_EN         1
29 #define COM7_EN         0
30 #define COM8_EN         0
31
32
33
34 #define COM_1_0                             //映射:COM_1_0,映射1:COM_1_1
35 #define COM_2_0                             //映射:COM_2_0,映射1:COM_2_1
36 #define COM_3_2                             //映射:COM_3_2,
37 #define COM_4_0
38 #define COM_5_0
39 #define COM_6_0
40 #define COM_7_0
41 #define COM_8_0
42
43
44
45 #if !(COM1_EN || COM2_EN || COM3_EN || COM4_EN || COM5_EN || COM6_EN || COM7_EN || COM8_EN)
46 #error  "请至少使能一路串口!"
47 #endif
48
49
50 typedef enum {
51 #if     COM1_EN
52         COM1,
53 #endif
54 #if     COM2_EN
55         COM2,
56 #endif
57 #if     COM3_EN
58         COM3,
59 #endif
60 #if     COM4_EN
61         COM4,
62 #endif
63 #if     COM5_EN
64         COM5,
65 #endif
66 #if     COM6_EN
67         COM6,
68 #endif
69 #if     COM7_EN
70         COM7,
71 #endif
72 #if     COM8_EN
73         COM8,
74 #endif
75     COM_MAX
76 }COM_PORT;
77
78 /** @addtogroup STM3210E_BSP_LOW_LEVEL_COM
79   * @{
80   */
81 #define COMn                                COM_MAX
82
83
84
85 /**
86  * [url=home.php?mod=space&uid=247401]@brief[/url] Definition for COM port1, connected to USART1
87  */
88 #define BSP_COM1                            USART1
89 #define BSP_COM1_CLK                        RCC_APB2Periph_USART1
90 #define BSP_COM1_AF                         GPIO_AF_USART1
91 #ifdef COM_1_3
92 #define BSP_COM1_TX_AF_PIN                  GPIO_PinSource6
93 #define BSP_COM1_TX_PIN                     GPIO_Pin_6
94 #define BSP_COM1_TX_GPIO_PORT               GPIOB
95 #define BSP_COM1_TX_GPIO_CLK                RCC_AHB1Periph_GPIOB
96 #define BSP_COM1_RX_AF_PIN                  GPIO_PinSource10
97 #define BSP_COM1_RX_PIN                     GPIO_Pin_10
98 #define BSP_COM1_RX_GPIO_PORT               GPIOA
99 #define BSP_COM1_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
100 #elif defined(COM_1_2)
101 #define BSP_COM1_TX_AF_PIN                  GPIO_PinSource9
102 #define BSP_COM1_TX_PIN                     GPIO_Pin_9
103 #define BSP_COM1_TX_GPIO_PORT               GPIOA
104 #define BSP_COM1_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
105 #define BSP_COM1_RX_AF_PIN                  GPIO_PinSource7
106 #define BSP_COM1_RX_PIN                     GPIO_Pin_7
107 #define BSP_COM1_RX_GPIO_PORT               GPIOB
108 #define BSP_COM1_RX_GPIO_CLK                RCC_AHB1Periph_GPIOB
109 #elif defined(COM_1_1)
110 #define BSP_COM1_TX_AF_PIN                  GPIO_PinSource6
111 #define BSP_COM1_TX_PIN                     GPIO_Pin_6
112 #define BSP_COM1_TX_GPIO_PORT               GPIOB
113 #define BSP_COM1_TX_GPIO_CLK                RCC_AHB1Periph_GPIOB
114 #define BSP_COM1_RX_AF_PIN                  GPIO_PinSource7
115 #define BSP_COM1_RX_PIN                     GPIO_Pin_7
116 #define BSP_COM1_RX_GPIO_PORT               GPIOB
117 #define BSP_COM1_RX_GPIO_CLK                RCC_AHB1Periph_GPIOB
118 #else
119 #define BSP_COM1_TX_AF_PIN                  GPIO_PinSource9
120 #define BSP_COM1_TX_PIN                     GPIO_Pin_9
121 #define BSP_COM1_TX_GPIO_PORT               GPIOA
122 #define BSP_COM1_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
123 #define BSP_COM1_RX_AF_PIN                  GPIO_PinSource10
124 #define BSP_COM1_RX_PIN                     GPIO_Pin_10
125 #define BSP_COM1_RX_GPIO_PORT               GPIOA
126 #define BSP_COM1_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
127 #endif
128
129 #define BSP_COM1_IRQn                       USART1_IRQn
130
131 #define BSP_COM1_DMA_DR_BASE                0x40011004
132 #define BSP_COM1_DMA_CLK                    RCC_AHB1Periph_DMA2
133 #define BSP_COM1_Tx_DMA_FLAG                DMA_FLAG_TCIF7
134 #define BSP_COM1_Tx_DMA_Stream              DMA2_Stream7
135 #define BSP_COM1_Tx_DMA_Channel             DMA_Channel_4
136
137 #define BSP_COM1_Tx_BUFF_SIZE               0x600       //发送缓冲区大小
138 #define BSP_COM1_Rx_BUFF_SIZE               0x600         //接收缓冲区大小
139
140
141 /**
142  * @brief Definition for COM port2, connected to USART2
143  */
144 #define BSP_COM2                            USART2
145 #define BSP_COM2_CLK                        RCC_APB1Periph_USART2
146 #define BSP_COM2_AF                         GPIO_AF_USART2
147
148 #ifdef COM_2_3
149 #define BSP_COM2_TX_AF_PIN                  GPIO_PinSource2
150 #define BSP_COM2_TX_PIN                     GPIO_Pin_2
151 #define BSP_COM2_TX_GPIO_PORT               GPIOA
152 #define BSP_COM2_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
153 #define BSP_COM2_RX_AF_PIN                  GPIO_PinSource6
154 #define BSP_COM2_RX_PIN                     GPIO_Pin_6
155 #define BSP_COM2_RX_GPIO_PORT               GPIOD
156 #define BSP_COM2_RX_GPIO_CLK                RCC_AHB1Periph_GPIOD
157 #elif defined(COM_2_2)
158 #define BSP_COM2_TX_AF_PIN                  GPIO_PinSource5
159 #define BSP_COM2_TX_PIN                     GPIO_Pin_5
160 #define BSP_COM2_TX_GPIO_PORT               GPIOD
161 #define BSP_COM2_TX_GPIO_CLK                RCC_AHB1Periph_GPIOD
162 #define BSP_COM2_RX_AF_PIN                  GPIO_PinSource3
163 #define BSP_COM2_RX_PIN                     GPIO_Pin_3
164 #define BSP_COM2_RX_GPIO_PORT               GPIOA
165 #define BSP_COM2_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
166 #elif defined(COM_2_1)
167 #define BSP_COM2_TX_AF_PIN                  GPIO_PinSource5
168 #define BSP_COM2_TX_PIN                     GPIO_Pin_5
169 #define BSP_COM2_TX_GPIO_PORT               GPIOD
170 #define BSP_COM2_TX_GPIO_CLK                RCC_AHB1Periph_GPIOD
171 #define BSP_COM2_RX_AF_PIN                  GPIO_PinSource6
172 #define BSP_COM2_RX_PIN                     GPIO_Pin_6
173 #define BSP_COM2_RX_GPIO_PORT               GPIOD
174 #define BSP_COM2_RX_GPIO_CLK                RCC_AHB1Periph_GPIOD
175 #else
176 #define BSP_COM2_TX_AF_PIN                  GPIO_PinSource2
177 #define BSP_COM2_TX_PIN                     GPIO_Pin_2
178 #define BSP_COM2_TX_GPIO_PORT               GPIOA
179 #define BSP_COM2_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
180 #define BSP_COM2_RX_AF_PIN                  GPIO_PinSource3
181 #define BSP_COM2_RX_PIN                     GPIO_Pin_3
182 #define BSP_COM2_RX_GPIO_PORT               GPIOA
183 #define BSP_COM2_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
184 #endif
185     
186 #define BSP_COM2_IRQn                       USART2_IRQn
187     
188 #define BSP_COM2_DMA_DR_BASE                0x40004404
189 #define BSP_COM2_DMA_CLK                    RCC_AHB1Periph_DMA1
190 #define BSP_COM2_Tx_DMA_FLAG                DMA_FLAG_TCIF6
191 #define BSP_COM2_Tx_DMA_Stream              DMA1_Stream6
192 #define BSP_COM2_Tx_DMA_Channel             DMA_Channel_4
193
194 #define BSP_COM2_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
195 #define BSP_COM2_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
196
197
198
199 /**
200  * @brief Definition for COM port3, connected to USART3
201  */
202 #define BSP_COM3                            USART3
203 #define BSP_COM3_CLK                        RCC_APB1Periph_USART3
204 #define BSP_COM3_AF                         GPIO_AF_USART3
205 #ifdef COM_3_3                              //自由组合部分
206 #define BSP_COM3_TX_AF_PIN                  GPIO_PinSource8
207 #define BSP_COM3_TX_PIN                     GPIO_Pin_8
208 #define BSP_COM3_TX_GPIO_PORT               GPIOD
209 #define BSP_COM3_TX_GPIO_CLK                RCC_AHB1Periph_GPIOD
210 #define BSP_COM3_RX_AF_PIN                  GPIO_PinSource11
211 #define BSP_COM3_RX_PIN                     GPIO_Pin_11
212 #define BSP_COM3_RX_GPIO_PORT               GPIOC
213 #define BSP_COM3_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
214 #elif defined(COM_3_2)
215 #define BSP_COM3_TX_AF_PIN                  GPIO_PinSource8
216 #define BSP_COM3_TX_PIN                     GPIO_Pin_8
217 #define BSP_COM3_TX_GPIO_PORT               GPIOD
218 #define BSP_COM3_TX_GPIO_CLK                RCC_AHB1Periph_GPIOD
219 #define BSP_COM3_RX_AF_PIN                  GPIO_PinSource9
220 #define BSP_COM3_RX_PIN                     GPIO_Pin_9
221 #define BSP_COM3_RX_GPIO_PORT               GPIOD
222 #define BSP_COM3_RX_GPIO_CLK                RCC_AHB1Periph_GPIOD
223 #elif defined(COM_3_1)
224 #define BSP_COM3_TX_AF_PIN                  GPIO_PinSource10
225 #define BSP_COM3_TX_PIN                     GPIO_Pin_10
226 #define BSP_COM3_TX_GPIO_PORT               GPIOC
227 #define BSP_COM3_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
228 #define BSP_COM3_RX_AF_PIN                  GPIO_PinSource11
229 #define BSP_COM3_RX_PIN                     GPIO_Pin_11
230 #define BSP_COM3_RX_GPIO_PORT               GPIOC
231 #define BSP_COM3_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
232 #else
233 #define BSP_COM3_TX_AF_PIN                  GPIO_PinSource10
234 #define BSP_COM3_TX_PIN                     GPIO_Pin_10
235 #define BSP_COM3_TX_GPIO_PORT               GPIOB
236 #define BSP_COM3_TX_GPIO_CLK                RCC_AHB1Periph_GPIOB
237 #define BSP_COM3_RX_AF_PIN                  GPIO_PinSource11
238 #define BSP_COM3_RX_PIN                     GPIO_Pin_11
239 #define BSP_COM3_RX_GPIO_PORT               GPIOB
240 #define BSP_COM3_RX_GPIO_CLK                RCC_AHB1Periph_GPIOB
241 #endif
242     
243 #define BSP_COM3_IRQn                       USART3_IRQn
244     
245 #define BSP_COM3_DMA_DR_BASE                0x40004804
246 #define BSP_COM3_DMA_CLK                    RCC_AHB1Periph_DMA1
247 #define BSP_COM3_Tx_DMA_FLAG                DMA_FLAG_TCIF3
248 #define BSP_COM3_Tx_DMA_Stream              DMA1_Stream3
249 #define BSP_COM3_Tx_DMA_Channel             DMA_Channel_4
250
251 #define BSP_COM3_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
252 #define BSP_COM3_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
253
254
255 /**
256  * @brief Definition for COM port4, connected to USART4
257  */
258 #define BSP_COM4                            UART4
259 #define BSP_COM4_CLK                        RCC_APB1Periph_UART4
260 #define BSP_COM4_AF                         GPIO_AF_UART4
261 #ifdef COM_4_3
262 #define BSP_COM4_TX_AF_PIN                  GPIO_PinSource10
263 #define BSP_COM4_TX_PIN                     GPIO_Pin_10
264 #define BSP_COM4_TX_GPIO_PORT               GPIOC
265 #define BSP_COM4_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
266 #define BSP_COM4_RX_AF_PIN                  GPIO_PinSource1
267 #define BSP_COM4_RX_PIN                     GPIO_Pin_1
268 #define BSP_COM4_RX_GPIO_PORT               GPIOA
269 #define BSP_COM4_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
270 #elif defined(COM_4_2)
271 #define BSP_COM4_TX_AF_PIN                  GPIO_PinSource0
272 #define BSP_COM4_TX_PIN                     GPIO_Pin_0
273 #define BSP_COM4_TX_GPIO_PORT               GPIOA
274 #define BSP_COM4_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
275 #define BSP_COM4_RX_AF_PIN                  GPIO_PinSource11
276 #define BSP_COM4_RX_PIN                     GPIO_Pin_11
277 #define BSP_COM4_RX_GPIO_PORT               GPIOC
278 #define BSP_COM4_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
279 #elif defined(COM_4_1)
280 #define BSP_COM4_TX_AF_PIN                  GPIO_PinSource10
281 #define BSP_COM4_TX_PIN                     GPIO_Pin_10
282 #define BSP_COM4_TX_GPIO_PORT               GPIOC
283 #define BSP_COM4_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
284 #define BSP_COM4_RX_AF_PIN                  GPIO_PinSource11
285 #define BSP_COM4_RX_PIN                     GPIO_Pin_11
286 #define BSP_COM4_RX_GPIO_PORT               GPIOC
287 #define BSP_COM4_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
288 #else
289 #define BSP_COM4_TX_AF_PIN                  GPIO_PinSource0
290 #define BSP_COM4_TX_PIN                     GPIO_Pin_0
291 #define BSP_COM4_TX_GPIO_PORT               GPIOA
292 #define BSP_COM4_TX_GPIO_CLK                RCC_AHB1Periph_GPIOA
293 #define BSP_COM4_RX_AF_PIN                  GPIO_PinSource1
294 #define BSP_COM4_RX_PIN                     GPIO_Pin_1
295 #define BSP_COM4_RX_GPIO_PORT               GPIOA
296 #define BSP_COM4_RX_GPIO_CLK                RCC_AHB1Periph_GPIOA
297 #endif
298         
299 #define BSP_COM4_IRQn                       UART4_IRQn
300         
301 #define BSP_COM4_DMA_DR_BASE                0x40004C04
302 #define BSP_COM4_DMA_CLK                    RCC_AHB1Periph_DMA1
303 #define BSP_COM4_Tx_DMA_FLAG                DMA_FLAG_TCIF4
304 #define BSP_COM4_Tx_DMA_Stream              DMA1_Stream4
305 #define BSP_COM4_Tx_DMA_Channel             DMA_Channel_4
306
307 #define BSP_COM4_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
308 #define BSP_COM4_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
309
310
311 /**
312  * @brief Definition for COM port5, connected to USART5
313  */
314 #define BSP_COM5                            UART5
315 #define BSP_COM5_CLK                        RCC_APB1Periph_UART5
316 #define BSP_COM5_AF                         GPIO_AF_UART5
317
318 #define BSP_COM5_TX_AF_PIN                  GPIO_PinSource12
319 #define BSP_COM5_TX_PIN                     GPIO_Pin_12
320 #define BSP_COM5_TX_GPIO_PORT               GPIOC
321 #define BSP_COM5_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
322 #define BSP_COM5_RX_AF_PIN                  GPIO_PinSource2
323 #define BSP_COM5_RX_PIN                     GPIO_Pin_2
324 #define BSP_COM5_RX_GPIO_PORT               GPIOD
325 #define BSP_COM5_RX_GPIO_CLK                RCC_AHB1Periph_GPIOD
326         
327 #define BSP_COM5_IRQn                       UART5_IRQn
328         
329 #define BSP_COM5_DMA_DR_BASE                0x40005004
330 #define BSP_COM5_DMA_CLK                    RCC_AHB1Periph_DMA1
331 #define BSP_COM5_Tx_DMA_FLAG                DMA_FLAG_TCIF7
332 #define BSP_COM5_Tx_DMA_Stream              DMA1_Stream7
333 #define BSP_COM5_Tx_DMA_Channel             DMA_Channel_4
334
335 #define BSP_COM5_Tx_BUFF_SIZE               125     //发送缓冲区大小
336 #define BSP_COM5_Rx_BUFF_SIZE               125     //接收缓冲区大小
337
338
339 /**
340  * @brief Definition for COM port6, connected to USART6
341  */
342 #define BSP_COM6                            USART6
343 #define BSP_COM6_CLK                        RCC_APB2Periph_USART6
344 #define BSP_COM6_AF                         GPIO_AF_USART6
345 #ifdef COM_6_3
346 #define BSP_COM6_TX_AF_PIN                  GPIO_PinSource6
347 #define BSP_COM6_TX_PIN                     GPIO_Pin_6
348 #define BSP_COM6_TX_GPIO_PORT               GPIOC
349 #define BSP_COM6_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
350 #define BSP_COM6_RX_AF_PIN                  GPIO_PinSource9
351 #define BSP_COM6_RX_PIN                     GPIO_Pin_9
352 #define BSP_COM6_RX_GPIO_PORT               GPIOG
353 #define BSP_COM6_RX_GPIO_CLK                RCC_AHB1Periph_GPIOG
354 #elif defined(COM_6_2)
355 #define BSP_COM6_TX_AF_PIN                  GPIO_PinSource14
356 #define BSP_COM6_TX_PIN                     GPIO_Pin_14
357 #define BSP_COM6_TX_GPIO_PORT               GPIOG
358 #define BSP_COM6_TX_GPIO_CLK                RCC_AHB1Periph_GPIOG
359 #define BSP_COM6_RX_AF_PIN                  GPIO_PinSource7
360 #define BSP_COM6_RX_PIN                     GPIO_Pin_7
361 #define BSP_COM6_RX_GPIO_PORT               GPIOC
362 #define BSP_COM6_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
363 #elif defined(COM_6_1)
364 #define BSP_COM6_TX_AF_PIN                  GPIO_PinSource14
365 #define BSP_COM6_TX_PIN                     GPIO_Pin_14
366 #define BSP_COM6_TX_GPIO_PORT               GPIOG
367 #define BSP_COM6_TX_GPIO_CLK                RCC_AHB1Periph_GPIOG
368 #define BSP_COM6_RX_AF_PIN                  GPIO_PinSource9
369 #define BSP_COM6_RX_PIN                     GPIO_Pin_9
370 #define BSP_COM6_RX_GPIO_PORT               GPIOG
371 #define BSP_COM6_RX_GPIO_CLK                RCC_AHB1Periph_GPIOG
372 #else
373 #define BSP_COM6_TX_AF_PIN                  GPIO_PinSource6
374 #define BSP_COM6_TX_PIN                     GPIO_Pin_6
375 #define BSP_COM6_TX_GPIO_PORT               GPIOC
376 #define BSP_COM6_TX_GPIO_CLK                RCC_AHB1Periph_GPIOC
377 #define BSP_COM6_RX_AF_PIN                  GPIO_PinSource7
378 #define BSP_COM6_RX_PIN                     GPIO_Pin_7
379 #define BSP_COM6_RX_GPIO_PORT               GPIOC
380 #define BSP_COM6_RX_GPIO_CLK                RCC_AHB1Periph_GPIOC
381 #endif
382         
383 #define BSP_COM6_IRQn                       USART6_IRQn
384         
385 #define BSP_COM6_DMA_DR_BASE                0x40011404
386 #define BSP_COM6_DMA_CLK                    RCC_AHB1Periph_DMA2
387 #define BSP_COM6_Tx_DMA_FLAG                DMA_FLAG_TCIF6
388 #define BSP_COM6_Tx_DMA_Stream              DMA2_Stream6
389 #define BSP_COM6_Tx_DMA_Channel             DMA_Channel_5
390
391         
392 #define BSP_COM6_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
393 #define BSP_COM6_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
394
395 /**
396  * @brief Definition for COM port7, connected to USART7
397  */
398 #define BSP_COM7                            UART7
399 #define BSP_COM7_CLK                        RCC_APB1Periph_UART7
400 #define BSP_COM7_AF                         GPIO_AF_UART7
401 #ifdef COM_7_3
402 #define BSP_COM7_TX_AF_PIN                  GPIO_PinSource8
403 #define BSP_COM7_TX_PIN                     GPIO_Pin_8
404 #define BSP_COM7_TX_GPIO_PORT               GPIOE
405 #define BSP_COM7_TX_GPIO_CLK                RCC_AHB1Periph_GPIOE
406 #define BSP_COM7_RX_AF_PIN                  GPIO_PinSource6
407 #define BSP_COM7_RX_PIN                     GPIO_Pin_6
408 #define BSP_COM7_RX_GPIO_PORT               GPIOF
409 #define BSP_COM7_RX_GPIO_CLK                RCC_AHB1Periph_GPIOF
410 #elif defined(COM_7_2)
411 #define BSP_COM7_TX_AF_PIN                  GPIO_PinSource7
412 #define BSP_COM7_TX_PIN                     GPIO_Pin_7
413 #define BSP_COM7_TX_GPIO_PORT               GPIOF
414 #define BSP_COM7_TX_GPIO_CLK                RCC_AHB1Periph_GPIOF
415 #define BSP_COM7_RX_AF_PIN                  GPIO_PinSource7
416 #define BSP_COM7_RX_PIN                     GPIO_Pin_7
417 #define BSP_COM7_RX_GPIO_PORT               GPIOE
418 #define BSP_COM7_RX_GPIO_CLK                RCC_AHB1Periph_GPIOE
419 #elif defined(COM_7_1)
420 #define BSP_COM7_TX_AF_PIN                  GPIO_PinSource7
421 #define BSP_COM7_TX_PIN                     GPIO_Pin_7
422 #define BSP_COM7_TX_GPIO_PORT               GPIOF
423 #define BSP_COM7_TX_GPIO_CLK                RCC_AHB1Periph_GPIOF
424 #define BSP_COM7_RX_AF_PIN                  GPIO_PinSource6
425 #define BSP_COM7_RX_PIN                     GPIO_Pin_6
426 #define BSP_COM7_RX_GPIO_PORT               GPIOF
427 #define BSP_COM7_RX_GPIO_CLK                RCC_AHB1Periph_GPIOF
428 #else
429 #define BSP_COM7_TX_AF_PIN                  GPIO_PinSource8
430 #define BSP_COM7_TX_PIN                     GPIO_Pin_8
431 #define BSP_COM7_TX_GPIO_PORT               GPIOE
432 #define BSP_COM7_TX_GPIO_CLK                RCC_AHB1Periph_GPIOE
433 #define BSP_COM7_RX_AF_PIN                  GPIO_PinSource7
434 #define BSP_COM7_RX_PIN                     GPIO_Pin_7
435 #define BSP_COM7_RX_GPIO_PORT               GPIOE
436 #define BSP_COM7_RX_GPIO_CLK                RCC_AHB1Periph_GPIOE
437 #endif
438         
439 #define BSP_COM7_IRQn                       UART7_IRQn
440         
441 #define BSP_COM7_DMA_DR_BASE                0x40007804
442 #define BSP_COM7_DMA_CLK                    RCC_AHB1Periph_DMA1
443 #define BSP_COM7_Tx_DMA_FLAG                DMA_FLAG_TCIF1
444 #define BSP_COM7_Tx_DMA_Stream              DMA1_Stream1
445 #define BSP_COM7_Tx_DMA_Channel             DMA_Channel_5
446
447 #define BSP_COM7_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
448 #define BSP_COM7_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
449
450 /**
451  * @brief Definition for COM port8, connected to USART8
452  */
453 #define BSP_COM8                            UART8
454 #define BSP_COM8_CLK                        RCC_APB1Periph_UART8
455 #define BSP_COM8_AF                         GPIO_AF_UART8
456
457 #define BSP_COM8_TX_AF_PIN                  GPIO_PinSource1
458 #define BSP_COM8_TX_PIN                     GPIO_Pin_1
459 #define BSP_COM8_TX_GPIO_PORT               GPIOE
460 #define BSP_COM8_TX_GPIO_CLK                RCC_AHB1Periph_GPIOE
461 #define BSP_COM8_RX_AF_PIN                  GPIO_PinSource0
462 #define BSP_COM8_RX_PIN                     GPIO_Pin_0
463 #define BSP_COM8_RX_GPIO_PORT               GPIOE
464 #define BSP_COM8_RX_GPIO_CLK                RCC_AHB1Periph_GPIOE
465         
466 #define BSP_COM8_IRQn                       UART8_IRQn
467         
468 #define BSP_COM8_DMA_DR_BASE                0x40007C04
469 #define BSP_COM8_DMA_CLK                    RCC_AHB1Periph_DMA1
470 #define BSP_COM8_Tx_DMA_FLAG                DMA_FLAG_TCIF0
471 #define BSP_COM8_Tx_DMA_Stream              DMA1_Stream0
472 #define BSP_COM8_Tx_DMA_Channel             DMA_Channel_5
473
474 #define BSP_COM8_Tx_BUFF_SIZE               0x400       //发送缓冲区大小
475 #define BSP_COM8_Rx_BUFF_SIZE               0x400       //接收缓冲区大小
476
477
478
479 /******************************函数声明****************************************/
480 void BSP_UartOpen(uint8_t COM,  uint32_t baud, uint8_t data, uint8_t stop, uint8_t parity);
481 void BSP_UartClose(uint8_t COM);
482 uint32_t BSP_UartWrite(uint8_t COM, uint8_t *buffter, uint32_t len);
483 uint32_t BSP_UartRead(uint8_t COM, uint8_t *buffter, uint32_t len);
484 uint32_t BSP_UartTxIdleState(uint8_t COM);
485
486
487
488 #endif

BSP_Uart.h

使用特权

评论回复
9
condition|  楼主 | 2019-6-18 10:06 | 只看该作者
1 /*
  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 *******************************************************************************/
16
17 #include <string.h>
18
19 #include "Queue.h"
20 /*******************************************************************************
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 *******************************************************************************/
30 uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t bufSize)
31 {
32     ASSERT_PARAM(pQ8);
33     ASSERT_PARAM(pBuf);
34     ASSERT_PARAM(bufSize);
35
36     pQ8->bufSize    = bufSize;
37     pQ8->pBuf       = pBuf;
38     pQ8->pStart     = pBuf;
39     pQ8->pEnd       = pBuf;
40
41     return 0;
42 }
43
44 /*******************************************************************************
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 *******************************************************************************/
54 uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len)
55 {
56     uint32_t dataLen = len;
57     
58     ASSERT_PARAM(pData);
59     ASSERT_PARAM(pQ8);
60     ASSERT_PARAM(pQ8->pStart);
61     ASSERT_PARAM(pQ8->pEnd);
62
63     while (dataLen--)
64     {
65         *pQ8->pEnd++ = *pData++;
66         
67         if (pQ8->pEnd >= pQ8->pBuf + pQ8->bufSize)      //指针指向栈尾
68         {
69             pQ8->pEnd = pQ8->pBuf;
70         }
71         
72         if (pQ8->pEnd == pQ8->pStart)                   //缓冲区填满 覆盖最早的数据
73         {
74             pQ8->pStart++;
75             if (pQ8->pStart >= pQ8->pBuf + pQ8->bufSize)
76             {
77                 pQ8->pStart = pQ8->pBuf;
78             }
79         }
80     }
81     
82     return len;
83 }
84
85 /*******************************************************************************
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 *******************************************************************************/
95 uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen)
96 {
97     uint32_t index = 0;
98     
99     ASSERT_PARAM(pData);
100     ASSERT_PARAM(pQ8);
101     ASSERT_PARAM(pQ8->pStart);
102     ASSERT_PARAM(pQ8->pEnd);
103
104     while ((pQ8->pStart != pQ8->pEnd) && (index < dataLen) && (index < pQ8->bufSize))
105     {
106         pData[index++] = *pQ8->pStart++;
107         if (pQ8->pStart >= pQ8->pBuf + pQ8->bufSize)
108         {
109             pQ8->pStart = pQ8->pBuf;
110         }
111     }
112
113     return index;
114 }
115
116 /*******************************************************************************
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 *******************************************************************************/
128 uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen)
129 {
130     int32_t count;
131     int32_t index;
132     volatile uint8_t *pStart;
133     volatile uint8_t *pEnd;
134     
135     ASSERT_PARAM(pData);
136     ASSERT_PARAM(pQ8);
137     ASSERT_PARAM(pQ8->pStart);
138     ASSERT_PARAM(pQ8->pEnd);
139
140     pStart      = pQ8->pStart;
141     count       = pQ8->bufSize;
142     
143     while ((pStart != pQ8->pEnd) && count--)        //查找起始字符
144     {
145         if (startChar == *pStart) break;
146         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
147     }
148
149     if (pStart == pQ8->pEnd) return 0;              //未找到起始符
150     if (count == -1) return 0;
151     pEnd = pStart;
152     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
153
154     while ((pEnd != pQ8->pEnd) && count--)          //查找结束字符
155     {
156         if (endChar == *pEnd) break;
157         if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
158     }
159     
160     if (pEnd == pQ8->pEnd) return 0;                //未找结束符
161     if (count == -1) return 0;
162     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
163     
164     count   = pQ8->bufSize - count;   
165     index   = 0;
166      //获取从起始字符到结束字符的数据
167     while ((pStart != pEnd) && (index < dataLen) && (index < pQ8->bufSize) && count--)
168     {
169         pData[index++] = *pStart++;
170         if (pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
171     }
172
173     pQ8->pStart = pEnd;
174     return index;
175 }
176
177 /*******************************************************************************
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 *******************************************************************************/
189 uint32_t QUEUE_PacketDoubleByteSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
190 {
191     int32_t count;
192     int32_t index;
193     volatile uint8_t *pStart;
194     volatile uint8_t *pEnd;
195     
196     ASSERT_PARAM(pData);
197     ASSERT_PARAM(pQ8);
198     ASSERT_PARAM(pQ8->pStart);
199     ASSERT_PARAM(pQ8->pEnd);
200
201     pStart      = pQ8->pStart;
202     count       = pQ8->bufSize;
203     
204     while ((pStart != pQ8->pEnd) && count--)        //查找起始字符
205     {
206         if (splitChar == *pStart) break;
207         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
208     }
209
210     if (pStart == pQ8->pEnd) return 0;              //未找到起始符
211     if (count == -1) return 0;
212     pEnd = pStart;
213     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
214
215     while ((pEnd != pQ8->pEnd) && count--)          //查找结束字符
216     {
217         if (splitChar == *pEnd) break;
218         if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
219     }
220     
221     if (pEnd == pQ8->pEnd) return 0;                //未找结束符
222     if (count == -1) return 0;
223     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
224     
225     count   = pQ8->bufSize - count;   
226     index   = 0;
227      //获取从起始字符到结束字符的数据
228     while ((pStart != pEnd) && (index < dataLen) && (index < pQ8->bufSize) && count--)
229     {
230         pData[index++] = *pStart++;
231         if (pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
232     }
233
234     //如果取出的数据只包括分隔符,有可能是上次结束符和下次起始符,因此放弃上次结束符。
235     if (index <= 2)                                 
236     {
237         index = 0;
238         if (--pStart < pQ8->pBuf) pStart = pQ8->pBuf + pQ8->bufSize - 1;
239     }
240
241     pQ8->pStart = pStart;
242     return index;
243 }
244
245 /*******************************************************************************
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 *******************************************************************************/
253 uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen)
254 {
255     int32_t count;
256     int32_t index;
257     volatile uint8_t *pStart;
258     volatile uint8_t *pEnd;
259     
260     ASSERT_PARAM(pData);
261     ASSERT_PARAM(pQ8);
262     ASSERT_PARAM(pQ8->pStart);
263     ASSERT_PARAM(pQ8->pEnd);
264
265     pStart      = pQ8->pStart;
266     count       = pQ8->bufSize;
267
268     while ((pStart != pQ8->pEnd) && count--)        //查找起始字符
269     {
270         if (splitChar == *pStart) break;
271         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
272     }
273
274     if (pStart == pQ8->pEnd) return 0;              //未找到起始符
275     if (count == -1) return 0;
276     pEnd = pStart;
277     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
278     
279     pStart      = pQ8->pStart;
280     count       = pQ8->bufSize;
281     index       = 0;
282     while ((pStart != pEnd) && (index < dataLen) && count--)        //查找起始字符
283     {
284         pData[index++] = *pStart;
285         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
286     }
287     
288     pQ8->pStart = pStart;
289     return index;
290 }
291
292 /*******************************************************************************
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 *******************************************************************************/
304 uint32_t QUEUE_PacketDoubleCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar1, uint8_t splitChar2, uint8_t *pData, uint32_t dataLen)
305 {
306     int32_t count;
307     int32_t index;
308     volatile uint8_t *pStart;
309     volatile uint8_t *pEnd;
310     uint8_t lastChar = 0;
311
312     ASSERT_PARAM(pData);
313     ASSERT_PARAM(pQ8);
314     ASSERT_PARAM(pQ8->pStart);
315     ASSERT_PARAM(pQ8->pEnd);
316
317     pStart      = pQ8->pStart;
318     count       = pQ8->bufSize;
319
320     while ((pStart != pQ8->pEnd) && count--)        //查找起始字符
321     {
322         if ((splitChar1 == lastChar) && (splitChar2 == *pStart)) break;
323
324         lastChar = *pStart;
325
326         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
327     }
328
329     if (pStart == pQ8->pEnd) return 0;              //未找到起始符
330     if (count == -1) return 0;
331     pEnd = pStart;
332     if (++pEnd >= pQ8->pBuf + pQ8->bufSize) pEnd = pQ8->pBuf;
333
334     pStart      = pQ8->pStart;
335     count       = pQ8->bufSize;
336     index       = 0;
337     while ((pStart != pEnd) && (index < dataLen) && count--)        //查找起始字符
338     {
339         pData[index++] = *pStart;
340         if (++pStart >= pQ8->pBuf + pQ8->bufSize) pStart = pQ8->pBuf;
341     }
342
343     pQ8->pStart = pStart;
344     return index;
345 }
346
347
348 /*******************************************************************************
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 *******************************************************************************/
356 void ASSERT_FAILED(uint8_t* file, uint32_t line)
357 {
358     uint8_t ** = 1;
359
360     while (**);
361 }

Queue.c

使用特权

评论回复
10
condition|  楼主 | 2019-6-18 10:07 | 只看该作者
1 /*
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 *******************************************************************************/
16
17
18 #ifndef _QUEUE_H_
19 #define _QUEUE_H_
20
21 #ifdef  __cplusplus
22 extern "C"
23 {
24 #endif
25
26
27
28 #include "stdint.h"
29
30 #define DEBUG_FULL_ASSERT       0
31
32 #ifdef DEBUG_FULL_ASSERT
33 #define ASSERT_PARAM(a)          ((a) ? (void)0 : ASSERT_FAILED((uint8_t *)__FILE__, __LINE__))
34 void ASSERT_FAILED(uint8_t* file, uint32_t line);
35 #else
36 #define ASSERT_PARAM(a)           if (a == NULL) return 0;
37 #endif
38
39
40
41
42
43 typedef struct {
44     volatile uint32_t     bufSize;
45     volatile uint8_t      *pStart;
46     volatile uint8_t      *pEnd;
47     volatile uint8_t      *pBuf;
48 }QUEUE8_TYPE;
49
50
51
52
53 uint32_t QUEUE_PacketCreate(QUEUE8_TYPE *pQ8, uint8_t *pBuf, uint32_t bufSize);
54 uint32_t QUEUE_PacketIn(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t len);
55 uint32_t QUEUE_PacketOut(QUEUE8_TYPE *pQ8, uint8_t *pData, uint32_t dataLen);
56 uint32_t QUEUE_PacketSplit(QUEUE8_TYPE *pQ8, uint8_t startChar, uint8_t endChar, uint8_t *pData, uint32_t dataLen);
57 uint32_t QUEUE_PacketDoubleByteSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen);
58 uint32_t QUEUE_PacketCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar, uint8_t *pData, uint32_t dataLen);
59 uint32_t QUEUE_PacketDoubleCharSplit(QUEUE8_TYPE *pQ8, uint8_t splitChar1, uint8_t splitChar2, uint8_t *pData, uint32_t dataLen);
60
61
62 #ifdef  __cplusplus
63 }
64 #endif
65
66 #endif

Queue.h

使用特权

评论回复
11
guanjiaer| | 2019-7-8 10:54 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
12
heimaojingzhang| | 2019-7-8 11:14 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
13
keaibukelian| | 2019-7-8 11:25 | 只看该作者
感谢楼主分享啊

使用特权

评论回复
14
labasi| | 2019-7-8 11:29 | 只看该作者

非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

256

帖子

1

粉丝