STM32F10X UART4 + DMA

UART4.c

#include "BSP_Uart4.h"

/********************************************************************************************
*                       变          量          声          明                              *
*********************************************************************************************/

Stu_UART4_INFO UART4_INFO;

/********************************************************************************************
*                       函          数          声          明                              *
*********************************************************************************************/


/********************************************************************************
*       函 数   名      :   UART4_ParameterInit                                 *
*       功 能   说  明  :   UART4通信参数初始化                                 *
*       形      参      :   baudrate:波特率                                     *
*       形      参      :   parity:奇偶校验                                     *
*       形      参      :   databits:数据位                                     *
*       形      参      :   stopbits:停止位                                     *
*       返  回  值      :   无                                                  *
*********************************************************************************/
void   UART4_ParameterInit(unsigned int baudrate,unsigned char parity,unsigned int databits,unsigned int stopbits )
{
     unsigned int i;

     UART4_INFO.Baudrate = baudrate;

         if( parity == 'N' )
    {
        UART4_INFO.Parity = USART_Parity_No;                            // 无奇偶校验                
    }
    else if ( parity == 'E' )
    {
        UART4_INFO.Parity = USART_Parity_Even;                          //偶校验                      
    }
    else
    {
        UART4_INFO.Parity = USART_Parity_Odd;                           //奇校验                         
    }

    if( databits == 8 )
    {
        UART4_INFO.DataBit = USART_WordLength_8b;                  
    }
    else
    {
        UART4_INFO.DataBit = USART_WordLength_9b;                  
    }

    if( stopbits == 1 )
    {
        UART4_INFO.StopBit = USART_StopBits_1;                     
    }
    else 
    {
        UART4_INFO.StopBit = USART_StopBits_2;                    
    }

    UART4_INFO.RxIndex = 0;
    UART4_INFO.RxHead = 0;
    UART4_INFO.RxLength =0;
    
    UART4_INFO.TxIndex = 0;
    UART4_INFO.TxTail = 0;
    UART4_INFO.TxLength = 0;
    UART4_INFO.Bus = UART4_BUS_IDLE;

    for( i=0;i<UART4_BUFLENGTH;i++)
    {
        UART4_INFO.RxBuf[i] = 0x00;
        UART4_INFO.TxBuf[i] = 0x00;
    }  
    
    UART4_INFO.OverTime =0;
}

/********************************************************************************
*       函 数   名      :   UART4_HardwareInit                                  *
*       功 能   说  明  :   UART4通信参数初始化                                 *
*       形      参      :   无                                                  *
*       返  回  值      :   无                                                  *
*********************************************************************************/

void UART4_HardwareInit(void)
{
    NVIC_InitTypeDef  UART4_NVIC;                           //中断设置机构体
    GPIO_InitTypeDef  UART4_GPIO;                           //GPIO设置结构体
    USART_InitTypeDef UART4_INIT;                           //Usart设置结构体

    //使能UART4外设时钟与GOIO端口时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);   //UART4外设时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//GPIO端口时钟与复用时钟

    //设置中断优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
    UART4_NVIC.NVIC_IRQChannel                   = UART4_IRQn;              //中断通道
    UART4_NVIC.NVIC_IRQChannelPreemptionPriority = 1;                       //抢占优先级
    UART4_NVIC.NVIC_IRQChannelSubPriority        = 2;                       //响应优先级
    UART4_NVIC.NVIC_IRQChannelCmd                = ENABLE;                  //中断使能
    NVIC_Init( &UART4_NVIC);

    //端口初始化
    UART4_GPIO.GPIO_Pin   = UART4_TX_PIN;                       //发送端口
    UART4_GPIO.GPIO_Mode  = GPIO_Mode_AF_PP;                    //复用推挽输出
    UART4_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(UART4_TX_PORT, &UART4_GPIO);
    
    UART4_GPIO.GPIO_Pin  = UART4_RX_PIN;                        //接收端口
    UART4_GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;               //浮空输入
    UART4_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(UART4_RX_PORT, &UART4_GPIO);

    UART4_GPIO.GPIO_Pin   = UART4_DE_PIN;                       //DE端口
    UART4_GPIO.GPIO_Mode  = GPIO_Mode_Out_PP;                   //推挽输出
    UART4_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(UART4_DE_PORT, &UART4_GPIO);

    //UART4  配置
    UART4_RX_ENABLE;                                            //接收使能
    UART4_INIT.USART_BaudRate   = UART4_INFO.Baudrate;          //波特率
    UART4_INIT.USART_Parity     = UART4_INFO.Parity ;           //奇偶校验
    UART4_INIT.USART_WordLength = UART4_INFO.DataBit;           //数据位
    UART4_INIT.USART_StopBits   = UART4_INFO.StopBit;           //停止位
    UART4_INIT.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    UART4_INIT.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(UART4, &UART4_INIT);
    UART4->BRR = 0xEA6;

    
    //串口中断模式
    USART_ITConfig(UART4,USART_IT_TC,DISABLE);                  //关闭发送中断
    USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);                 //启动接收中断

    //使能UART4
    USART_Cmd(UART4, ENABLE);

    /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
        如下语句解决第1个字节无法正确发送出去的问题 */
    USART_ClearFlag(UART4, USART_FLAG_TC);  /* 清发送完成标志,Transmission Complete flag (位于状态寄存器中)*/
}


/********************************************************************************
*       函 数   名      :   UART4_SendData                                      *
*       功 能   说  明  :   UART4发送数据(先发送到缓存区,                      *
*                                       再由位移寄存器发送)                     *
*       形      参      :   data:发送的数据                                     *
*       形      参      :   length:发送数据长度                                 *
*       返  回  值      :   无                                                  *
*********************************************************************************/
void UART4_SendData(unsigned char *data,unsigned char length)
{
    unsigned char i;
    if(length)                                                  //发送数据长度不为0
    {
        for(i=0;i<length;i++)
        {
            UART4_INFO.TxLength++;                              //每向缓存区填充一个自己的数据tx发送长度自加1
            UART4_INFO.TxBuf[UART4_INFO.TxTail++] = data[i];    //在相应索引号的缓存区存储数据
            if(UART4_INFO.TxTail >= UART4_BUFLENGTH)            //缓存区间满
            {
                UART4_INFO.TxTail -= UART4_BUFLENGTH;           //从0开始继续存储
            }
            else
            {
                //do nothing
            }
        }

        UART4_TX_ENABLE;                                        // 使能 UART4发送

        USART_ITConfig(UART4,USART_IT_TC,ENABLE);               //使能串口发送完成中断
        
        if(USART_GetFlagStatus(UART4,USART_FLAG_TXE))           //数据被转移到位移寄存器中
        {
            USART_SendData( UART4, UART4_INFO.TxBuf[ UART4_INFO.TxIndex++] ); //发送数据,每发送一个自节TxIndex+1;
            UART4_INFO.Bus = UART4_BUS_TX;                      //串口总线为发送总线状态
            UART4_INFO.TxLength--;                              //每成功发送一个字节的数据,TxLength自减1
            if(UART4_INFO.TxIndex >= UART4_BUFLENGTH)
            {
                UART4_INFO.TxIndex -= UART4_BUFLENGTH;          //从0开始继续计数
            }
            else
            {
                //do nothing
            }
        }
        else
        {
            //do nothing
        }
    }
    else
    {
        //do nothing
    }
}

/********************************************************************************
*       函 数   名      :   UART4_ReciveData                                    *
*       功 能   说  明  :UART4接收数据                                          *
*       形      参      : 无                                                    *
*       返  回  值      : 无                                                    *
*********************************************************************************/
void UART4_ReciveData(void)
{
    UART4_INFO.RxBuf[UART4_INFO.RxIndex++] = USART_ReceiveData(UART4);          //接收数据到RX缓存中,每接收一个字节RxIndex加1
    UART4_INFO.RxLength++;                                                      //接收数据长度自加1
    if(UART4_INFO.RxIndex >= UART4_BUFLENGTH)                                   //接收缓存满
    {
        UART4_INFO.RxIndex -= UART4_BUFLENGTH;                                  //从0开始继续存储
    }
    else
    {
        //do nothing
    }
}

/********************************************************************************
*       函 数   名      :   UART4_IRQHandler                                    *
*       功 能   说  明  :   UART4中断处理函数                                   *
*       形      参      :   无                                                  *
*       返  回  值      :   无                                                  *
*********************************************************************************/
void UART4_IRQHandler(void)
{
    if(USART_GetITStatus(UART4,USART_IT_RXNE) == SET)               //读数据寄存器(DR)非空
    {
        USART_ClearITPendingBit(UART4,USART_IT_RXNE);               //清除DR非空中断标志
        UART4_ReciveData();                                         //接收数据处理
        UART4_INFO.Bus = UART4_BUS_RX;                              //接收总线
    }
    else
    {
        //do nothing
    }
    if(USART_GetITStatus(UART4, USART_IT_TC) == SET)                //发送完成中断标志,数据发送完成
    {
        USART_ClearFlag(UART4, USART_IT_TC);                        //清除发送完成中断标志
        if(UART4_INFO.TxLength)                                     //仍有需要发送的数据
        {
            UART4_INFO.TxLength--;                                  //待发送数据长度自减1
            USART_SendData( UART4, UART4_INFO.TxBuf[UART4_INFO.TxIndex++]); //继续发送数据
            UART4_INFO.Bus = UART4_BUS_TX;                          //发送总线
            if(UART4_INFO.TxIndex >= UART4_BUFLENGTH)
            {
                UART4_INFO.TxIndex-=UART4_BUFLENGTH;
            }
            else
            {
                //do nothing
            }
        }
        else                                                        //没有要发送的数据
        {
            USART_ITConfig(UART4,USART_IT_TC,DISABLE);              //禁止发送完成中断
            UART4_INFO.Bus = UART4_BUS_IDLE;                        //  空闲总线
            UART4_RX_ENABLE;                                        //UART4接收数据使能
        }
    }
     else
    {
        //do nothing
    }
}

/********************************************************************************
*       函 数   名      :   UART4_Init                                          *
*       功 能   说  明  :   UART4初始化                                         *
*       形      参      :   无                                                  *
*       返  回  值      :   无                                                  *
*********************************************************************************/
void UART4_Init(void)
{
    UART4_ParameterInit(9600,'N',8,1);
    UART4_HardwareInit();
}

UART4.h

#ifndef	__BSP_Uart4_H_
#define	__BSP_Uart4_H_

#include "stm32f10x.h"

#define UART4_BUFLENGTH         128						//缓存区长度
	
#define UART4_BUS_IDLE         0x00						//通信总线空闲
#define UART4_BUS_RX           0x01						//通信总线为接收状态
#define UART4_BUS_TX           0x02						//通信总线为发送状态

typedef struct 
{
    unsigned long Baudrate;								//波特率
    unsigned int  Parity;								//奇偶校验
    unsigned int  DataBit;								//数据位
    unsigned int  StopBit;								//停止位

    unsigned char RxBuf[ UART4_BUFLENGTH ];				//接收缓存区长度
    unsigned int  RxIndex;								//
    unsigned int  RxHead;								//
    unsigned int  RxLength;                             //接收数据长度

    unsigned char TxBuf[UART4_BUFLENGTH];				//发送缓存区长度
    unsigned int  TxIndex;								//
    unsigned int  TxTail;								//
    unsigned int  TxLength;                             //待发送数据长度
    unsigned char Bus;                                  //发送忙信号

    unsigned int  OverTime;                             //通讯延时

} Stu_UART4_INFO;

//GPIO口定义
#define UART4_TX_PORT          GPIOC
#define UART4_TX_PIN           GPIO_Pin_10
#define UART4_RX_PORT          GPIOC
#define UART4_RX_PIN           GPIO_Pin_11

#define UART4_DE_PORT          GPIOA
#define UART4_DE_PIN           GPIO_Pin_15
#define UART4_TX_ENABLE        (UART4_DE_PORT->BSRR = UART4_DE_PIN) //SET,DE_H,and RE_L  发送使能
#define UART4_RX_ENABLE        (UART4_DE_PORT->BRR = UART4_DE_PIN)  //RESET,DE_L,and RE_H 接收使能
#define GET_UART4_DE	       (GPIO_ReadInputDataBit(UART4_DE_PORT,UART4_DE_PIN))

/********************************************************************************************
*						变			量			声			明								*
*********************************************************************************************/

extern Stu_UART4_INFO UART4_INFO;

/********************************************************************************************
*						函			数			声			明								*
*********************************************************************************************/

extern void UART4_SendData(unsigned char *data,unsigned char length);
extern void UART4_Init(void);

#endif

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值