/*********************************************USART2{TX=PA2,Rx=PA3},USART1{TX=PA9,Rx=PA10}
*********************************************/
#ifndefUSART_H_
#defineUSART_H_
#include"Common.h"
#include"I2C.h"
#include"SG90.h"
#include"SRF05.h"
#defineUSART_RECV_BUFF_SIZE15
#definePclk1_36MHz36000000//其他USART
#definePclk2_72MHz72000000//USART1
#defineUSART_PSC16
//PrescalerValue时钟预分频
//#defineCrLf{0x0D,0x0A,0x00}
voidusart_init(void);
u32calcBRRDiv(u32BaudRate,u32Pclk);
externvoidSelectUsart(u32Usart);//Usart为usart代号1为usart1,非1为usart2
externvoidprintChar(charch);//由汇编实现
externvoidprintStr(char*str);
externvoidprintNum(s32num);
#ifdefDEBUG
voidprintf(char*s,...);
#endif
#endif
usart.c
#include"usart.h"#include"stdarg.h"
//串口
/***私有函数声明***/
u32calcBRRDiv(u32BaudRate,u32Pclk);
//------------------------------------------------------------------
//函数名:voidusart_init(void)
//输入参数:无
//返回参数:无
//说明:初始化串口寄存器
//备注:DEBUG模式下将会初始化USART1
//------------------------------------------------------------------
voidusart_init(void)
{
//Usart2配置
USART2->BRR=calcBRRDiv(9600,Pclk1_36MHz);//(USART_BRR)
USART2->GTPR=USART_PSC/2;//(USART_GTPR)
USART2->CR1=0x0000202C;//(USART_CR1)0x000020EC
USART2->CR2=0;
//(USART_CR2)
USART2->CR3=0;
//(USART_CR3)
#ifdefDEBUG
//Usart1配置
USART1->BRR=calcBRRDiv(9600,Pclk2_72MHz);//(USART_BRR)
USART1->GTPR=USART_PSC/2;//(USART_GTPR)
USART1->CR1=0x0000202C;//(USART_CR1)
#endif
}
#ifdefDEBUG
voidprintf(char*format,...)
{
va_listargs;
va_start(args,format);
while(*format)
{
if(*format==\'%\')
{
switch(*++format)
{
case\'c\':
printChar((char)va_arg(args,int));
break;
case\'s\':
printStr(va_arg(args,char*));
break;
case\'d\':
printNum((s32)va_arg(args,s32));
break;
case\'%\':
printChar(\'%\');
break;
}
}
else
{
printChar(*format);
}
format++;
}
va_end(args);
}
#endif
//------------------------------------------------------------------
//函数名:voidUSART2_IRQHandler(void)
//输入参数:null
//返回参数:null
//说明:串口接收中断服务
//------------------------------------------------------------------
constucharBTCtrl_DataFrameHeader[5]={0xa5,0x5a,0x11,0xf5,0};//蓝牙控制数据帧头
ucharser_dat[USART_RECV_BUFF_SIZE];//数据缓冲区
boolbProcessCompleted=true;//判断一帧数据是否处理完成,当一帧数据接收完毕,则该变量被置为false
enumBTProcessingFlag/*蓝牙数据接收模式*/
{
CheckingFrameHeader,//检测数据帧头
ReceivingData//接收数据包
};
voidUSART2_IRQHandler(void)
{
staticucharser_x=0;
staticucharmat_x=0;//matchx
staticucharsum=0;
staticenumBTProcessingFlagdflag=CheckingFrameHeader;
if(bProcessCompleted)//!上一帧数据处理完成之后
{
if(USART2->SR&1
{
if(dflag==CheckingFrameHeader)
{
if(USART2->DR==BTCtrl_DataFrameHeader[mat_x])
{
mat_x++;
}
else
{
mat_x=0;
}
if(BTCtrl_DataFrameHeader[mat_x]==0)//!数据头结束,更换模式准备接收数据
{
dflag=ReceivingData;
ser_x=0;
mat_x=0;
sum=0;
}
}
elseif(dflag==ReceivingData)
{
ser_dat[ser_x]=USART2->DR;
if(ser_x==USART_RECV_BUFF_SIZE-1)//!只接收USART_RECV_BUFF_SIZE字节
{
sum+=BTCtrl_DataFrameHeader[2];
sum+=BTCtrl_DataFrameHeader[3];
dflag=CheckingFrameHeader;//!切换接收模式
if(ser_dat[USART_RECV_BUFF_SIZE-1]==sum)//!数据检验
{
bProcessCompleted=false;//!数据正确,置接收完成标志
USART2->CR1&=~(1
}
}
sum+=ser_dat[ser_x];//!数据验证
ser_x++;
}
}
}
}
//------------------------------------------------------------------
//函数名:u32calcBRRDiv(u32BaudRate,u32Pclk)
//输入参数:BaudRate=波特率,Pclk=RCC时钟频率
//返回参数:应置入寄存器的值
//说明:计算相应波特率以及时钟频率对应的BRRDiv寄存器中应该填入的值
//备注:计算方法参照(分数波特率的产生)
//------------------------------------------------------------------
u32calcBRRDiv(u32BaudRate,u32Pclk)
{
u32div_mant;
u32div_frac;
floatfrac;
div_mant=Pclk/(USART_PSC*BaudRate);
frac=(float)Pclk/(USART_PSC*BaudRate);
frac-=div_mant;
frac*=USART_PSC;
div_frac=(u32)frac;
div_frac+=(frac-div_frac)>=0.5?1:0;//四舍五入
if(div_frac==USART_PSC)//满USART_PSC进位
{
div_frac=0;
div_mant++;
}
div_mant
div_mant|=div_frac;
returndiv_mant;
}
本文来自投稿,不代表本站立场,如有侵权联系即删除,站长QQ:192398865:https://www.fulishes.com/164387/