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