UART2.c(参考匿名的)

来源:互联网 发布:cetv4 网络回看 编辑:程序博客网 时间:2024/06/01 17:29
#include "UART2.h"#include "CONTROL.h"#include "stm32f10x.h"#include "Uart1.h"#include "MPU6050iic.h"RC_GETDATA Rc_Get;//接收到的RC数据,1000~2000float RC_Target_ROL=0,RC_Target_PIT=0,RC_Target_YAW=0;int arm=0;/************************* 飞控与手机APP的通讯 **************************************/                      /*********串口2的初始化函数***********/void Uart2_Init(u32 br_num)//时钟低电平活动,禁用了同步通讯,因此只有Uart,即只是异步通讯{    USART_InitTypeDef USART_InitStructure;    USART_ClockInitTypeDef USART_ClockInitStruct;    GPIO_InitTypeDef GPIO_InitStructure;    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //开启USART1时钟    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);        //配置PA2作为USART1 Tx    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    GPIO_Init(GPIOA , &GPIO_InitStructure);    //配置PA3作为USART1 Rx    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    GPIO_Init(GPIOA , &GPIO_InitStructure);    //配置USART1    //中断被屏蔽了    USART_InitStructure.USART_BaudRate = br_num;       //波特率可以通过地面站配置    USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //8位数据    USART_InitStructure.USART_StopBits = USART_StopBits_1;   //在帧结尾传输1个停止位    USART_InitStructure.USART_Parity = USART_Parity_No;    //禁用奇偶校验    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制失能    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;  //发送、接收使能    //配置USART1时钟    USART_ClockInitStruct.USART_Clock = USART_Clock_Disable;  //时钟低电平活动    USART_ClockInitStruct.USART_CPOL = USART_CPOL_Low;  //SLCK引脚上时钟输出的极性->低电平    USART_ClockInitStruct.USART_CPHA = USART_CPHA_2Edge;  //时钟第二个边沿进行数据捕获    USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable; //最后一位数据的时钟脉冲不从SCLK输出    USART_Init(USART2, &USART_InitStructure);    USART_ClockInit(USART2, &USART_ClockInitStruct);    //使能USART1接收中断    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);    //使能USART1    USART_Cmd(USART2, ENABLE); }                    uint8_t Tx2Buffer[0xff];u8 Tx2Counter=0;u8 count2=32; u8 Rx2_Buf[2][32];  //两个32字节的串口接收缓存u8 Rx2_Act=0;       //正在使用的buf号u8 Rx2_Adr=0;       //正在接收第几字节u8 Rx2_Ok0 = 0;u8 Rx2_Ok1 = 0;/**************************串口1的收发中断********************************************/void Uart2_IRQ(void)//与PC上位机的通讯{     u8 com_data;    if(USART2->SR & USART_IT_ORE)    {         com_data=USART2->SR;    }               /****************接收中断 (接收寄存器非空)************/     //接收中断 (接收寄存器非空)     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)        {           arm=0;        //别忘了,只要接收到数据就是解锁(即APP连接了蓝牙)         com_data = USART2->DR;        if(Rx2_Adr==0)      //寻找帧头0X8A        {            if(com_data==0xAA)  //接收数据如果是0X8A,则写入缓存            {                Rx2_Buf[Rx2_Act][0] = com_data;                Rx2_Adr = 1;            }        }        else        //正在接收数据        {            Rx2_Buf[Rx2_Act][Rx2_Adr] = com_data;            Rx2_Adr ++;        }        if(Rx2_Adr==25)     //数据接收完毕//如果adr等于了32,                                         //那么这次act=0的数据接收完成,切换缓存到act=1;        {            Rx2_Adr = 0;            if(Rx2_Act)             {                 Rx2_Ok1 = 1;        //标志act=1的数组接收完成                Rx2_Act = 0;            //切换缓存,去接收act=0的数组            }            else                            {                Rx2_Act = 1;                Rx2_Ok0 = 1;            }        }        USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清除接收中断标志位  }}/**********************************串口接收的缓存数据de分析*********************************/void Uart2_DataAnl(u8 buf_num)      //{    u8 sum = 0,i=0;    if(Rx2_Buf[buf_num][1]!=0xAF)       return;     //检验第二位是不是AF    if(Rx2_Buf[buf_num][2]==0x03)//下面进行对遥控数据的处理,应该在Uart2蓝牙  //判断功能字,=0x,为遥控数据    {        for(i=0;i<24;i++) //判断校验字节是否正确      sum += Rx2_Buf[buf_num][i];   //sum是8位,自动截取最后8位      if(!(sum==Rx2_Buf[buf_num][24]))      return;     //判断sum        Rc_Get.THROTTLE = (vs16)(Rx2_Buf[buf_num][4]<<8)|Rx2_Buf[buf_num][5];   //首先进行8位数据的合并成16位赋值给遥控变量        Rc_Get.YAW          = (vs16)(Rx2_Buf[buf_num][6]<<8)|Rx2_Buf[buf_num][7];        Rc_Get.ROLL         = (vs16)(Rx2_Buf[buf_num][8]<<8)|Rx2_Buf[buf_num][9];        Rc_Get.PITCH        = (vs16)(Rx2_Buf[buf_num][10]<<8)|Rx2_Buf[buf_num][11];        Rc_Get.AUX1         = (vs16)(Rx2_Buf[buf_num][12]<<8)|Rx2_Buf[buf_num][13];        Rc_Get.AUX2         = (vs16)(Rx2_Buf[buf_num][14]<<8)|Rx2_Buf[buf_num][15];        RC_Target_ROL = (1500-Rc_Get.ROLL)/30;    //可以调遥控的灵敏度,一打杆偏大了,把30改大        RC_Target_PIT = (1500-Rc_Get.PITCH)/30;   //要改变的RC_Target就变小了        RC_Target_YAW = (Rc_Get.YAW-1500)/30;    }  if(Rx2_Buf[buf_num][2]==0x01)        {        if(Rx2_Buf[buf_num][4]==0xA0)   {ARMED = 0;TxCounter=0;Uart1_Send_ARMED();}        if(Rx2_Buf[buf_num][4]==0xA1)   {ARMED = 1;TxCounter=0;Uart1_Send_ARMED();}      }     }void Uart2_RXCheckEvent(void){     //USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//处理某一组数据时不能被UART2的接收中断打断    //因为UART2的中断优先级低于定时器中断,所以在执行定时器中断的程序(即Uart2_RXCheckEvent())时,    //不可能被UART2的接收中断所打断    if(Rx2_Ok0)    {        Rx2_Ok0 = 0;        Uart2_DataAnl(0);    }    if(Rx2_Ok1)    {        Rx2_Ok1 = 0;        Uart2_DataAnl(1);    }    //USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //重新打开接收中断}/******************************************************************************************/
原创粉丝点击