dros(dros香水是什么意思?)

dros(dros香水是什么意思?)

dros(dros香水是什么意思?)

/*********************************************

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/

(0)
上一篇 2024年5月9日
下一篇 2024年5月9日

相关推荐