历史上的今天
返回首页

历史上的今天

今天是:2025年04月15日(星期二)

正在发生

2018年04月15日 | STM32 USART DMA发送 中断接收

2018-04-15 来源:eefocus

文件(usart.h):

#ifndef _USART__H

#define _USART__H


#define EMPTY 0xFFFF


extern vu32 uart2_transfer_complete;


typedef enum {

    BSP_UART_STOPBITS_1=1,

    BSP_UART_STOPBITS_2=2

}BSP_UART_StopBits;


typedef enum {

    BSP_UART_PARITY_NO=0,

    BSP_UART_PARITY_ODD=1,

    BSP_UART_PARITY_EVEN=2

}BSP_UART_Parity;


typedef enum {

    DATA_SIZE_BYTE=1,

    DATA_SIZE_HALF_WORD=2

}BSP_UART_DataSize;


typedef void (*usart_hook_func_t)(u16 recv_data);


void bsp_ISR_uart1_setRecvHook(usart_hook_func_t func);

void bsp_ISR_uart2_setRecvHook(usart_hook_func_t func);

void bsp_ISR_uart3_setRecvHook(usart_hook_func_t func);

void bsp_ISR_uart4_setRecvHook(usart_hook_func_t func);

void bsp_ISR_uart5_setRecvHook(usart_hook_func_t func);


void bsp_uart1_config(u32 bps, BSP_UART_StopBits stopbits, BSP_UART_Parity parity, u8 databits, BSP_UART_DataSize ds);

void bsp_uart2_config(u32 bps, BSP_UART_StopBits stopbits, BSP_UART_Parity parity, u8 databits, BSP_UART_DataSize ds);

void bsp_uart3_config(u32 bps, BSP_UART_StopBits stopbits, BSP_UART_Parity parity, u8 databits, BSP_UART_DataSize ds);

void bsp_uart4_config(u32 bps, BSP_UART_StopBits stopbits, BSP_UART_Parity parity, u8 databits, BSP_UART_DataSize ds);

void bsp_uart5_config(u32 bps, BSP_UART_StopBits stopbits, BSP_UART_Parity parity, u8 databits, BSP_UART_DataSize ds);


void bsp_uart1_send_u8(u8* buf, u16 size);

void bsp_uart1_send_u16(u16* buf, u16 size);

void bsp_uart2_send_u8(u8* buf, u16 size);

void bsp_uart2_send_u16(u16* buf, u16 size);

void bsp_uart3_send_u8(u8* buf, u16 size);

void bsp_uart3_send_u16(u16* buf, u16 size);

void bsp_uart4_send_u8(u8* buf, u16 size);

void bsp_uart4_send_u16(u16* buf, u16 size);

void bsp_uart5_send_u8(u8* buf, u16 size);

void bsp_uart5_send_u16(u16* buf, u16 size);


/****************************************************************************************/

void bsp_ISR_uart1_putRecvData(u8 data); /* macro_ISR_uart_putRecvData */

void bsp_ISR_uart1_putSendData(u8 data); /* macro_ISR_uart_putSendData */


u16  bsp_uart1_getRecvData(void);          /* macro_uart_getRecvData */

u16  bsp_uart1_getSendData(void);          /* macro_uart_getSendData */


u8 bsp_uart1_recvBufIsFull(void);            /* macro_uart_recvBufIsFull */

u8 bsp_uart1_sendBufIsFull(void);           /* macro_uart_sendBufIsFull */


u8 bsp_uart1_sendBufIsEmpty(void);       /* macro_uart_sendBufIsEmpty */ 


void bsp_uart1_cleanAllBuffer(void);        /* macro_uart_cleanAllBuffer */



u16 bsp_uart1_recvBufRemain(void);       /* macro_uart_recvBufRemain */

u16 bsp_uart1_sendbufRemain(void);      /* macro_uart_sendbufRemain */

/******************************************************************************************/

void bsp_ISR_uart2_putRecvData(u8 data); /* macro_ISR_uart_putRecvData */

void bsp_ISR_uart2_putSendData(u8 data); /* macro_ISR_uart_putSendData */


u16  bsp_uart2_getRecvData(void);          /* macro_uart_getRecvData */

u16  bsp_uart2_getSendData(void);          /* macro_uart_getSendData */


u8 bsp_uart2_recvBufIsFull(void);           /* macro_uart_recvBufIsFull */

u8 bsp_uart2_sendBufIsFull(void);          /* macro_uart_sendBufIsFull */


u8   bsp_uart2_sendBufIsEmpty(void);     /* macro_uart_sendBufIsEmpty */


void bsp_uart2_cleanAllBuffer(void);        /* macro_uart_cleanAllBuffer */


u16 bsp_uart2_recvBufRemain(void);       /* macro_uart_recvBufRemain */

u16 bsp_uart2_sendbufRemain(void);       /* macro_uart_sendbufRemain */

/******************************************************************************************/

void bsp_ISR_uart3_putRecvData(u8 data); /* macro_ISR_uart_putRecvData */

void bsp_ISR_uart3_putSendData(u8 data); /* macro_ISR_uart_putSendData */


u16  bsp_uart3_getRecvData(void);          /* macro_uart_getRecvData */

u16  bsp_uart3_getSendData(void);          /* macro_uart_getSendData */


u8 bsp_uart3_recvBufIsFull(void);            /* macro_uart_recvBufIsFull */

u8 bsp_uart3_sendBufIsFull(void);           /* macro_uart_sendBufIsFull */


u8   bsp_uart3_sendBufIsEmpty(void);      /* macro_uart_sendBufIsEmpty */


void bsp_uart3_cleanAllBuffer(void);         /* macro_uart_cleanAllBuffer */    


u16 bsp_uart3_recvBufRemain(void);        /* macro_uart_recvBufRemain */

u16 bsp_uart3_sendbufRemain(void);       /* macro_uart_sendbufRemain */

/******************************************************************************************/

void bsp_ISR_uart4_putRecvData(u8 data); /* macro_ISR_uart_putRecvData */

void bsp_ISR_uart4_putSendData(u8 data); /* macro_ISR_uart_putSendData */


u16  bsp_uart4_getRecvData(void);          /* macro_uart_getRecvData */

u16  bsp_uart4_getSendData(void);          /* macro_uart_getSendData */


u8 bsp_uart4_recvBufIsFull(void);            /* macro_uart_recvBufIsFull */

u8 bsp_uart4_sendBufIsFull(void);           /* macro_uart_sendBufIsFull */


u8   bsp_uart4_sendBufIsEmpty(void);     /* macro_uart_sendBufIsEmpty */ 


void bsp_uart4_cleanAllBuffer(void);        /* macro_uart_cleanAllBuffer */


u16 bsp_uart4_recvBufRemain(void);       /* macro_uart_recvBufRemain */

u16 bsp_uart4_sendbufRemain(void);       /* macro_uart_sendbufRemain */

/******************************************************************************************/

void bsp_ISR_uart5_putRecvData(u8 data); /* macro_ISR_uart_putRecvData */

void bsp_ISR_uart5_putSendData(u8 data); /* macro_ISR_uart_putSendData */


u16  bsp_uart5_getRecvData(void);          /* macro_uart_getRecvData */

u16  bsp_uart5_getSendData(void);          /* macro_uart_getSendData */


u8 bsp_uart5_recvBufIsFull(void);           /* macro_uart_recvBufIsFull */

u8 bsp_uart5_sendBufIsFull(void);           /* macro_uart_sendBufIsFull */


u8   bsp_uart5_sendBufIsEmpty(void);      /* macro_uart_sendBufIsEmpty */


void bsp_uart5_cleanAllBuffer(void);         /* macro_uart_cleanAllBuffer */


u16 bsp_uart5_recvBufRemain(void);        /* macro_uart_recvBufRemain */

u16 bsp_uart5_sendbufRemain(void);       /* macro_uart_sendbufRemain */


#endif


文件(usart.c):

/*

************************************************************************

**  brief : 串口驱动

**  note  : 接收和发送BUFFER,需要根据实际情况修改大小

************************************************************************

*/


#include "usart.h"


#define USART1_SEND_BUF_SIZE 280

#define USART1_RECV_BUF_SIZE 256*2

#define USART2_SEND_BUF_SIZE 256*1

#define USART2_RECV_BUF_SIZE 256*2

#define USART3_SEND_BUF_SIZE 256*1

#define USART3_RECV_BUF_SIZE 256*1

#define USART4_SEND_BUF_SIZE 256*1

#define USART4_RECV_BUF_SIZE 256*2

#define USART5_SEND_BUF_SIZE 256*1

#define USART5_RECV_BUF_SIZE 256*1


/*

****************************************************************

**  brief : 定义USART1-USART5的数据

**            USART1_SEND_BUF - USART5_SEND_BUF

**            USART1_RECV_BUF - USART5_RECV_BUF

**            uart1SendHead - uart5SendHead

**            uart1SendTail - uart5SendTail

**            uart1RecvHead - uart5RecvHead

**            uart5RecvTail - uart5RecvTail

****************************************************************

*/

#define UART_BUF_DEFINE(uartNo) \

    static u8 USART##uartNo##_SEND_BUF[USART##uartNo##_SEND_BUF_SIZE];\

    static vu16 uart##uartNo##SendHead=0;\

    static vu16 uart##uartNo##SendTail=0;\

    static vu8 UART##uartNo##_RECV_BUF[USART##uartNo##_RECV_BUF_SIZE];\

    static vu16 uart##uartNo##RecvHead=0;\

    static vu16 uart##uartNo##RecvTail=0;


UART_BUF_DEFINE(1);

UART_BUF_DEFINE(2);

UART_BUF_DEFINE(3);

UART_BUF_DEFINE(4);

UART_BUF_DEFINE(5);


/*

**************************************************************************************

**  brief      : 串口1配置初始化

**  bsp       : 波特率1200 2400 4800 9600 ... 115200,不能小于1200 

**  stopb    : 停止位

**  p          : 奇偶校验位

**  databits : 数据位7 or 8 or 9

**  ds         : DMA数据宽度

**************************************************************************************

*/

void bsp_uart1_config(u32 bps, BSP_UART_StopBits stopb, BSP_UART_Parity p, u8 databits, BSP_UART_DataSize ds) 

{

    u16 stopbits;

    u16 parity;


    if (stopb == BSP_UART_STOPBITS_1) stopbits = USART_StopBits_1;

    else if(stopb == BSP_UART_STOPBITS_2)stopbits = USART_StopBits_2;

    else stopbits = USART_StopBits_1;


    if(p == BSP_UART_PARITY_NO) parity = USART_Parity_No;

    else if(p == BSP_UART_PARITY_EVEN) parity = USART_Parity_Even;

    else if(p == BSP_UART_PARITY_ODD) parity = USART_Parity_Odd;

    else parity = USART_Parity_No;


    u32 dataSize = DMA_PeripheralDataSize_Byte;

    if(ds == DATA_SIZE_HALF_WORD) {

        dataSize = DMA_PeripheralDataSize_HalfWord;

    } else {

        dataSize = DMA_PeripheralDataSize_Byte;

    }


    do {

        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

    } while(0);


    do {

        USART_InitTypeDef USART_InitStructure;

        u16 USART_WordLength = USART_WordLength_8b;

        USART_DeInit(USART1);  /* 复位USART1 */


        bsp_uart1_cleanAllBuffer();


        /* 提示: STM32 将奇偶位也算作数据位*/

        if(parity!=USART_Parity_No && 7 != databits) 

        {

            USART_WordLength = USART_WordLength_9b;

        }


        if(9==databits) {

            USART_WordLength = USART_WordLength_9b;

        }


        USART_InitStructure.USART_BaudRate = bps;

        USART_InitStructure.USART_WordLength = USART_WordLength;

        USART_InitStructure.USART_StopBits = stopbits;

        USART_InitStructure.USART_Parity = parity;

        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

        USART_Init(USART1, &USART_InitStructure);


        /* 接收缓冲区非空中断使能*/

        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

        USART_ITConfig(USART1,USART_IT_TC,DISABLE);

        USART_ITConfig(USART1,USART_IT_TXE,DISABLE);


        USART_Cmd(USART1, ENABLE);

        /* 

            **  CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发

            **  送不出去如下语句解决第1个字节无法正确发送出去的问题  

            */

        USART_ClearFlag(USART1, USART_FLAG_TC); 

    } while(0);


    do {

        DMA_InitTypeDef DMA_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

        DMA_DeInit(DMA1_Channel4);  

        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);   /* 外设地址*/

        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_SEND_BUF;/* 存储器地址*/

        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;               /* 从存储器读*/

        if(DMA_PeripheralDataSize_HalfWord == dataSize) {                /* 传输数据量*/

            DMA_InitStructure.DMA_BufferSize = USART1_SEND_BUF_SIZE/2;

        } else {

            DMA_InitStructure.DMA_BufferSize = USART1_SEND_BUF_SIZE;

        }

        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /* 外设地址非增量模式*/

        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;          /* 存储器增量模式*/

        DMA_InitStructure.DMA_PeripheralDataSize = dataSize;             /* 外设数据宽度*/

        if(DMA_PeripheralDataSize_HalfWord == dataSize)                  /* 存储器数据宽度*/

        { 

            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;/* 16bit */

        } else 

        {

            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;    /* 8bit */ 

        }

        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;      /* 普通模式*/

        DMA_InitStructure.DMA_Priority = DMA_Priority_High;/* 高优先级*/

        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;       /* 非存储器到存储器模式*/

        DMA_Init(DMA1_Channel4, &DMA_InitStructure);       /* DMA 初始化*/

        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);    /* 使能发送完成中断*/


        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);     /* 使能发送时的DMA 模式*/

        DMA_Cmd(DMA1_Channel4, DISABLE);

    } while(0);


    do {    

        NVIC_InitTypeDef NVIC_InitStructure;


        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);


        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);

    } while(0);

}


/*

**************************************************************************************

**  brief      : 串口2配置初始化

**  bsp       : 波特率1200 2400 4800 9600 ... 115200,不能小于1200 

**  stopb    : 停止位

**  p          : 奇偶校验位

**  databits : 数据位7 or 8 or 9

**  ds         : DMA数据宽度

**************************************************************************************

*/


void bsp_uart2_config(u32 bps, BSP_UART_StopBits stopb, BSP_UART_Parity p, u8 databits, BSP_UART_DataSize ds) 

{

    u16 stopbits;

    u16 parity;

    if (stopb == BSP_UART_STOPBITS_1) stopbits = USART_StopBits_1;

    else if(stopb == BSP_UART_STOPBITS_2)stopbits = USART_StopBits_2;

    else stopbits = USART_StopBits_1;


    if(p == BSP_UART_PARITY_NO) parity = USART_Parity_No;

    else if(p == BSP_UART_PARITY_EVEN) parity = USART_Parity_Even;

    else if(p == BSP_UART_PARITY_ODD) parity = USART_Parity_Odd;

    else parity = USART_Parity_No;


    u32 dataSize = DMA_PeripheralDataSize_Byte;

    if(ds == DATA_SIZE_HALF_WORD) {

        dataSize = DMA_PeripheralDataSize_HalfWord;

    } else {

        dataSize = DMA_PeripheralDataSize_Byte;

    }


    do {

        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

    } while(0);


    do {

        USART_InitTypeDef USART_InitStructure;

        u16 USART_WordLength = USART_WordLength_8b;

        USART_DeInit(USART2);

        bsp_uart2_cleanAllBuffer();


        if(parity!=USART_Parity_No && 7 != databits) {

            USART_WordLength = USART_WordLength_9b;

        }

        if(9==databits) {

            USART_WordLength = USART_WordLength_9b;

        }


        USART_InitStructure.USART_BaudRate = bps;

        USART_InitStructure.USART_WordLength = USART_WordLength;

        USART_InitStructure.USART_StopBits = stopbits;

        USART_InitStructure.USART_Parity = parity;

        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

        USART_Init(USART2, &USART_InitStructure);


        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);

        USART_ITConfig(USART2,USART_IT_TC,DISABLE);

        USART_ITConfig(USART2,USART_IT_TXE,DISABLE);

        USART_Cmd(USART2, ENABLE);

        USART_ClearFlag(USART2, USART_FLAG_TC);

    } while(0);


    do {

        DMA_InitTypeDef DMA_InitStructure;


        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);


        DMA_DeInit(DMA1_Channel7);  

        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DR);

        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_SEND_BUF;

        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

        if(DMA_PeripheralDataSize_HalfWord == dataSize) {

            DMA_InitStructure.DMA_BufferSize = USART2_SEND_BUF_SIZE/2;

        } else {

            DMA_InitStructure.DMA_BufferSize = USART2_SEND_BUF_SIZE;

        }

        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

        DMA_InitStructure.DMA_PeripheralDataSize = dataSize;

        if(DMA_PeripheralDataSize_HalfWord == dataSize) {

            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

        } else {

            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

        }

        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

        DMA_InitStructure.DMA_Priority = DMA_Priority_High;

        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

        DMA_Init(DMA1_Channel7, &DMA_InitStructure);

        DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);


        USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);

        DMA_Cmd(DMA1_Channel7, DISABLE);


    } while(0);


    do {

        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);


        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);

    } while(0);

}


/*

**************************************************************************************

**  brief      : 串口3配置初始化

**  bsp       : 波特率1200 2400 4800 9600 ... 115200,不能小于1200 

**  stopb    : 停止位

**  p          : 奇偶校验位

**  databits : 数据位7 or 8 or 9

**  ds         : DMA数据宽度

**************************************************************************************

*/


void bsp_uart3_config(u32 bps, BSP_UART_StopBits stopb, BSP_UART_Parity p, u8 databits, BSP_UART_DataSize ds) 

{

    u16 stopbits;

    u16 parity;

    if (stopb == BSP_UART_STOPBITS_1) stopbits = USART_StopBits_1;

    else if(stopb == BSP_UART_STOPBITS_2)stopbits = USART_StopBits_2;

    else stopbits = USART_StopBits_1;


    if(p == BSP_UART_PARITY_NO) parity = USART_Parity_No;

    else if(p == BSP_UART_PARITY_EVEN) parity = USART_Parity_Even;

    else if(p == BSP_UART_PARITY_ODD) parity = USART_Parity_Odd;

    else parity = USART_Parity_No;


    u32 dataSize = DMA_PeripheralDataSize_Byte;

    if(ds == DATA_SIZE_HALF_WORD) {

        dataSize = DMA_PeripheralDataSize_HalfWord;

    } else {

        dataSize = DMA_PeripheralDataSize_Byte;

    }


    do {

        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOB, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(GPIOB, &GPIO_InitStructure);

    } while(0);


    do {

        USART_InitTypeDef USART_InitStructure;

        u16 USART_WordLength = USART_WordLength_8b;

        USART_DeInit(USART3);

        bsp_uart3_cleanAllBuffer();        


        if(parity!=USART_Parity_No && 7 != databits) {

            USART_WordLength = USART_WordLength_9b;

        }


        if(9==databits) {

            USART_WordLength = USART_WordLength_9b;

        }


        USART_InitStructure.USART_BaudRate = bps;

        USART_InitStructure.USART_WordLength = USART_WordLength;

        USART_InitStructure.USART_StopBits = stopbits;

        USART_InitStructure.USART_Parity = parity;

        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        USART_InitStructure.USART_Mode = USART_Mode_Rx |USART_Mode_Tx;

        USART_Init(USART3, &USART_InitStructure);


        USART_ITConfig(USART3,USART_IT_RXNE, ENABLE);

        USART_ITConfig(USART3,USART_IT_TC,DISABLE);

        USART_ITConfig(USART3,USART_IT_TXE,DISABLE);

        USART_Cmd(USART3, ENABLE);

        USART_ClearFlag(USART3, USART_FLAG_TC);

    } while(0);


    do {

        DMA_InitTypeDef DMA_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

        DMA_DeInit(DMA1_Channel2);  

        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART3->DR);

        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART3_SEND_BUF;

        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

        if(DMA_PeripheralDataSize_HalfWord == dataSize) {

            DMA_InitStructure.DMA_BufferSize = USART3_SEND_BUF_SIZE/2;

        } else {

            DMA_InitStructure.DMA_BufferSize = USART3_SEND_BUF_SIZE;

        }

        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;


        DMA_InitStructure.DMA_PeripheralDataSize = dataSize;

        if(DMA_PeripheralDataSize_HalfWord == dataSize) {

            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

        } else {

            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

        }

        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

        DMA_InitStructure.DMA_Priority = DMA_Priority_High;

        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

        DMA_Init(DMA1_Channel2, &DMA_InitStructure);

        DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);


        USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE);

        DMA_Cmd(DMA1_Channel2, DISABLE);


    } while(0);


    do {

        NVIC_InitTypeDef NVIC_InitStructure;


        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);


        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);

    } while(0);

}


/*

**************************************************************************************

**  brief      : 串口4配置初始化

**  bsp       : 波特率1200 2400 4800 9600 ... 115200,不能小于1200 

**  stopb    : 停止位

**  p          : 奇偶校验位

**  databits : 数据位7 or 8 or 9

**  ds         : DMA数据宽度

**************************************************************************************

*/


void bsp_uart4_config(u32 bps, BSP_UART_StopBits stopb, BSP_UART_Parity p, u8 databits, BSP_UART_DataSize ds) 

{

    u16 stopbits;

    u16 parity;

    if (stopb == BSP_UART_STOPBITS_1) stopbits = USART_StopBits_1;

    else if(stopb == BSP_UART_STOPBITS_2)stopbits = USART_StopBits_2;

    else stopbits = USART_StopBits_1;


    if(p == BSP_UART_PARITY_NO) parity = USART_Parity_No;

    else if(p == BSP_UART_PARITY_EVEN) parity = USART_Parity_Even;

    else if(p == BSP_UART_PARITY_ODD) parity = USART_Parity_Odd;

    else parity = USART_Parity_No;


    u32 dataSize = DMA_PeripheralDataSize_Byte;

    if(ds == DATA_SIZE_HALF_WORD) {

        dataSize = DMA_PeripheralDataSize_HalfWord;

    } else {

        dataSize = DMA_PeripheralDataSize_Byte;

    }


    do {

        GPIO_InitTypeDef GPIO_InitStructure;


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);    

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOC, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(GPIOC, &GPIO_InitStructure);

    } while(0);


    do {

        USART_InitTypeDef USART_InitStructure;

        u16 USART_WordLength = USART_WordLength_8b;

        USART_DeInit(UART4);

        bsp_uart4_cleanAllBuffer();

        if(parity!=USART_Parity_No && 7 != databits) {

            USART_WordLength = USART_WordLength_9b;

        }


        if(9==databits) {

            USART_WordLength = USART_WordLength_9b;

        }


        USART_InitStructure.USART_BaudRate = bps;

        USART_InitStructure.USART_WordLength = USART_WordLength;

        USART_InitStructure.USART_StopBits = stopbits;

        USART_InitStructure.USART_Parity = parity;

        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

        USART_Init(UART4, &USART_InitStructure);


        USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);

        USART_ITConfig(UART4,USART_IT_TC,DISABLE);

        USART_ITConfig(UART4,USART_IT_TXE,DISABLE);

        USART_Cmd(UART4, ENABLE);

        USART_ClearFlag(UART4, USART_FLAG_TC); 

    } while(0);


    do {

        DMA_InitTypeDef DMA_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

        DMA_DeInit(DMA2_Channel5);  

        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&UART4->DR);

        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART4_SEND_BUF;

        if(DMA_PeripheralDataSize_HalfWord == dataSize) {

            DMA_InitStructure.DMA_BufferSize = USART4_SEND_BUF_SIZE/2;

        } else {

            DMA_InitStructure.DMA_BufferSize = USART4_SEND_BUF_SIZE;

        }

        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

        DMA_InitStructure.DMA_PeripheralDataSize = dataSize;

        if(DMA_PeripheralDataSize_HalfWord == dataSize) {

            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

        } else {

            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

        }

        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

        DMA_InitStructure.DMA_Priority = DMA_Priority_High;

        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

        DMA_Init(DMA2_Channel5, &DMA_InitStructure);

        DMA_ITConfig(DMA2_Channel5, DMA_IT_TC, ENABLE);

        USART_DMACmd(UART4, USART_DMAReq_Tx, ENABLE);

        DMA_Cmd(DMA2_Channel5, DISABLE);

    } while(0);


    do {

        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);


        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel4_5_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);

    } while(0);

}


/*

**************************************************************************************

**  brief      : 串口5配置初始化

**  bsp       : 波特率1200 2400 4800 9600 ... 115200,不能小于1200 

**  stopb    : 停止位

**  p          : 奇偶校验位

**  databits : 数据位7 or 8 or 9

**  ds         : DMA数据宽度

**  note      : USART5没有使用DMA,故ds参数无意义

**************************************************************************************

*/


void bsp_uart5_config(u32 bps, BSP_UART_StopBits stopb, BSP_UART_Parity p, u8 databits, BSP_UART_DataSize ds) 

{

    u16 stopbits;

    u16 parity;

    if (stopb == BSP_UART_STOPBITS_1) stopbits = USART_StopBits_1;

    else if(stopb == BSP_UART_STOPBITS_2)stopbits = USART_StopBits_2;

    else stopbits = USART_StopBits_1;


    if(p == BSP_UART_PARITY_NO) parity = USART_Parity_No;

    else if(p == BSP_UART_PARITY_EVEN) parity = USART_Parity_Even;

    else if(p == BSP_UART_PARITY_ODD) parity = USART_Parity_Odd;

    else parity = USART_Parity_No;


    do {

        GPIO_InitTypeDef GPIO_InitStructure;


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOC, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOD, &GPIO_InitStructure);

    } while(0);


    do {

        USART_InitTypeDef USART_InitStructure;

        u16 USART_WordLength = USART_WordLength_8b;

        USART_DeInit(UART5);

        bsp_uart5_cleanAllBuffer();        


        if(parity!=USART_Parity_No && 7 != databits) {

            USART_WordLength = USART_WordLength_9b;

        }


        if(9==databits) {

            USART_WordLength = USART_WordLength_9b;

        }


        USART_InitStructure.USART_BaudRate = bps;

        USART_InitStructure.USART_WordLength = USART_WordLength;

        USART_InitStructure.USART_StopBits = stopbits;

        USART_InitStructure.USART_Parity = parity;

        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;

        USART_Init(UART5, &USART_InitStructure);

        /* 使能发送完成中断*/

        USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);

        USART_ITConfig(UART5,USART_IT_TC, ENABLE);

        USART_ITConfig(UART5,USART_IT_TXE, DISABLE);

        USART_Cmd(UART5, ENABLE);


        USART_ClearFlag(UART5, USART_FLAG_TC); 

    } while(0);


    do {

        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);


    } while(0);

}


static vu32 uart1_transfer_complete = 0; /* USART1发送完成*/

vu32 uart2_transfer_complete = 0;        /* USART2发送完成*/

static vu32 uart3_transfer_complete = 0; /* USART3发送完成*/

static vu32 uart4_transfer_complete = 0; /* USART4发送完成*/

static vu32 uart5_transfer_complete = 0; /* USART5发送完成*/


/*

******************************************************************************

**  Ret :  1  = 传输完成

**           other = 启动传输的时刻

**  note : systemTickMs() - Ret(other) = 传输时间

******************************************************************************

*/

u32 bsp_uart1_transferComplete(void)

{

    return uart1_transfer_complete;

}

u32 bsp_uart2_transferComplete(void)

{

    return uart2_transfer_complete;

}

u32 bsp_uart3_transferComplete(void)

{

    return uart3_transfer_complete;

}

u32 bsp_uart4_transferComplete(void)

{

    return uart4_transfer_complete;

}

u32 bsp_uart5_transferComplete(void)

{

    return uart5_transfer_complete;

}

/*

***************************************************************

**  brief : usart1 发送数据

**  buf   : 待发送数据缓冲指针

**  size  : 待发送数据长度

***************************************************************

*/

void bsp_uart1_send_u8(u8* buf, u16 size) 

{

    if(size > USART1_SEND_BUF_SIZE) 

    {

        return;

    }

    memcpy(USART1_SEND_BUF, buf, size);


    DMA_Cmd(DMA1_Channel4, DISABLE);/* 关闭DMA传输*/

    DMA1_Channel4->CNDTR=size;      /* 改变数据传输量*/

    DMA_Cmd(DMA1_Channel4, ENABLE); /* 开启DMA传输*/

    uart1_transfer_complete = systemMs();

}

/*

***************************************************************

**  brief : usart1 发送数据

**  buf   : 待发送数据缓冲指针

**  size  : 待发送数据长度

***************************************************************

*/

void bsp_uart1_send_u16(u16* buf, u16 size) 

{

    if(size*2 > USART1_SEND_BUF_SIZE) 

    {

        return;

    }


    memcpy(USART1_SEND_BUF, buf, size*2);


    DMA_Cmd(DMA1_Channel4, DISABLE); 

    DMA1_Channel4->CNDTR=size; 

    DMA_Cmd(DMA1_Channel4, ENABLE);

    uart1_transfer_complete = systemMs();

}

/*

***************************************************************

**  brief : usart2 发送数据

**  buf   : 待发送数据缓冲指针

**  size  : 待发送数据长度

***************************************************************

*/


void bsp_uart2_send_u8(u8* buf, u16 size) {

    if(size > USART2_SEND_BUF_SIZE) {

        return;

    }

    memcpy(USART2_SEND_BUF, buf, size);


    DMA_Cmd(DMA1_Channel7, DISABLE); 

    DMA1_Channel7->CNDTR=size; 


    DMA_Cmd(DMA1_Channel7, ENABLE);

    uart2_transfer_complete = systemMs();

}

/*

***************************************************************

**  brief : usart2 发送数据

**  buf   : 待发送数据缓冲指针

**  size  : 待发送数据长度

***************************************************************

*/


void bsp_uart2_send_u16(u16* buf, u16 size) 

{

    if(size*2 > USART2_SEND_BUF_SIZE) 

    {

        return;

    }


    memcpy(USART2_SEND_BUF, buf, size*2);


    DMA_Cmd(DMA1_Channel7, DISABLE);

    DMA1_Channel7->CNDTR=size;


    DMA_Cmd(DMA1_Channel7, ENABLE);

    uart2_transfer_complete = systemMs();

}

/*

***************************************************************

**  brief : usart3 发送数据

**  buf   : 待发送数据缓冲指针

**  size  : 待发送数据长度

***************************************************************

*/


void bsp_uart3_send_u8(u8* buf, u16 size) 

{

    memcpy(USART3_SEND_BUF, buf, size);


    DMA_Cmd(DMA1_Channel2, DISABLE);

    DMA1_Channel2->CNDTR=size; 


    DMA_Cmd(DMA1_Channel2, ENABLE);

    uart3_transfer_complete = systemMs();

}

/*

***************************************************************

**  brief : usart3 发送数据

**  buf   : 待发送数据缓冲指针

**  size  : 待发送数据长度

***************************************************************

*/


void bsp_uart3_send_u16(u16* buf, u16 size) 

{

    if(size*2 > USART3_SEND_BUF_SIZE) 

    {

        return;

    }

    memcpy(USART3_SEND_BUF, buf, size*2);


    DMA_Cmd(DMA1_Channel2, DISABLE); 

    DMA1_Channel2->CNDTR=size; 


    DMA_Cmd(DMA1_Channel2, ENABLE);

    uart3_transfer_complete = systemMs();

}

/*

***************************************************************

**  brief : usart4发送数据

**  buf   : 待发送数据缓冲指针

**  size  : 待发送数据长度

***************************************************************

*/


void bsp_uart4_send_u8(u8* buf, u16 size) 

{

    memcpy(USART4_SEND_BUF, buf, size);


    DMA_Cmd(DMA2_Channel5, DISABLE); 

    DMA2_Channel5->CNDTR=size; 


    DMA_Cmd(DMA2_Channel5, ENABLE);

    uart4_transfer_complete = systemMs();

}

/*

***************************************************************

**  brief : usart4 发送数据

**  buf   : 待发送数据缓冲指针

**  size  : 待发送数据长度

***************************************************************

*/

void bsp_uart4_send_u16(u16* buf, u16 size) 

{

    if(size*2 > USART4_SEND_BUF_SIZE) 

    {

        return;

    }

    memcpy(USART4_SEND_BUF, buf, size*2);


    DMA_Cmd(DMA2_Channel5, DISABLE); 

    DMA2_Channel5->CNDTR=size;


    DMA_Cmd(DMA2_Channel5, ENABLE);

    uart4_transfer_complete = systemMs();

}


static vu16 usart5_send_size = 0;

static vu16 usart5_send_index = 0;

void bsp_uart5_send_u8(u8* buf, u16 size)

{

    if(size > USART5_SEND_BUF_SIZE) {

        return;

    }


    memcpy(USART5_SEND_BUF, buf, size);

    /* 已是能发送完成终端*/

    usart5_send_size = size;

    usart5_send_index = 0;

    USART_SendData(UART5, (u16)USART5_SEND_BUF[usart5_send_index]);

    ++usart5_send_index;

    uart5_transfer_complete = systemMs();

}


static usart_hook_func_t _g_uart1_recv_hook = NULL;

static usart_hook_func_t _g_uart2_recv_hook = NULL;

static usart_hook_func_t _g_uart3_recv_hook = NULL;

static usart_hook_func_t _g_uart4_recv_hook = NULL;

static usart_hook_func_t _g_uart5_recv_hook = NULL;


/* 串口接收中断钩子函数*/

void bsp_ISR_uart1_setRecvHook(usart_hook_func_t func) {

    _g_uart1_recv_hook = func;

}

void bsp_ISR_uart2_setRecvHook(usart_hook_func_t func) 

{

    _g_uart2_recv_hook = func;

}

void bsp_ISR_uart3_setRecvHook(usart_hook_func_t func) {

    _g_uart3_recv_hook = func;

}

void bsp_ISR_uart4_setRecvHook(usart_hook_func_t func) {

    _g_uart4_recv_hook = func;

}

void bsp_ISR_uart5_setRecvHook(usart_hook_func_t func) {

    _g_uart5_recv_hook = func;

}

/*

****************************************************************

**  breif : usart1 中断服务函数

**  note : 接收缓冲区非空中断使能

****************************************************************

*/

void USART1_IRQHandler(void)

{

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 

    {/* 读数据寄存器非空*/

        u16 recv = USART_ReceiveData(USART1);

        USART_ClearITPendingBit(USART1,USART_IT_RXNE);

        bsp_ISR_uart1_putRecvData(recv&0xff);


        if( NULL != _g_uart1_recv_hook) 

        {

            (*_g_uart1_recv_hook)(recv);

        }

    }


    if(USART_GetITStatus(USART1, USART_IT_TXE) == SET)

    {/* 发送数据寄存器空*/

        USART_ClearITPendingBit(USART1, USART_IT_TXE);

    }


    /* 提示: USART_IT_TC 需要在 USART_IT_ORE 之前处理*/

    if(USART_GetITStatus(USART1, USART_IT_TC)==SET) 

    {/* 发送完成*/

        USART_ClearITPendingBit(USART1, USART_IT_TC);

    }


    /*

      ** 因 某些原因没处理过来,引起了串口的数据还没被读出的

      ** 时候就又收到了新的数据CPU就会出现不停进入中断的问

      ** 题.必须读 SR,再读DR,以解决溢出错误

      ** 注意:不能使用USART_GetITStatus()来读取USART_IT_ORE

      */

    if(USART_GetFlagStatus(USART1, USART_IT_ORE) == SET) 

    {/* 过载错误*/

        USART_ClearFlag(USART1, USART_IT_ORE);  //读 SR

        USART_ReceiveData(USART1);   //读 DR

    }

}

/*

****************************************************************

**  breif : usart2 中断服务函数

**  note : 接收缓冲区非空中断使能

****************************************************************

*/


void USART2_IRQHandler(void)

{

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) 

    {

        u16 recv = USART_ReceiveData(USART2);

        USART_ClearITPendingBit(USART2, USART_IT_RXNE);

        bsp_ISR_uart2_putRecvData(recv&0xff);


        if( NULL != _g_uart2_recv_hook ) 

        {

            (*_g_uart2_recv_hook)(recv);

        }

    }


    if(USART_GetITStatus(USART2, USART_IT_TXE) == SET)

    {

        USART_ClearITPendingBit(USART2, USART_IT_TXE);

    }


    if(USART_GetITStatus(USART2, USART_IT_TC)==SET) {

        USART_ClearITPendingBit(USART2, USART_IT_TC);

    }


    if(USART_GetFlagStatus(USART2, USART_IT_ORE) == SET) {

        USART_ClearFlag(USART2, USART_IT_ORE);  

        USART_ReceiveData(USART2);   

    }

}

/*

****************************************************************

**  breif : usart3 中断服务函数

**  note : 接收缓冲区非空中断使能

****************************************************************

*/


void USART3_IRQHandler(void)

{

    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {

        u16 recv = USART_ReceiveData(USART3);

        USART_ClearITPendingBit(USART3, USART_IT_RXNE);

        bsp_ISR_uart3_putRecvData(recv&0xff);


        if( NULL != _g_uart3_recv_hook) {

            (*_g_uart3_recv_hook)(recv);

        }

    }


    if(USART_GetITStatus(USART3, USART_IT_TXE) == SET){

        USART_ClearITPendingBit(USART3, USART_IT_TXE);

    }


    if(USART_GetITStatus(USART3, USART_IT_TC)==SET) {

        USART_ClearITPendingBit(USART3, USART_IT_TC);

    }


    if(USART_GetFlagStatus(USART3, USART_IT_ORE) == SET) {

        USART_ClearFlag(USART3, USART_IT_ORE);  

        USART_ReceiveData(USART3);  

    }

}

/*

****************************************************************

**  breif : usart4 中断服务函数

**  note : 接收缓冲区非空中断使能

****************************************************************

*/


void UART4_IRQHandler(void)

{

    if( USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) 

    {

        u16 recv = USART_ReceiveData(UART4);

        USART_ClearITPendingBit(UART4, USART_IT_RXNE);

        bsp_ISR_uart4_putRecvData(recv&0xff);


        if( NULL != _g_uart4_recv_hook) 

        {

            (*_g_uart4_recv_hook)(recv);

        }

    }


    if(USART_GetITStatus(UART4, USART_IT_TXE) == SET)

    {

        USART_ClearITPendingBit(UART4, USART_IT_TXE);

    }


    if(USART_GetITStatus(UART4, USART_IT_TC)==SET) 

    {

        USART_ClearITPendingBit(UART4, USART_IT_TC);

    }


    if(USART_GetFlagStatus(UART4, USART_IT_ORE) == SET) 

    {

        USART_ClearFlag(UART4, USART_IT_ORE); 

        USART_ReceiveData(UART4);

    }

}

/*

****************************************************************

**  breif : usart1 中断服务函数

**  note : 接收缓冲区非空中断使能

**            发送完成中断使能

****************************************************************

*/


void UART5_IRQHandler(void)

{

    if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) 

    {

        u16 recv = USART_ReceiveData(UART5);

        USART_ClearITPendingBit(UART5, USART_IT_RXNE);

        bsp_ISR_uart5_putRecvData(recv&0xff);


        if( NULL != _g_uart5_recv_hook) 

        {

            (*_g_uart5_recv_hook)(recv);

        }

    }


    if(USART_GetITStatus(UART5, USART_IT_TXE) == SET){

        USART_ClearITPendingBit(UART5, USART_IT_TXE);

    }


    if(USART_GetITStatus(UART5, USART_IT_TC)==SET) {

        USART_ClearITPendingBit(UART5, USART_IT_TC);


        if(usart5_send_index < usart5_send_size) {

            USART_SendData(UART5, (u16)USART5_SEND_BUF[usart5_send_index]);

            ++usart5_send_index;

        } else {

            uart5_transfer_complete = 0;

        }

    }


    if(USART_GetFlagStatus(UART5, USART_IT_ORE) == SET) {

        USART_ClearFlag(UART5, USART_IT_ORE);  

        USART_ReceiveData(UART5);   

    }

}


/* 

*******************************************************************

**  breif : DMA1 Channel4 发送完成中断

**  note : usart1

*******************************************************************

*/

void DMA1_Channel4_IRQHandler(void) 

{

    if(DMA_GetITStatus(DMA1_IT_TC4)) {

        DMA_ClearITPendingBit(DMA1_IT_TC4);

    }

    DMA_Cmd(DMA1_Channel4,DISABLE); 

    uart1_transfer_complete = 1;

}


/* 

*******************************************************************

**  breif : DMA1 Channel2 发送完成中断

**  note : usart3

*******************************************************************

*/


void DMA1_Channel2_IRQHandler(void)

{

    if(DMA_GetITStatus(DMA1_IT_TC2)) {

        DMA_ClearITPendingBit(DMA1_IT_TC2);

    }

    DMA_Cmd(DMA1_Channel2,DISABLE);

    uart3_transfer_complete = 1;

}


/* 

*******************************************************************

**  breif : DMA1 Channel7 发送完成中断

**  note : usart2

*******************************************************************

*/

void DMA1_Channel7_IRQHandler(void)

{

    if(DMA_GetITStatus(DMA1_IT_TC7)) {

        DMA_ClearITPendingBit(DMA1_IT_TC7);

    }

    DMA_Cmd(DMA1_Channel7,DISABLE);

    uart2_transfer_complete = 1;

}


/* 

*******************************************************************

**  breif : DMA2 Channel5 发送完成中断

**  note : usart4 ,程序有Bug

*******************************************************************

*/


void DMA2_Channel4_5_IRQHandler(void)

{

    if(DMA_GetITStatus(DMA2_IT_TC4)) {

        DMA_ClearITPendingBit(DMA2_IT_TC4);

        DMA_Cmd(DMA2_Channel4,DISABLE);

        uart4_transfer_complete = 1;

    }


    if(DMA_GetITStatus(DMA2_IT_TC5)) {

        DMA_ClearITPendingBit(DMA2_IT_TC5);

        DMA_Cmd(DMA2_Channel5,DISABLE);

    }

}


/*

**********************************************************

**  breif : 将数据载入接收缓冲区

**  note : 数据载入Head方向

**********************************************************

*/

#define macro_ISR_uart_putRecvData(uartNo) \

void bsp_ISR_uart##uartNo##_putRecvData(u8 data) {\

    bsp_disableIrq();\

    u16 rxd_head;\

    rxd_head = uart##uartNo##RecvHead + 1 ; \

    if( rxd_head >= USART##uartNo##_RECV_BUF_SIZE ) \

        rxd_head = 0;\

    UART##uartNo##_RECV_BUF[uart##uartNo##RecvHead] = data;\

    uart##uartNo##RecvHead = rxd_head;\

    bsp_enableIrq();\

}


/*

****************************************************************************

**  breif : 将数据放置在发送缓冲区

**  note : 数据载入Head方向 

**           这个方法平时并不使用,只在特殊应用下用到

****************************************************************************

*/

#define macro_ISR_uart_putSendData(uartNo) \

void bsp_ISR_uart##uartNo##_putSendData(u8 data) {\

    bsp_disableIrq();\

    u16 rxd_head;\

    rxd_head = uart##uartNo##SendHead + 1 ;\

    if( rxd_head >= USART##uartNo##_SEND_BUF_SIZE ) \

        rxd_head = 0;\

    USART##uartNo##_SEND_BUF[uart##uartNo##SendHead] = data;\

    uart##uartNo##SendHead = rxd_head;\

    bsp_enableIrq();\

}

/*

****************************************************************************

**  breif : 读接收缓冲区中的数据

**  Ret   : 1. EMPTY 数据缓冲区为空

**            2. 数据

**  note : 从Tail方向读取

****************************************************************************

*/

#define macro_uart_getRecvData(uartNo) \

u16 bsp_uart##uartNo##_getRecvData(void)\

{\

    bsp_disableIrq();\

    if(uart##uartNo##RecvHead==uart##uartNo##RecvTail) {\

        bsp_enableIrq();\

        return EMPTY;\

    }\

    u16 ch=UART##uartNo##_RECV_BUF[uart##uartNo##RecvTail];\

    UART##uartNo##_RECV_BUF[uart##uartNo##RecvTail] = 0;\

    uart##uartNo##RecvTail++;\

    if(uart##uartNo##RecvTail>=USART##uartNo##_RECV_BUF_SIZE)\

        uart##uartNo##RecvTail = 0;\

    bsp_enableIrq();\

    return ch;\

}

/*

****************************************************************************

**  breif : 读发送缓冲区中的数据

**  Ret   : 1. EMPTY 数据缓冲区为空

**            2. 数据

**  note : 从Tail方向读取

****************************************************************************

*/

#define macro_uart_getSendData(uartNo) \

u16 bsp_uart##uartNo##_getSendData(void)\

{\

    bsp_disableIrq();\

    if(uart##uartNo##SendHead==uart##uartNo##SendTail) {\

        bsp_enableIrq();\

        return EMPTY;\

    }\

    u16 ch=USART##uartNo##_SEND_BUF[uart##uartNo##SendTail];\

    USART##uartNo##_SEND_BUF[uart##uartNo##SendTail] = 0;\

    uart##uartNo##SendTail++;\

    if(uart##uartNo##SendTail>=USART##uartNo##_SEND_BUF_SIZE)\

        uart##uartNo##SendTail = 0;\

    bsp_enableIrq();\

    return ch;\

}

/*

****************************************************************************

**  breif : 接收缓冲区是否满

**  Ret   : 1. 满

**            0. 未满

****************************************************************************

*/

#define macro_uart_recvBufIsFull(uartNo) \

u8 bsp_uart##uartNo##_recvBufIsFull(void) \

{\

    bsp_disableIrq();\

    u16 head = uart##uartNo##RecvHead+1;\

    if(head >= USART##uartNo##_RECV_BUF_SIZE) {\

        head = 0;\

    }\

    if(head == uart##uartNo##RecvTail) {\

        bsp_enableIrq();\

        return 1;\

    } else {\

        bsp_enableIrq();\

        return 0;\

    }\

}


/*

****************************************************************************

**  breif : 发送缓冲区是否满

**  Ret   : 1. 满

**            0. 未满

****************************************************************************

*/

#define macro_uart_sendBufIsFull(uartNo) \

u8 bsp_uart##uartNo##_sendBufIsFull(void)\

{\

    bsp_disableIrq();\

    u16 head = uart##uartNo##SendHead+1;\

    if(head >= USART##uartNo##_SEND_BUF_SIZE) {\

        head = 0;\

    }\

    if(head == uart##uartNo##SendTail) {\

        bsp_enableIrq();\

        return 1;\

    } else {\

        bsp_enableIrq();\

        return 0;\

    }\

}


/*

****************************************************************************

**  breif : 接收缓冲区是否空

**  Ret   : 1. 空

**            0. 非空

****************************************************************************

*/

#define macro_uart_sendBufIsEmpty(uartNo) \

u8 bsp_uart##uartNo##_sendBufIsEmpty(void)\

{\

    bsp_disableIrq();\

    if(uart##uartNo##SendHead==uart##uartNo##SendTail){ \

        bsp_enableIrq();\

        return 1;\

    }\

    else {\

        bsp_enableIrq();\

        return 0;\

    }\

}

/*

****************************************************************************

**  breif : 清空接收和发送缓冲区

****************************************************************************

*/


#define macro_uart_cleanAllBuffer(uartNo) \

void bsp_uart##uartNo##_cleanAllBuffer(void) \

{\

    bsp_disableIrq();\

    uart##uartNo##RecvHead = uart##uartNo##RecvTail;\

    uart##uartNo##SendHead = uart##uartNo##SendTail;\

    bsp_enableIrq();\

}

/*

****************************************************************************

**  breif : 计算接收缓冲区剩余空间

**  Ret   : 剩余字节数

****************************************************************************

*/


#define macro_uart_recvBufRemain(uartNo) \

u16 bsp_uart##uartNo##_recvBufRemain(void)\

{\

    bsp_disableIrq();\

    if(uart##uartNo##RecvHead >= uart##uartNo##RecvTail) {\

        u16 v = (USART##uartNo##_RECV_BUF_SIZE-uart##uartNo##RecvHead)+uart##uartNo##RecvTail;\

        bsp_enableIrq();\

        return v;\

    } else {\

        u16 v = (uart##uartNo##RecvTail - uart##uartNo##RecvHead) - 1;\

        bsp_enableIrq();\

        return v;\

    }\

}


/*

****************************************************************************

**  breif : 发送缓冲区剩余空间

**  Ret   : 剩余字节数

****************************************************************************

*/


#define macro_uart_sendbufRemain(uartNo) \

u16 bsp_uart##uartNo##_sendbufRemain(void)\

{\

    bsp_disableIrq();\

    if(uart##uartNo##SendHead >= uart##uartNo##SendTail) {\

        u16 v = (USART##uartNo##_SEND_BUF_SIZE-uart##uartNo##SendHead)+uart##uartNo##SendTail;\

        bsp_enableIrq();\

        return v;\

    } else {\

        u16 v = (uart##uartNo##SendTail - uart##uartNo##SendHead) - 1;\

        bsp_enableIrq();\

        return v;\

    }\

}


macro_ISR_uart_putRecvData(1);

macro_ISR_uart_putRecvData(2);

macro_ISR_uart_putRecvData(3);

macro_ISR_uart_putRecvData(4);

macro_ISR_uart_putRecvData(5);

macro_ISR_uart_putSendData(1);

macro_ISR_uart_putSendData(2);

macro_ISR_uart_putSendData(3);

macro_ISR_uart_putSendData(4);

macro_ISR_uart_putSendData(5);

macro_uart_getRecvData(1);

macro_uart_getRecvData(2);

macro_uart_getRecvData(3);

macro_uart_getRecvData(4);

macro_uart_getRecvData(5);

macro_uart_getSendData(1);

macro_uart_getSendData(2);

macro_uart_getSendData(3);

macro_uart_getSendData(4);

macro_uart_getSendData(5);

macro_uart_sendBufIsEmpty(1);

macro_uart_sendBufIsEmpty(2);

macro_uart_sendBufIsEmpty(3);

macro_uart_sendBufIsEmpty(4);

macro_uart_sendBufIsEmpty(5);

macro_uart_cleanAllBuffer(1);

macro_uart_cleanAllBuffer(2);

macro_uart_cleanAllBuffer(3);

macro_uart_cleanAllBuffer(4);

macro_uart_cleanAllBuffer(5);


macro_uart_recvBufIsFull(1);

macro_uart_recvBufIsFull(2);

macro_uart_recvBufIsFull(3);

macro_uart_recvBufIsFull(4);

macro_uart_recvBufIsFull(5);

macro_uart_sendBufIsFull(1);

macro_uart_sendBufIsFull(2);

macro_uart_sendBufIsFull(3);

macro_uart_sendBufIsFull(4);

macro_uart_sendBufIsFull(5);


macro_uart_recvBufRemain(1);

macro_uart_recvBufRemain(2);

macro_uart_recvBufRemain(3);

macro_uart_recvBufRemain(4);

macro_uart_recvBufRemain(5);


macro_uart_sendbufRemain(1);

macro_uart_sendbufRemain(2);

macro_uart_sendbufRemain(3);

macro_uart_sendbufRemain(4);

macro_uart_sendbufRemain(5);


推荐阅读

史海拾趣

Comair Rotron公司的发展小趣事

1987年,为了更好地适应市场变化和拓展国际业务,Comair决定进行品牌重塑,将公司名称更改为“Comair Rotron”。同时,公司还在墨西哥建立了新的制造工厂,并在圣地亚哥设立了销售和工程中心,以支持其在北美地区的业务发展。这一举措不仅提升了Comair Rotron的品牌形象,也为其在全球范围内的市场拓展奠定了坚实基础。

EM Microelectronic-Marin SA公司的发展小趣事

进入1980年代,随着技术的不断进步,ASIC(应用特定集成电路)技术开始兴起。1982年,Mikron Integrated Microelectronics(EM Microelectronic-Marin的前身之一)开始了ASIC技术的研究,并在随后的几年中取得了显著成果。1987年,其奥地利分公司开始专注于识别和智能卡芯片的开发,这一领域的成功为公司带来了新的增长点。

Alpha Wire公司的发展小趣事

1995年,Philips Semiconductors收购了Mikron Graz,这一事件标志着EM Microelectronic-Marin与Philips在半导体领域的深度合作。此后,两家公司共同推动了RFID(射频识别)技术的发展,使其逐渐成为电子行业中不可或缺的一部分。EM Microelectronic-Marin凭借其在低功耗技术方面的优势,为RFID技术提供了强有力的支持。

Cal-Chip Electronics公司的发展小趣事

在XXXX年,Cal-Chip Electronics公司迎来了一次技术创新的重大突破。公司研发团队成功开发出了一款具有高效能、低功耗特点的新型芯片,这款芯片在行业内引起了广泛关注。凭借这一技术创新,公司迅速扩大了市场份额,并与多家知名企业建立了长期合作关系。这一突破不仅提升了公司的技术水平,也为公司的长远发展奠定了坚实基础。

爱普特半导体(APTSEMI)公司的发展小趣事

在全球供应链受到冲击、芯片告急的背景下,爱普特半导体始终坚持纯国产化发展理念。公司从管理层到核心研发人员,都具有深厚的半导体从业经验,无需借助任何海外团队支持,就能实现技术攻关和市场把控。这种全国产化的优势使得爱普特在面对外部风险时能够保持稳健的发展态势,也为公司的长远发展奠定了坚实基础。

Advanced Analog公司的发展小趣事

随着技术的不断进步和市场需求的多样化,Advanced Analog的产品逐渐应用于更广泛的领域。从最初的TFT-LCD面板,到后来的数字相机、手持装置、网络通讯装置等领域,Advanced Analog都提供了完整的解决方案和优质的服务。通过与各行业合作伙伴的紧密合作,Advanced Analog的产品助力众多电子设备实现了更高效、更稳定的性能,推动了整个电子行业的发展。

问答坊 | AI 解惑

protel 中如何绘制点阵

最近想做一个PCB板,要用到8*8的点阵,但是protel的库中没有点阵,要自己制一个,但是制成之后与实际的芯片如何一致,如长度,引脚之间的距离等。制成PCB之后如何能实现与实际的点阵大小,长度引脚等特点一致。做了好长时间也没做出来,希望专业人 ...…

查看全部问答>

关于蓝牙传输不稳定

  我用的是CSR的BC6的蓝牙芯片,平台是S3C2440+WIN CE的,上了CSR的驱动。BC6是用串口与主机通信,现在跑文件传输跑300K以下的来是没问题,跑300K以上的就老传到一半就没反应了,会不会是驱动问题,听给我们提供芯片的公司说微软的芯片只支持BC4 ...…

查看全部问答>

教你读懂手机电路图

不少同行反映,一部故障手机该换的元件都换了,但就是修不好机,大多数情况是对手机电路掌握不透彻,不会读和分析手机电路图,\"一吹二洗三代换\",三板斧下去,固然能解决一些问题,但深入下去就束手无策了。 很多人看到电路图就头痛,觉得毫无头 ...…

查看全部问答>

再次请教版主

版主,我现在对FSMC好迷惑啊。不知道有没有什么资料。 现在的问题是:    FSMC在bank1中的那4个片选NE1~4是如何判断接法?比如,为什么LCD液晶的片选要接NE4?     接其它的片选不行吗?那3个都是接什么的啊? https ...…

查看全部问答>

强烈建议STM8S开放外部数据总线

                                 刚刚把用STM8S给客户做的项目调试完毕,效果完美,客户非常满意,对STM8S的了解也更多了些,已经体验到这个小家伙 ...…

查看全部问答>

低功耗

低功耗是加进来了,可是需要10ms唤醒一次的,这样的低功耗有意义吗?能降低功耗吗? 总觉得10ms就唤醒太频繁了。…

查看全部问答>

winavr+avrstudio环境,用c语言,编译时要求makefile,该怎样操作?

winavr+avrstudio环境,用c语言,编译时要求makefile。 makefile文件是否只能在winavr中产生,在avrstudio中能否生成? 能否通过设置自动生成? 望高手指点!…

查看全部问答>

spi 驱动74hc595的问题

我用spi方式驱动74hc595, 595接的是共阳数码管 当我使用ckp=1// 空闲时是高电平         cke=1//从低电平到高电平发数据 数码管显示没问题 当我使用ckp=0;//空闲时是低电平       & ...…

查看全部问答>

也谈WEBENCH,不仅仅是活动

坛子里大多数兄弟可能是通过活动才知道WEBENCH这个工具的吧,这一块我接触的时间还是比较长的。因为最早从TI没有收购国家半导体的时候我就已经在用这个工具了,当时是国半的芯片LM2596,LM5007,作为运放供电,但是数据手册看的麻烦的很啊,所以就 ...…

查看全部问答>

R7F0C80212电路板利用code generator生成AD+UART应用。

看了论坛里关于串口乱码的讨论,归根到底是关于数据传输位LSB 与MSB的区别,自己也使用程序验证了一下,感觉这主要跟串口软件设置有关系。废话不说了,主要说一说如何使用cod generator(以下简称cg)生成AD和uart代码应用。该应用主要作用是ADC对AIN ...…

查看全部问答>