linux串口读取mpu9250数据,基于stm32f103ze+mpu9250通过官方DMP库串口输出角度

单片机源程序如下:

#include "stm32f10x.h"

#include "stdio.h"

#include "UART1.h"

#include "systick.h"

// mpu9250 include files

#include "sys.h"

#include "mpu9250.h"

#include "mpuiic.h"

#include "inv_mpu.h"

#include "inv_mpu_dmp_motion_driver.h"

float Q0,Q1,Q2,Q3;             // 欧拉角

u32 status2=0;

void printf_init()        //printf初始化

{

GPIO_InitTypeDef GPIO_InitStructure;        //声明一个结构体变量,用来初始化GPIO

NVIC_InitTypeDef NVIC_InitStrue;//定义中断相关结构体

USART_InitTypeDef  USART_InitStructure;          //串口结构体定义

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//TX

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//RX

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

USART_InitStructure.USART_BaudRate=115200;   //波特率设置为9600

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;

USART_Init(USART2,&USART_InitStructure);

USART_Cmd(USART2, ENABLE);

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//使能或者失能指定的USART中断 接收中断

USART_ClearFlag(USART2,USART_FLAG_TC);//清除USARTx的待处理标志位

NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;//定义中断通道

NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//开启中断通道

NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//设定抢占优先级为1

NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//设定子优先级为1

NVIC_Init(&NVIC_InitStrue);//中断初始化

}

void USART2_IRQHandler(void)//编写中断处理函数

{

u8 res;//无符号字符res

if(USART_GetITStatus(USART2,USART_IT_RXNE))//接收数据进入中断,判断串口1接收缓存器非空使能为1与否

{

res= USART_ReceiveData(USART2); //为1,则将串口1的数据给变量

if(res==0x10)//等待

{

USART_SendData(USART2,'1');

while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);

USART_SendData(USART2,'0');

while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);

EXTI->IMR |= EXTI_Line0;//使能外部中断4

EXTI->IMR |= EXTI_Line3;//使能外部中断4

EXTI->IMR |= EXTI_Line4;//使能外部中断4

EXTI->IMR |= EXTI_Line5;//使能外部中断4

status2=0;

}

else if(res==0x11)//小孩

{

EXTI->IMR &= ~(EXTI_Line0);// 屏蔽外部中断0

EXTI->IMR &= ~(EXTI_Line3);// 屏蔽外部中断3

EXTI->IMR &= ~(EXTI_Line4);// 屏蔽外部中断4

EXTI->IMR &= ~(EXTI_Line5);// 屏蔽外部中断5

status2=1;

}

else if(res==0x13)//校准

{

mpu_dmp_init();

if(mpu_dmp_init()==0)

printf("13");

while(mpu_dmp_init())

{

mpu_dmp_init();

if(mpu_dmp_init()==0)

printf("13");

}

}

}

}

void Led_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                         //PE5接

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //设为推挽输出模式

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOE, &GPIO_InitStructure);                         //初始化外设GPIO

GPIO_SetBits(GPIOE,GPIO_Pin_5);

}

int main(void)

{

u8 status;

float pitch_dmp,roll_dmp,yaw_dmp;             // 欧拉角

delay_ms(1000);

delay_ms(1000);

Initial_UART1(115200);

Led_Configuration();

printf_init();

delay_ms(1000);

// MPU9250姿态传感器初始化

do{

status = mpu_dmp_init();

if(status)

{

printf("Initialization--MPU9250 Error!!!rn");

}

}while(status);

printf("Initialization--MPU9250 OK!!!rn");

while(1)

{     status= mpu_mpl_get_data(&pitch_dmp,&roll_dmp,&yaw_dmp);

//status=mpu_dmp_get_data(&pitch_dmp,&roll_dmp,&yaw_dmp);

if(!status)

{

if(status2==1)

{    //printf("pitch:tt%8.2frn  roll:tt%8.2frn  yaw:tt%8.2frn",pitch_dmp,roll_dmp,yaw_dmp);

printf("%.3f|%.3f|%.3f|%.3f|%.1dn",Q0,Q1,Q2,Q3,GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2));//四元数

//GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5))); //引脚取反

//delay_ms(10);

}

else

{

// printf("### Get Eulerian angle failed! ###rn");

delay_ms(10);

}

}

}

}

int fputc(int ch,FILE *p)

{

USART_SendData(USART2,(u8)ch);

while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);

return ch;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值