#include "sys.h"
#include "usart.h"
#include "iic.h"
#include "led.h"
#include "string.h"
#define USART1_TX_BUF_MAXLEN 64
u8 USART_TX_BUF[USART1_TX_BUF_MAXLEN]; //存放空间
u8 USART_TX_BUF_IN_POINT=0; //进队列位置记录
u8 USART_TX_BUF_OUT_POINT=0; //出队列位置记录
u8 USART_TX_BUF_WAIT_FLAG=0; //发送等待标志,判断是否启动发送1为占用,0为空闲
//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
//#if 1
//#pragma import(__use_no_semihosting)
////标准库需要的支持函数
//struct __FILE
//{
// int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
//};
/* FILE is typedef’ d in stdio.h. */
//FILE __stdout;
////定义_sys_exit()以避免使用半主机模式
//_sys_exit(int x)
//{
// x = x;
//}
////重定义fputc函数
//int fputc(int ch, FILE *f)
//{
// while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
// USART1->DR = (u8) ch;
// return ch;
//}
//#endif
//end
//////////////////////////////////////////////////////////////////
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记
u8 Receive_from_Upper=0; //0为常态,1 为需发送状态
void USART1_IRQHandler(void)
{
u8 res;
//接收中断
if(UART1->SR&(1<<5))//接收寄存器非空
{
res=UART1->DR;
Receive_from_Upper=res;
}
//发送中断
if(UART1->SR&(1<<6)) //发送寄存器空,由软件序列清除(先读USART_SR,然后写入USART_DR)。TC位也可以通过写入’0’来清除
{ //USART_TX_BUF_OUT_POINT==USART_TX_BUF_IN_POINT
USART_TX_BUF_WAIT_FLAG=0;
send_manage();
}
}
//初始化IO 串口1 PA9:usart->TX PA10:usart->RX
//pclk2:PCLK2时钟频率(pclk2Mhz)
//bound:bound波特率
//CHECK OK
void uart_init(UART_BaudRate_TypeDef BaudRate, UART1_Mode_TypeDef Mode)
{
/* Check the parameters */
// assert_param(IS_UART1_BAUDRATE_OK(BaudRate));
// assert_param(IS_UART1_MODE_OK((uint8_t)Mode));
// Clear the word length bit, Clear the Parity Control bit
UART1->CR1 &=0; //(u8)(~(UART1_CR1_M|UART1_CR1_PCEN)); //8bit Data, None Parity
// Clear the STOP bits
UART1->CR3 &= (u8)(~(UART1_CR3_STOP|UART1_CR3_CKEN)); //1bit Stop
UART1->BRR2 = (uint8_t)(BaudRate>>8);
UART1->BRR1 = (uint8_t)BaudRate;
// Clear the Transmitter/Receiver Disable bit
UART1->CR2 &= (u8)(~(UART1_CR2_TEN|UART1_CR2_REN));
if(Mode&UART1_MODE_TX_ENABLE)
{
// Set the Transmitter Enable bit
UART1->CR2 |= (uint8_t)UART1_CR2_TEN;
}
if(Mode&UART1_MODE_RX_ENABLE)
{
// Set the Receiver Enable bit
UART1->CR2 |= (uint8_t)UART1_CR2_REN;
}
// UART1->CR2 |= UART1_CR2_TIEN; //Enable Intterupt
#ifdef UART1_RX_INTERRUPT
UART1_CR2 |= UART1_CR2_RIEN;
#endif
}
void PrintChar (char *s)
{
while (*s!= '\n')
{
usart_Buf_u8(*(unsigned char *)s);
// Usart1Send(*s);
s++;
}
}
void PrintQUAT(long q0,long qi,long qj,long qk)
{
char ctemp;
ctemp=q0>>24;
usart_Buf_u8(ctemp);
ctemp=q0>>16;
usart_Buf_u8(ctemp);
ctemp=q0>>8;
usart_Buf_u8(ctemp);
ctemp=q0;
usart_Buf_u8(ctemp);
ctemp=qi>>24;
usart_Buf_u8(ctemp);
ctemp=qi>>16;
usart_Buf_u8(ctemp);
ctemp=qi>>8;
usart_Buf_u8(ctemp);
ctemp=qi;
usart_Buf_u8(ctemp);
ctemp=qj>>24;
usart_Buf_u8(ctemp);
ctemp=qj>>16;
usart_Buf_u8(ctemp);
ctemp=qj>>8;
usart_Buf_u8(ctemp);
ctemp=qj;
usart_Buf_u8(ctemp);
ctemp=qk>>24;
usart_Buf_u8(ctemp);
ctemp=qk>>16;
usart_Buf_u8(ctemp);
ctemp=qk>>8;
usart_Buf_u8(ctemp);
ctemp=qk;
usart_Buf_u8(ctemp);
}
void PrintAGXYZ(int ax,int ay,int az,int gx,int gy,int gz)
{
usart_Buf_char(" ax:\n");
PrintIntnum_Decimal(ax);
usart_Buf_char(" ay:\n");
PrintIntnum_Decimal(ay);
usart_Buf_char(" az:\n");
PrintIntnum_Decimal(az);
usart_Buf_char(" gx:\n");
PrintIntnum_Decimal(gx);
usart_Buf_char(" gy:\n");
PrintIntnum_Decimal(gy);
usart_Buf_char(" gz:\n");
PrintIntnum_Decimal(gz);
}
//void PrintPRY(u8 Pitch_s,u8 Roll_s,u8 Yaw_s);//三组数据范围皆是-180到180
int floatchangeint(float temp) //浮点转整形,去除小数点后的数字
{
int ctemp;
if(temp<0)
{
temp=0-temp;
ctemp=temp;
ctemp=0-ctemp;
return ctemp;
}
else
ctemp=temp;
return ctemp;
}
//void PrintPRY(u8 Pitch_s,u8 Roll_s,u8 Yaw_s);//P在-90到90之间,RY在-180到180之间
void PrintPRY(int Pitch_s,int Roll_s,int Yaw_s)
{
u8 ctemp;
ctemp=Pitch_s>>8;
usart_Buf_u8(ctemp);
ctemp=Pitch_s;
usart_Buf_u8(ctemp);
ctemp=Roll_s>>8;
usart_Buf_u8(ctemp);
ctemp=Roll_s;
usart_Buf_u8(ctemp);
ctemp=Yaw_s>>8;
usart_Buf_u8(ctemp);
ctemp=Yaw_s;
usart_Buf_u8(ctemp);
}
//十进制数字输出
void PrintIntnum_Decimal(int num)
{
int ctemp;
u8 w5;
u8 w4;
u8 w3,w2,w1;
if(num<0)
{
usart_Buf_char("-\n");
ctemp=0-num;
w5=ctemp/10000;
w4=ctemp%10000/1000;
w3=ctemp%1000/100;
w2=ctemp%100/10;
w1=ctemp%10;
usart_Buf_u8(w5+0x30);
usart_Buf_u8(w4+0x30);
usart_Buf_u8(w3+0x30);
usart_Buf_u8(w2+0x30);
// usart_Buf_char(".\n")
usart_Buf_u8(w1+0x30);
}
else
{
usart_Buf_char("+\n");
ctemp=num;
w5=ctemp/10000;
w4=ctemp%10000/1000;
w3=ctemp%1000/100;
w2=ctemp%100/10;
w1=ctemp%10;
usart_Buf_u8(w5+0x30);
usart_Buf_u8(w4+0x30);
usart_Buf_u8(w3+0x30);
usart_Buf_u8(w2+0x30);
usart_Buf_u8(w1+0x30);
}
}
/////PRY专用字符型
void PrintPRYbyChars(int Pitch_s,int Roll_s,int Yaw_s) //三组数据范围皆是-180到180
{
usart_Buf_char(" Pitch:\n");
PrintIntnum_Decimal(Pitch_s);
usart_Buf_char(" Roll:\n");
PrintIntnum_Decimal(Roll_s);
usart_Buf_char(" Yaw:\n");
PrintIntnum_Decimal(Yaw_s);
}
///通信管理=非字符格式,队列式处理,从小到大循环,格式取决于入数循环格式/////
//#define USART1_TX_BUF_MAXLEN 32
//u8 USART_TX_BUF[USART1_TX_BUF_MAXLEN]; //存放空间
//u8 USART_TX_BUF_IN_POINT=0; //进队列位置记录
//u8 USART_TX_BUF_OUT_POINT=0; //出队列位置记录
//u8 USART_TX_BUF_WAIT_FLAG=0; //判断是否启动发送
u8 usart_Buf_point_add(u8 num_point)
{
num_point++;
if(num_point<USART1_TX_BUF_MAXLEN)
{
return num_point; }
else
return 0;
}
void usart_Buf_u8(u8 Buf_u8)
{
if(USART_TX_BUF_IN_POINT<USART_TX_BUF_OUT_POINT) //出入倒置情况
{ //
if((USART_TX_BUF_OUT_POINT-USART_TX_BUF_IN_POINT)>1) //有空间存放
{
USART_TX_BUF[USART_TX_BUF_IN_POINT]=Buf_u8;
USART_TX_BUF_IN_POINT=usart_Buf_point_add(USART_TX_BUF_IN_POINT); //在0至USART1_TX_BUF_MAXLEN间间循环
}
else //没有空间存放
{
while(!(USART_TX_BUF_OUT_POINT==USART_TX_BUF_IN_POINT));; //等待发送区清空,清空时相等
USART_TX_BUF[USART_TX_BUF_IN_POINT]=Buf_u8;
USART_TX_BUF_IN_POINT=usart_Buf_point_add(USART_TX_BUF_IN_POINT); //在0至USART1_TX_BUF_MAXLEN间间循环
}
}
else //出入普通情况
{
if((USART1_TX_BUF_MAXLEN+USART_TX_BUF_OUT_POINT-USART_TX_BUF_IN_POINT)>1) //有空间存放
{
USART_TX_BUF[USART_TX_BUF_IN_POINT]=Buf_u8;
USART_TX_BUF_IN_POINT=usart_Buf_point_add(USART_TX_BUF_IN_POINT); //在0至USART1_TX_BUF_MAXLEN间间循环
}
else //没有空间存放
{
while(!(USART_TX_BUF_OUT_POINT==USART_TX_BUF_IN_POINT));; //等待发送区清空,清空时相等
USART_TX_BUF[USART_TX_BUF_IN_POINT]=Buf_u8;
USART_TX_BUF_IN_POINT=usart_Buf_point_add(USART_TX_BUF_IN_POINT); //在0至USART1_TX_BUF_MAXLEN间间循环
}
}
///启动发送
if(!(USART_TX_BUF_WAIT_FLAG)) //如果没有发送中,等待发送中断自动处理,否则启动
{
send_manage();
}
}
void usart_Buf_u16(u16 Buf_u16)
{
if(