STM32F407VET6 学习笔记4:最简读取JY901B陀螺仪数据_串口状态机程序

今日继续学习使用嘉立创购买的 立创梁山派天空星,芯片是 STM32F407VET6

文章目的是编写最简的状态机读取JY901陀螺仪数据:读取三轴角度值

粗略数了一下,大概使用了48行代码......

文章提供测试代码讲解、完整工程下载、测试效果图

目录

上位机设置JY901B:

 硬件连接:

代码程序设计:

整体代码结构例程展示:

 测试效果图:

整体工程下载:

 网上查阅资料贴出:


 

上位机设置JY901B:

我手上的是亚博智能的JY901B陀螺仪模块,然后我在上位机将其设置如下:

回传速率100HZ

 

 硬件连接:

硬件连接方面:我们其实 只需要开通STM32的一个串口就可以进行测试了

按照正常想法必定是一个串口接收JY901数据,使用另一个串口接 USB转串口模块 来上传数据给电脑测试

但我们仔细研究会发现,STM32只需串口接收JY901数据,USB转串口模块只需串口接收STM32反馈,因此只需 STM32 RX接JY901B TX ,USB转串口模块 RX接STM32 TX 这样只需开通一个串口即可完成这个简单的解算JY901串口数据的实验了

STM32F407VET6JY901B陀螺仪USB转串口模块(接电脑测试)
TXRX悬空RX接STM32 TX
RX接JY901B TXTX接STM32 RXTX悬空
VCCVCCVCC
GNDGNDGND

 

代码程序设计:

 以下部分放于程序声明部分,包含了必要的变量与函数声明:

最终解算出的角度数据会存放在 float Angle_R[3]; 数组中


uint8_t RX_BUFFER[10];

typedef struct
{
	float angle[3];
}Angle;

struct SAngle//角度
{
	short Angle[3];
	short T;
};

struct SAngle stcAngle;
float Angle_R[3];

void JY901_Process(uint8_t RxData);

以下函数在串口中断中调用,将串口收到的每个字节传给他:

例:


void JY901_Process(uint8_t RxData)
{
	static uint8_t state=0;
	static uint8_t bufsize=0;
	
	switch(state)
	{
		case 0:
						//搜索到帧头
						if(RxData==0x55)	{ state=1;}
						else state=0;
						break;
		case 1:
					 //搜索到角度帧
					  if(RxData==0x53)	{ state=2;}
						else state=0; //否则重新搜素
						break;
		case 2:
					 RX_BUFFER[bufsize]=RxData;
					 bufsize++;
					 if(bufsize==9)
					 {
							state=3;
						  bufsize=0;
					 }
					 break;
		case 3:
						memcpy(&stcAngle,&RX_BUFFER[0],8);
						for(uint8_t j = 0; j < 3; j++)
							{
								Angle_R[j] = (float)stcAngle.Angle[j]/32768*180;
							}
					  state = 0;
						break;
	}
	
}

 

整体代码结构例程展示:

主函数代码基本如下:

#include "board.h"
#include "bsp_uart.h"
#include <stdio.h>
#include "stdarg.h"      //自定义printf需要使用
#include "stdio.h"       //1.61328125kb
#include "Timer.h"
#include <string.h>


uint8_t RX_BUFFER[10];

typedef struct
{
	float angle[3];
}Angle;

struct SAngle//角度
{
	short Angle[3];
	short T;
};

struct SAngle stcAngle;
float Angle_R[3];

void JY901_Process(uint8_t RxData);

int main(void)
{
	board_init();
	uart1_init(115200);	                          //初始化串口波特率115200
	while(1)
	{
		printf("X=%f  Y=%f  Z=%f\r\n",Angle_R[0],Angle_R[1],Angle_R[2]);
		delay_ms(300);
	}
}

/******** 串口1 中断服务函数 ***********/
void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)//判断是不是真的有中断发生
	{
		//USART_SendData(USART1,USART_ReceiveData(USART1));//又将数据发回去(用于验证)
		
		JY901_Process(USART_ReceiveData(USART1));
		
		USART_ClearITPendingBit(USART1, USART_IT_RXNE); //已经处理就清楚标志位 
	}  
}


void JY901_Process(uint8_t RxData)
{
	static uint8_t state=0;
	static uint8_t bufsize=0;
	
	switch(state)
	{
		case 0:
						//搜索到帧头
						if(RxData==0x55)	{ state=1;}
						else state=0;
						break;
		case 1:
					 //搜索到角度帧
					  if(RxData==0x53)	{ state=2;}
						else state=0; //否则重新搜素
						break;
		case 2:
					 RX_BUFFER[bufsize]=RxData;
					 bufsize++;
					 if(bufsize==9)
					 {
							state=3;
						  bufsize=0;
					 }
					 break;
		case 3:
						memcpy(&stcAngle,&RX_BUFFER[0],8);
						for(uint8_t j = 0; j < 3; j++)
							{
								Angle_R[j] = (float)stcAngle.Angle[j]/32768*180;
							}
					  state = 0;
						break;
	}
	
}

 测试效果图:

 

整体工程下载:

https://download.csdn.net/download/qq_64257614/89615417

 网上查阅资料贴出:

STM32应用(七)JY901九轴姿态模块(串口DMA空闲中断和I2C通信)-CSDN博客

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NULL指向我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值