天天看點

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
           

繼續閱讀