标题:
移植官方例程STM32F4到F1,基于stm32f103ze+mpu9250通过官方DMP库串口输出角度。
[打印本页]
作者:
461534727
时间:
2019-7-10 10:46
标题:
移植官方例程STM32F4到F1,基于stm32f103ze+mpu9250通过官方DMP库串口输出角度。
移植官方例程F4到F1,基于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!!!\r\n");
}
}while(status);
printf("Initialization--MPU9250 OK!!!\r\n");
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:\t\t%8.2f\r\n roll:\t\t%8.2f\r\n yaw:\t\t%8.2f\r\n",pitch_dmp,roll_dmp,yaw_dmp);
printf("%.3f|%.3f|%.3f|%.3f|%.1d\n",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! ###\r\n");
delay_ms(10);
}
}
}
}
int fputc(int ch,FILE *p)
{
USART_SendData(USART2,(u8)ch);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
return ch;
}
复制代码
所有资料51hei提供下载:
MPU9250.7z
(441.99 KB, 下载次数: 274)
2019-7-14 21:59 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
会飞的盆子君
时间:
2019-8-8 23:01
楼主大大,这个把这些代码加到F4编好的代码中就能适合F1用嘛?
作者:
心学习
时间:
2019-10-9 17:22
谢谢,参考下
作者:
ontheroad
时间:
2019-10-10 08:56
移植的话,主要是解决寄存器映射的问题。
作者:
ep小飞
时间:
2019-12-2 10:50
老哥,菜鸡求帮助啊,能否给个扣扣请教啊?谢谢
作者:
ep小飞
时间:
2019-12-2 10:51
老哥,菜鸡求帮助啊
作者:
c106czs
时间:
2019-12-31 11:44
感谢楼主分享,下载来学习一下!
作者:
wxdx8320
时间:
2020-1-17 14:22
很少的资源哦,谢谢楼主
作者:
duyi324
时间:
2020-1-18 09:34
很少的资源哦,谢谢楼主
作者:
duyi324
时间:
2020-1-28 11:04
大佬,我这老卡在加载固件那里,网上发现好多人都是这个问题,请问能怎么解决?就是memcmp函数
作者:
wenqian
时间:
2020-3-1 12:21
厉害的大佬 不知道能否移植到103c8t6 我试试
作者:
网侠
时间:
2022-7-17 00:00
很不错,很有参考意义,非常感谢。
作者:
cmb2
时间:
2023-2-15 17:01
最近正在研究这个,作技术储备。非常感谢分享。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1