STM32 USART DMA发送 中断接收

文件(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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七七云享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值