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