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); //重新打开接收中断}/******************************************************************************************/
阅读全文
0 0
- UART2.c(参考匿名的)
- CONTROL.c(参考匿名的)
- IMU.c(参考匿名的)
- MOTO.c(参考匿名的)
- MPU6050.c(参考匿名的)
- MPU6050iic.c(参考匿名的)
- RC.c(参考匿名的)
- UART1.c(参考匿名的)
- usart.c(参考匿名的)
- main.c和stm32f10x_it.c(参考匿名的)
- 自己动手写的UART2驱动
- 如何把wince Sate210 的调试串口(com3-uart2)改成普通串口
- wince Sate210 的调试串口(com3-uart2)改成普通串口
- LPC17xx Uart0,Uart1,Uart2,Uart3的区别
- LPC23XX的PCONP与UART2和UART3
- STM32 UART2 中断函数的写法
- C语言的内存分配(参考)
- C + +的袖珍参考
- HDOJ 3336 Count the string
- R语言ggplot2条形图详解
- UART1.c(参考匿名的)
- 计算导论与C语言基础week10_2
- zookeeper 安装
- UART2.c(参考匿名的)
- Android-Studio-gradle版本出错问题
- 1008: 美元和人民币
- usart.c(参考匿名的)
- 正则表达式全解
- 【步兵 cocos2dx】加密和混淆
- 通过继承来扩展接口
- 1009: 求平均分
- Unity ResUpdater研究使用2