最近用CubeMX配置串口直接接收GY-25/pu6050角度传感器的数值,分享一下。
此次硬件采用STM32F103ZET6。其他类型芯片配置类似,都可以通用。
1、查看传感器手册。
(1)其串口通信。115200bps;无校验位;8位数据位;1的停止位。
(2)串口发送的数据格式:
(3)发送的命令
2、配置CubeMX
基础的配置这里就不赘述,主要截图了串口的配置,和普通串口通信配置相同。我这里配置了UART5。
开启中断
3、软件上
(1)定义串口接收的缓冲、数据接收和三个角度等。
#define USART_REC_LEN 200
uint8_t Res;
uint8_t UART5_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.(一般给200,接收数据量大就增加)
uint16_t UART5_RX_STA; //接收状态标记,可根据不同的串口改名字
float YAW=0,PITCH=0,ROLL=0;
int16_t Data[3]; //数据暂时存储
(2)在main函数或任务中开启串口接收,向传感器发送命令,这里以自动模式举例。
HAL_UART_Receive_IT(&huart5, &Res, 1); //开启接收
uint8_t command[2]={0xa5,0x52}; //定义命令 根据手册,这里是自动模式
HAL_UART_Transmit_IT(&huart5,(uint8_t *)command,2); //发送命令 2是两个数据位的意思
(3)命令发送过后,传感器就会开始发送数据。
我们定义串口中断回调函数,并在里面编写中断处理函数。因为数据量不大,我直接将数据处理写在这里了。
注意:因为时间比较急,这里的接收处理函数肯定有bug,不过能用,如果有大佬改一下就更好了,同时我也并未启用DMA。现在这个程序就是两个字:能用。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* 判断是哪个串口触发的中断 */
if(huart ->Instance == UART5)
{
if((UART5_RX_STA&0x8000)==0)//接收未完成
{
//读取接收到的数据
if(Res==0x0D)
{
UART5_RX_STA|=0x8000;
HAL_UART_Receive_IT(&huart5, &Res, 1);
}
else
{
UART5_RX_BUF[UART5_RX_STA&0X3FFF]=Res ;
UART5_RX_STA++;
if(UART5_RX_STA>(USART_REC_LEN-1))
UART5_RX_STA=0;
}
}
if(!(UART5_RX_BUF[0]==0xaa))
{
UART5_RX_STA=0;
}
if(UART5_RX_STA>=8)
{
if(UART5_RX_BUF[7]==0x55&&UART5_RX_BUF[0]==0xaa)
{
Data[0]=(UART5_RX_BUF[1]<<8|UART5_RX_BUF[2]);//数据暂存
Data[1]=(UART5_RX_BUF[3]<<8|UART5_RX_BUF[4]);
Data[2]=(UART5_RX_BUF[5]<<8|UART5_RX_BUF[6]);
YAW=(float)Data[0]/100; //数据除100
PITCH=(float)Data[1]/100;
ROLL=(float)Data[2]/100;
}
UART5_RX_STA=0;
UART5_RX_BUF[0]=0;
}
HAL_UART_Receive_IT(huart,&Res,1);
}
}