看了,一般,我曾也封装过一个,但我采用我写的循环FIFO封装,且发送和接收都采用FIFO,用户发送数据只需要往FIFO写入即可,在波特率较低且发送数据较小时,效率特别明显。上传给大家看看,FIFO就自己去写吧。
/*******************************************************************************
** 文件名: userlib_usart.c
** 包含文件:userlib_fifoloop.h,userlib_usart.h,stm32f10x_lib.h
** 功能描述:STM32串口库封装
** 作者: Hanzic/孙昭德
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
** 版权: 利尔达科技有限公司 www.lierda.com
*******************************************************************************/
#include "userlib_fifoloop.h"
#include "userlib_usart.h"
#include "stm32f10x_lib.h"
/******************************************************************************/
/******************************************************************************/
/************************* 以下是全局变量定义 *********************************/
/******************************************************************************/
#if USE_USART1
static FIFOSocket Usart1TSK; //使用发送缓存,使用FIFO模块,分配套接字
static FIFOSocket Usart1RSK; //使用接收缓存,使用FIFO模块,分配套接字
static unsigned char Usart1TBuff[USARTBuffSize]; //发送缓存
static unsigned char Usart1RBuff[USARTBuffSize]; //接收缓存
#endif
#if USE_USART2
static FIFOSocket Usart2TSK; //使用发送缓存,使用FIFO模块,分配套接字
static FIFOSocket Usart2RSK; //使用接收缓存,使用FIFO模块,分配套接字
static unsigned char Usart2TBuff[USARTBuffSize]; //发送缓存
static unsigned char Usart2RBuff[USARTBuffSize]; //接收缓存
#endif
#if USE_USART3
static FIFOSocket Usart3TSK; //使用发送缓存,使用FIFO模块,分配套接字
static FIFOSocket Usart3RSK; //使用接收缓存,使用FIFO模块,分配套接字
static unsigned char Usart3TBuff[USARTBuffSize]; //发送缓存
static unsigned char Usart3RBuff[USARTBuffSize]; //接收缓存
#endif
/*******************************************************************************
** 函数名: UsartInit
** 功能 : 串口初始化
** 输入参数:unsigned long pBaudRate 波特率设置
** 输出参数:无
** 作者: Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
void UsartInit(unsigned long pBaudRate)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3, ENABLE);
/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_9; //Usart1,Usart2 Tx
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; //Usart3 Tx
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_1; //Usart1,Usart2 Rx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //Usart3 Rx
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = pBaudRate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Init(USART2, &USART_InitStructure);
//USART_InitStructure.USART_BaudRate = 9600;
USART_Init(USART3, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USARTy, USART_IT_TXE, ENABLE);
/* Enable USARTz Receive and Transmit interrupts */
//USART_ITConfig(USARTz, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USARTz, USART_IT_TXE, ENABLE);
FIFOInit(&Usart1TSK,Usart1TBuff,USARTBuffSize); //初始化发送FIFO
FIFOInit(&Usart1RSK,Usart1RBuff,USARTBuffSize); //初始化接收FIFO
FIFOInit(&Usart2TSK,Usart2TBuff,USARTBuffSize); //初始化发送FIFO
FIFOInit(&Usart2RSK,Usart2RBuff,USARTBuffSize); //初始化接收FIFO
FIFOInit(&Usart3TSK,Usart3TBuff,USARTBuffSize); //初始化发送FIFO
FIFOInit(&Usart3RSK,Usart3RBuff,USARTBuffSize); //初始化接收FIFO
/* Enable USART */
USART_Cmd(USART1, ENABLE);
USART_Cmd(USART2, ENABLE);
USART_Cmd(USART3, ENABLE);
/* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //复用开漏输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口 */
}
/*******************************************************************************
** 函数名: UsartRecByte
** 功能 : 串口接收一个字符
** 输入参数:USART_TypeDef * USARTx 串口号
** unsigned char * ch 需接收字符的指针
** 输出参数:unsigned char 成功接收字符返回1 否则返回0
** 作者: Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
unsigned char UsartRecByte(USART_TypeDef * USARTx,unsigned char * ch)
{
if(USARTx == USART1)
{
return FIFOByteRead(&Usart1RSK,ch);
}
if(USARTx == USART2)
{
return FIFOByteRead(&Usart2RSK,ch);
}
if(USARTx == USART3)
{
return FIFOByteRead(&Usart3RSK,ch);
}
return 0;
}
/*******************************************************************************
** 函数名: UsartSendByte
** 功能 : 串口发送一个字符
** 输入参数:USART_TypeDef * USARTx 串口号
** unsigned char ch 需发送的字符
** 输出参数:unsigned char 成功发送字符返回1 否则返回0
** 作者: Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
unsigned char UsartSendByte(USART_TypeDef * USARTx,unsigned char ch)
{
if(USARTx == USART1)
{
if(FIFOByteWrite(&Usart1TSK,ch))
{
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
return 1;
}
}
if(USARTx == USART2)
{
if(FIFOByteWrite(&Usart2TSK,ch))
{
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
return 1;
}
}
if(USARTx == USART3)
{
if(FIFOByteWrite(&Usart3TSK,ch))
{
USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
return 1;
}
}
return 0;
}
/*******************************************************************************
** 函数名: UsartRecStr
** 功能 : 接收字符串
** 输入参数:USART_TypeDef * USARTx 串口号
** unsigned char * ch 用于接收字符串的指针
** long len 接收缓存的长度---也表示想接收的长度
** 输出参数: unsigned long 返回接收到的长度 --- 不会超过参数len
** 作者: Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
unsigned long UsartRecStr(USART_TypeDef * USARTx,unsigned char * ch,long len)
{
if(USARTx == USART1)
{
return FIFOStrRead(&Usart1RSK,ch,len);
}
if(USARTx == USART2)
{
return FIFOStrRead(&Usart2RSK,ch,len);
}
if(USARTx == USART3)
{
return FIFOStrRead(&Usart3RSK,ch,len);
}
return 0;
}
/*******************************************************************************
** 函数名: UsartSendStr
** 功能 : 发送字符串
** 输入参数:USART_TypeDef * USARTx 串口号
** unsigned char * ch 用于发送字符串的缓存指针
** long len 需要发送的长度
** 输出参数:unsigned long 返回成功发送的长度 --当FIFO满后,剩下的字符将不能发送。
** 作者: Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
unsigned long UsartSendStr(USART_TypeDef * USARTx,unsigned char * ch,long len)
{
unsigned long i;
if(USARTx == USART1)
{
i = FIFOStrWrite(&Usart1TSK,ch,len);
if(i)
{
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
return i;
}
}
if(USARTx == USART2)
{
i = FIFOStrWrite(&Usart2TSK,ch,len);
if(i)
{
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
return i;
}
}
if(USARTx == USART3)
{
i = FIFOStrWrite(&Usart3TSK,ch,len);
if(i)
{
USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
return i;
}
}
return 0;
}
/*******************************************************************************
** 函数名: Usart1IntSer
** 功能 : 串口中断服务函数
** 输入参数:无
** 输出参数:无
** 作者: Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
void Usart1IntSer(void)
{
unsigned char ch;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
FIFOByteWrite(&Usart1RSK,USART_ReceiveData(USART1)); //接收一个字节
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
if(FIFOByteRead(&Usart1TSK,&ch))
{
USART_SendData(USART1,ch);
}
if(GotFIFODeep(&Usart1TSK)==0)
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
}
}
/*******************************************************************************
** 功能 : 串口中断服务函数
** 输入参数:无
** 输出参数:无
** 作者: Hanzic
** 创建日期:2009-11-3
** 修改者: Hanzic
** 修改日期:2011-8-4 没有修改,查出:当外部总中断关断时,若有数据接收,则再总中断再次开启时,
** 会不停进入此中断,且中断不知为何中断,无法解决访问题。
*******************************************************************************/
void Usart2IntSer(void)
{
unsigned char ch;
//USART_ClearITPendingBit(USART1, USART_IT_ERR); //清除标志位
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
// USART_ClearITPendingBit(USART1, USART_IT_RXNE);
FIFOByteWrite(&Usart2RSK,USART_ReceiveData(USART2)); //接收一个字节
}
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
{
//USART_ClearITPendingBit(USART1, USART_IT_TXE); //清除标志位
if(FIFOByteRead(&Usart2TSK,&ch))
{
USART_SendData(USART2,ch);
}
if(GotFIFODeep(&Usart2TSK)==0)
{
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
}
/*******************************************************************************
** 功能 : 串口中断服务函数
** 输入参数:无
** 输出参数:无
** 作者: Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
void Usart3IntSer(void)
{
unsigned char ch;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
FIFOByteWrite(&Usart3RSK,USART_ReceiveData(USART3)); //接收一个字节
}
if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
{
if(FIFOByteRead(&Usart3TSK,&ch))
{
USART_SendData(USART3,ch);
}
if(GotFIFODeep(&Usart3TSK)==0)
{
USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
}
}
}
/*******************************************************************************
** 文件结束
*******************************************************************************/ |