单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 489|回复: 3
收起左侧

移植官方例程STM32F4到F1,基于stm32f103ze+mpu9250通过官方DMP库串口输出角度。

[复制链接]
461534727 发表于 2019-7-10 10:46 | 显示全部楼层 |阅读模式
移植官方例程F4到F1,基于stm32f103ze+mpu9250通过官方DMP库串口输出角度,感谢众多开源大佬

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "stdio.h"
  3. #include "UART1.h"
  4. #include "systick.h"
  5. // mpu9250 include files
  6. #include "sys.h"
  7. #include "mpu9250.h"
  8. #include "mpuiic.h"
  9. #include "inv_mpu.h"
  10. #include "inv_mpu_dmp_motion_driver.h"
  11. float Q0,Q1,Q2,Q3;             // 欧拉角
  12. u32 status2=0;
  13. void printf_init()        //printf初始化
  14. {
  15.         GPIO_InitTypeDef GPIO_InitStructure;        //声明一个结构体变量,用来初始化GPIO
  16.         NVIC_InitTypeDef NVIC_InitStrue;//定义中断相关结构体
  17.         USART_InitTypeDef  USART_InitStructure;          //串口结构体定义

  18.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);
  19.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

  20.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//TX
  21.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  22.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  23.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  24.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//RX
  25.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  26.         GPIO_Init(GPIOA,&GPIO_InitStructure);

  27.         USART_InitStructure.USART_BaudRate=115200;   //波特率设置为9600
  28.         USART_InitStructure.USART_WordLength=USART_WordLength_8b;
  29.         USART_InitStructure.USART_StopBits=USART_StopBits_1;
  30.         USART_InitStructure.USART_Parity=USART_Parity_No;
  31.         USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  32.         USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
  33.         USART_Init(USART2,&USART_InitStructure);
  34.         USART_Cmd(USART2, ENABLE);
  35.        
  36.         USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//使能或者失能指定的USART中断 接收中断
  37.         USART_ClearFlag(USART2,USART_FLAG_TC);//清除USARTx的待处理标志位
  38.        
  39.   NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;//定义中断通道
  40.   NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//开启中断通道
  41.   NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//设定抢占优先级为1
  42.   NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//设定子优先级为1
  43.   NVIC_Init(&NVIC_InitStrue);//中断初始化
  44. }
  45. void USART2_IRQHandler(void)//编写中断处理函数
  46. {
  47.     u8 res;//无符号字符res   
  48.    if(USART_GetITStatus(USART2,USART_IT_RXNE))//接收数据进入中断,判断串口1接收缓存器非空使能为1与否
  49. {
  50.      res= USART_ReceiveData(USART2); //为1,则将串口1的数据给变量
  51.          if(res==0x10)//等待
  52.          {  
  53.                   USART_SendData(USART2,'1');               
  54.                         while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
  55.                  USART_SendData(USART2,'0');               
  56.                         while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
  57.                  EXTI->IMR |= EXTI_Line0;//使能外部中断4
  58.                  EXTI->IMR |= EXTI_Line3;//使能外部中断4
  59.                  EXTI->IMR |= EXTI_Line4;//使能外部中断4
  60.                  EXTI->IMR |= EXTI_Line5;//使能外部中断4
  61.                  status2=0;         
  62.          }
  63.    else if(res==0x11)//小孩
  64.          {
  65.      EXTI->IMR &= ~(EXTI_Line0);// 屏蔽外部中断0
  66.                  EXTI->IMR &= ~(EXTI_Line3);// 屏蔽外部中断3
  67.                  EXTI->IMR &= ~(EXTI_Line4);// 屏蔽外部中断4
  68.                  EXTI->IMR &= ~(EXTI_Line5);// 屏蔽外部中断5
  69.                   status2=1;                         
  70.          }
  71.           else if(res==0x13)//校准
  72.                 {  
  73.                         mpu_dmp_init();
  74.                         if(mpu_dmp_init()==0)
  75.                                 printf("13");
  76.                          while(mpu_dmp_init())
  77.                          {
  78.                                  mpu_dmp_init();
  79.                                  if(mpu_dmp_init()==0)
  80.                                 printf("13");
  81.                          }
  82.                 }
  83.         }
  84. }
  85. void Led_Configuration(void)
  86. {
  87.         GPIO_InitTypeDef GPIO_InitStructure;
  88.        
  89.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB, ENABLE);

  90.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                         //PE5接
  91.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //设为推挽输出模式
  92.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                
  93.         GPIO_Init(GPIOE, &GPIO_InitStructure);                         //初始化外设GPIO
  94.   GPIO_SetBits(GPIOE,GPIO_Pin_5);
  95. }
  96. int main(void)
  97. {
  98.     u8 status;
  99.     float pitch_dmp,roll_dmp,yaw_dmp;             // 欧拉角
  100.            delay_ms(1000);
  101.          delay_ms(1000);
  102.     Initial_UART1(115200);
  103.    Led_Configuration();
  104.     printf_init();       
  105.     delay_ms(1000);
  106.     // MPU9250姿态传感器初始化
  107.     do{
  108.         status = mpu_dmp_init();
  109.         if(status)
  110.         {
  111.             printf("Initialization--MPU9250 Error!!!\r\n");
  112.         }
  113.     }while(status);
  114.     printf("Initialization--MPU9250 OK!!!\r\n");
  115.     while(1)
  116.     {     status= mpu_mpl_get_data(&pitch_dmp,&roll_dmp,&yaw_dmp);
  117.         //status=mpu_dmp_get_data(&pitch_dmp,&roll_dmp,&yaw_dmp);
  118.         if(!status)
  119.         {
  120.                                         if(status2==1)
  121.                                         {    //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);
  122.                                 printf("%.3f|%.3f|%.3f|%.3f|%.1d\n",Q0,Q1,Q2,Q3,GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2));//四元数
  123.           //GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5))); //引脚取反       
  124.             //delay_ms(10);
  125.         }
  126.         else
  127.         {
  128.            // printf("### Get Eulerian angle failed! ###\r\n");
  129.                                         delay_ms(10);
  130.         }
  131.     }
  132. }

  133. }
  134. int fputc(int ch,FILE *p)
  135. {
  136.         USART_SendData(USART2,(u8)ch);       
  137.         while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
  138.         return ch;
  139. }
复制代码

所有资料51hei提供下载:
MPU9250.7z (441.99 KB, 下载次数: 34)
回复

使用道具 举报

会飞的盆子君 发表于 2019-8-8 23:01 | 显示全部楼层
楼主大大,这个把这些代码加到F4编好的代码中就能适合F1用嘛?
回复

使用道具 举报

心学习 发表于 2019-10-9 17:22 | 显示全部楼层
谢谢,参考下
回复

使用道具 举报

ontheroad 发表于 2019-10-10 08:56 | 显示全部楼层
移植的话,主要是解决寄存器映射的问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表