www.pudn.com > MiniIMU-AHRS.rar > UARTs.c, change:2012-04-17,size:7855b


/* UARTs.C file 
编写者:lisn3188 
网址:www.chiplab7.com 
作者E-mail:lisn3188@163.com 
编译环境:MDK-Lite  Version: 4.23 
初版时间: 2012-04-17 
功能:实现	姿态仪与上位机联机 
 
---------硬件上的引脚连接:---------- 
接口: 
TXD  -->  PA9  (UART1-TXD) 
RXD  -->  PA10 (UART1-RXD) 
------------------------------------ 
 */ 
 
#include "UARTs.h" 
 
 
/**************************实现函数******************************************** 
*函数原型:		void Initial_UART1(u32 baudrate) 
*功  能:		初始化UART 
输入参数: 
		u32 baudrate   设置RS232串口的波特率 
输出参数:没有	 
*******************************************************************************/ 
void Initial_UART1(u32 baudrate) 
{ 
 	GPIO_InitTypeDef GPIO_InitStructure; 
	USART_InitTypeDef USART_InitStructure; 
 
	/* 使能 UART1 模块的时钟  使能 UART1对应的引脚端口PA的时钟*/ 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); 
 
  	 /* 配置UART1 的发送引脚 
	 配置PA9 为复用输出  刷新频率50MHz 
	  */ 
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  	GPIO_Init(GPIOA, &GPIO_InitStructure);     
  	/*  
	  配置UART1 的接收引脚 
	  配置PA10为浮地输入  
	 */ 
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
  	GPIO_Init(GPIOA, &GPIO_InitStructure); 
	   
	/*  
	  UART1的配置: 
	  1.波特率为调用程序指定的输入 baudrate; 
	  2. 8位数据			  USART_WordLength_8b; 
	  3.一个停止位			  USART_StopBits_1; 
	  4. 无奇偶效验			  USART_Parity_No ; 
	  5.不使用硬件流控制	  USART_HardwareFlowControl_None; 
	  6.使能发送和接收功能	  USART_Mode_Rx | USART_Mode_Tx; 
	 */ 
	USART_InitStructure.USART_BaudRate = baudrate; 
	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; 
	//应用配置到UART1 
	USART_Init(USART1, &USART_InitStructure);  
	//启动UART1 
  	USART_Cmd(USART1, ENABLE); 
} 
 
/**************************实现函数******************************************** 
*函数原型:		void UART1_Put_Char(unsigned char DataToSend) 
*功  能:		RS232发送一个字节 
输入参数: 
		unsigned char DataToSend   要发送的字节数据 
输出参数:没有	 
*******************************************************************************/ 
void UART1_Put_Char(unsigned char DataToSend) 
{ 
	//将要发送的字节写到UART1的发送缓冲区 
	USART_SendData(USART1, (unsigned char) DataToSend); 
	//等待发送完成 
  	while (!(USART1->SR & USART_FLAG_TXE)); 
} 
 
/**************************实现函数******************************************** 
*函数原型:		void UART1_ReportIMU(int16_t yaw,int16_t pitch,int16_t roll 
				,int16_t alt,int16_t tempr,int16_t press) 
*功  能:		向上位机发送经过解算后的姿态数据 
输入参数: 
		int16_t yaw 经过解算后的航向角度。单位为0.1度 0 -> 3600  对应 0 -> 360.0度 
		int16_t pitch 解算得到的俯仰角度,单位 0.1度。-900 - 900 对应 -90.0 -> 90.0 度 
		int16_t roll  解算后得到的横滚角度,单位0.1度。 -1800 -> 1800 对应 -180.0  ->  180.0度 
		int16_t alt   气压高度。 单位0.1米。  范围一个整型变量 
		int16_t tempr 温度 。 单位0.1摄氏度   范围:直到你的电路板不能正常工作 
		int16_t press 气压压力。单位10Pa  一个大气压强在101300pa 这个已经超过一个整型的范围。需要除以10再发给上位机 
		int16_t IMUpersec  姿态解算速率。运算IMUpersec每秒。 
输出参数:没有	 
*******************************************************************************/ 
void UART1_ReportIMU(int16_t yaw,int16_t pitch,int16_t roll 
,int16_t alt,int16_t tempr,int16_t press,int16_t IMUpersec) 
{ 
 	unsigned int temp=0xaF+2; 
	char ctemp; 
	UART1_Put_Char(0xa5); 
	UART1_Put_Char(0x5a); 
	UART1_Put_Char(14+2); 
	UART1_Put_Char(0xA1); 
 
	if(yaw<0)yaw=32768-yaw; 
	ctemp=yaw>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=yaw; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(pitch<0)pitch=32768-pitch; 
	ctemp=pitch>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=pitch; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(roll<0)roll=32768-roll; 
	ctemp=roll>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=roll; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(alt<0)alt=32768-alt; 
	ctemp=alt>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=alt; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(tempr<0)tempr=32768-tempr; 
	ctemp=tempr>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=tempr; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(press<0)press=32768-press; 
	ctemp=press>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=press; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	UART1_Put_Char(temp%256); 
	UART1_Put_Char(0xaa); 
} 
 
/**************************实现函数******************************************** 
*函数原型:		void UART1_ReportMotion(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz, 
					int16_t hx,int16_t hy,int16_t hz) 
*功  能:		向上位机发送当前传感器的输出值 
输入参数: 
	int16_t ax  加速度 X轴ADC输出 范围 :一个有符号整型 
	int16_t ay  加速度 Y轴ADC输出 范围 :一个有符号整型 
	int16_t az  加速度 Z轴ADC输出 范围 :一个有符号整型 
	int16_t gx  陀螺仪 X轴ADC输出 范围 :一个有符号整型 
	int16_t gy  陀螺仪 Y轴ADC输出 范围 :一个有符号整型 
	int16_t gz  陀螺仪 Z轴ADC输出 范围 :一个有符号整型 
	int16_t hx  磁罗盘 X轴ADC输出 范围 :一个有符号整型 
	int16_t hy  磁罗盘 Y轴ADC输出 范围 :一个有符号整型 
	int16_t hz  磁罗盘 Z轴ADC输出 范围 :一个有符号整型 
	 
输出参数:没有	 
*******************************************************************************/ 
void UART1_ReportMotion(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz, 
					int16_t hx,int16_t hy,int16_t hz) 
{ 
 	unsigned int temp=0xaF+9; 
	char ctemp; 
	UART1_Put_Char(0xa5); 
	UART1_Put_Char(0x5a); 
	UART1_Put_Char(14+8); 
	UART1_Put_Char(0xA2); 
 
	if(ax<0)ax=32768-ax; 
	ctemp=ax>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=ax; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(ay<0)ay=32768-ay; 
	ctemp=ay>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=ay; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(az<0)az=32768-az; 
	ctemp=az>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=az; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(gx<0)gx=32768-gx; 
	ctemp=gx>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=gx; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(gy<0)gy=32768-gy; 
	ctemp=gy>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=gy; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
//------------------------- 
	if(gz<0)gz=32768-gz; 
	ctemp=gz>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=gz; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(hx<0)hx=32768-hx; 
	ctemp=hx>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=hx; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(hy<0)hy=32768-hy; 
	ctemp=hy>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=hy; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	if(hz<0)hz=32768-hz; 
	ctemp=hz>>8; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
	ctemp=hz; 
	UART1_Put_Char(ctemp); 
	temp+=ctemp; 
 
	UART1_Put_Char(temp%256); 
	UART1_Put_Char(0xaa); 
} 
 
//------------------------------------------------------ 
void USART1_IRQHandler(void) 
{ 
   
  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) 
  {    
    /* Write one byte to the transmit data register */ 
    USART_SendData(USART1, TxBuffer[TxCounter++]);                     
 
    /* Clear the USART1 transmit interrupt */ 
    USART_ClearITPendingBit(USART1, USART_IT_TXE);  
 
    if(TxCounter == count) 
    { 
      /* Disable the USART1 Transmit interrupt */ 
      USART_ITConfig(USART1, USART_IT_TXE, DISABLE); 
    }     
  } 
 
} 
 
 
//------------------End of File----------------------------