找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2444|回复: 1
收起左侧

自己移植的FreeRTOS+MPU6050姿态测试代码

[复制链接]
ID:640600 发表于 2021-11-20 17:52 | 显示全部楼层 |阅读模式
自己学习FreeRTOS和MPU6050时写的一个姿态测试程序,希望有大佬发表相关意见!仅仅是做了一些简单的测试!!!  但是Row角的偏移有点大!!!
51hei截图20211120175626.png

单片机源程序如下:
  1. /*
  2. *************************************************************************
  3. *                             包含的头文件
  4. *************************************************************************
  5. */
  6. /* 系统标准头文件 */
  7. #include <string.h>          //字符串操作相关函数
  8. #include <stdio.h>           //标准输入输出
  9. #include <limits.h>          //高等大数据定义
  10. #include <stdlib.h>          //内存操作相关函数

  11. /* FreeRTOS头文件 */
  12. #include "FreeRTOS.h"         //FreeRTOS系统配置头文件
  13. #include "task.h"             //创建任务头文件
  14. #include "queue.h"            //内核队列头文件
  15. #include "semphr.h"           //信号量头文件
  16. #include "event_groups.h"     //事件处理头文件
  17. #include "list.h"             //链表头文件
  18.         

  19. /* 开发板硬件bsp头文件 */
  20. #include "stm32f10x.h"
  21. #include "delay.h"
  22. #include "usart.h"
  23. #include "bsp_usart.h"
  24. #include "bsp_led.h"
  25. #include "bsp_key.h"
  26. //#include "bsp_i2c_ee.h"  //软件I2C通讯底层
  27. //#include "bsp_i2c_gpio.h"//软件I2C通讯底层IO口
  28. //#include "bsp_i2c_ee.h"    //硬件I2C底层
  29. #include "bsp_TiMbase.h"   
  30. #include "bsp_AdvanceTim.h"
  31. #include "mpu6050.h"
  32. #include "mpu6050_app.h"
  33. #include "inv_mpu.h"
  34. #include "inv_mpu_dmp_motion_driver.h"

  35. /**************************** 任务块 ********************************/
  36. /*   仿照正点原子的按照任务的相关性来进行声明和定义所有的类型等变量
  37. *
  38. */
  39. /* 创建任务函数句柄 */
  40. static TaskHandle_t AppTaskCreate_Handle=NULL;
  41. /* 创建任务函数堆栈大小 */
  42. #define AppTask_STK_SIZE  512
  43. /* 创建任务函数任务优先级 */
  44. #define AppTask_TASK_PRIO  1
  45. /* 创建任务函数声明 */
  46. static void AppTaskCreate(void);/* 用于创建任务 */

  47. /* Work任务函数句柄 */
  48. static TaskHandle_t Work_TaskHandle=NULL;
  49. /* Work任务函数堆栈大小 */
  50. #define Work_STK_SIZE  512
  51. /* Work任务函数任务优先级 */
  52. #define Work_TASK_PRIO  2
  53. /* Work任务函数声明 */
  54. static void Work_Task(void* parameter);/* Work任务相关任务 */

  55. // /* Receive2任务函数句柄 */
  56. //static TaskHandle_t Receive2_TaskHandle=NULL;
  57. // /* Receive2任务函数堆栈大小 */
  58. //#define Receive2_STK_SIZE  512
  59. // /* Receive2任务函数任务优先级 */
  60. //#define Receive2_TASK_PRIO  3
  61. // /* Receive2任务函数声明 */
  62. //static void Receive2_Task(void* parameter);/* Receive2任务相关任务 */

  63. // /* KEY任务函数句柄 */
  64. //static TaskHandle_t KEY_TaskHandle=NULL;
  65. // /* KEY任务函数堆栈大小 */
  66. //#define KEY_STK_SIZE  512
  67. // /* KEY任务函数任务优先级 */
  68. //#define KEY_TASK_PRIO  3
  69. // /* KEY任务函数声明 */
  70. //static void KEY_Task(void* parameter);/* KEY任务 */


  71. /**************************** 任务句柄 ********************************/
  72. /*
  73. * 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
  74. * 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
  75. * 这个句柄可以为NULL。
  76. */

  77. /********************************** 内核对象句柄 *********************************/
  78. /*
  79. * 信号量,消息队列,事件标志组,软件定时器这些都属于内核的对象,要想使用这些内核
  80. * 对象,必须先创建,创建成功之后会返回一个相应的句柄。实际上就是一个指针,后续我
  81. * 们就可以通过这个句柄操作这些内核对象。
  82. *
  83. * 内核对象说白了就是一种全局的数据结构,通过这些数据结构我们可以实现任务间的通信,
  84. * 任务间的事件同步等各种功能。至于这些功能的实现我们是通过调用这些内核对象的函数
  85. * 来完成的
  86. *
  87. */

  88. /******************************* 宏定义 ************************************/
  89. /*
  90. * 当我们在写应用程序的时候,可能需要用到一些宏定义。
  91. */


  92. /******************************* 全局变量声明 ************************************/
  93. /* 当我们在写应用程序的时候,可能需要用到一些全局变量。
  94. */

  95. /*
  96. *************************************************************************
  97. *                             函数声明
  98. *************************************************************************
  99. */
  100. static void BSP_Init(void);/* 硬件初始化 */


  101. /* 裸机驱动测试主函数 */
  102. //int main(void)
  103. //{
  104. //        delay_init();                    //延时函数初始化          
  105. //        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  106. //        uart_init(115200);                 //串口初始化为115200
  107. //       
  108. //        DHT11_Init();       //DHT11初始化
  109. //        while(1)
  110. //        {
  111. //                DHT11_Read_Data(&temperature,&humidity);
  112. //                printf("%0.2d℃ %0.2d%%\r\n",temperature,humidity);
  113. //                delay_ms(1000);       
  114. //        }
  115. //}

  116. /*****************************************************************
  117.   * @brief  主函数
  118.   * @param  无
  119.   * @retval 无
  120.   * @note   第一步:开发板硬件初始化
  121.             第二步:创建APP应用任务
  122.             第三步:启动FreeRTOS,开始多任务调度
  123.   ****************************************************************/
  124. int main(void)
  125. {
  126.         BaseType_t xReturn = pdTRUE; /* 定义一个创建信息返回值,默认为pdTRUE */
  127.        
  128.   /* 开发板硬件初始化 */
  129.         BSP_Init();
  130.        
  131.         /* 创建AppTaskCreate任务 */
  132.         xReturn = xTaskCreate( (TaskFunction_t)  AppTaskCreate,         /* 任务入口函数 */
  133.                                (const char *  )  "AppTaskCreate",       /* 任务名称 */
  134.                          (uint16_t      )  AppTask_STK_SIZE,      /* 任务栈大小 */
  135.                          (void *        )  NULL,                  /* 任务入口函数参数 */
  136.                          (UBaseType_t   )  AppTask_TASK_PRIO,     /* 任务优先级 */
  137.                          (TaskHandle_t *)  &AppTaskCreate_Handle);/* 任务控制块指针(句柄) */

  138.     if(xReturn == pdTRUE)/* 检测任务是否创建成功 */
  139.         {        printf("任务AppTaskCreate创建成功,开启任务调度!\r\n"); }               
  140.         else{return -1;}
  141.        
  142.         vTaskStartScheduler();/* 启动任务,开启调度 */
  143.        
  144.         while(1); /* 正常不会执行到这里 用于判断是否调度出错 */               
  145. }

  146. /***********************************************************************
  147.   * @ 函数名  : AppTaskCreate
  148.   * @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
  149.   * @ 参数    : 无
  150.   * @ 返回值  : 无
  151.   **********************************************************************/
  152. static void AppTaskCreate(void)
  153. {
  154.         BaseType_t xReturn = pdTRUE; /* 定义一个创建信息返回值,默认为pdTRUE */
  155.        
  156.         taskENTER_CRITICAL();  /* 进入临界段 防止创建多个任务被打断 */
  157.                                                                                                                                                                                        
  158.         xReturn = xTaskCreate( (TaskFunction_t) Work_Task,         /* 任务入口函数 */
  159.                                (const char *  ) "Work_Task",       /* 任务名称 */
  160.                                (uint16_t      ) Work_STK_SIZE,     /* 任务栈大小 */
  161.                          (void *        ) NULL,                /* 任务入口函数参数 */
  162.                          (UBaseType_t   ) Work_TASK_PRIO,    /* 任务优先级 */
  163.                          (TaskHandle_t *) &Work_TaskHandle); /* 任务控制块指针(句柄) */                                                  
  164.     if(xReturn == pdPASS){ printf("创建任务Work_Task成功!\r\n"); }/* 检测任务是否创建成功 */
  165.         else{printf("创建任务Work_Task失败!\r\n");}
  166.        
  167. //        xReturn = xTaskCreate( (TaskFunction_t) KEY_Task,          /* 任务入口函数 */
  168. //                         (const char *  ) "KEY_Task",        /* 任务名称 */
  169. //                         (uint16_t      ) KEY_STK_SIZE,      /* 任务栈大小 */
  170. //                         (void *        ) NULL,              /* 任务入口函数参数 */
  171. //                         (UBaseType_t   ) KEY_TASK_PRIO,     /* 任务优先级 */
  172. //                         (TaskHandle_t *) &KEY_TaskHandle);  /* 任务控制块指针(句柄) */  
  173. //    if(xReturn == pdPASS){ printf("创建任务KEY_Task成功!\r\n"); }/* 检测任务是否创建成功 */
  174. //        else{printf("创建任务KEY_Task失败!\r\n");}
  175.        
  176.     vTaskDelete(AppTaskCreate_Handle);/* 删除AppTaskCreate任务 */
  177.        
  178.     taskEXIT_CRITICAL();  /* 退出临界段开始正常执行程序 */       
  179. }

  180. /***********************************************************************
  181.   * @ 函数名  : Work_Task
  182.   * @ 功能说明: 任务的相关操作信息调试任务
  183.   * @ 参数    : 无
  184.   * @ 返回值  : 无
  185.   **********************************************************************/
  186. static void Work_Task(void* parameter)
  187. {
  188. //        BaseType_t xReturn = pdTRUE; /* 定义一个创建信息返回值,默认为pdTRUE */       
  189.         while(1)
  190.         {       
  191.        
  192.                 MPU6050_AppWork();
  193.                
  194.                 vTaskDelay(1); //延时10个Tick  启动调度
  195.         }
  196. }
  197. /***********************************************************************
  198.   * @ 函数名  : EventSet_Task
  199.   * @ 功能说明: 任务的相关操作信息调试任务
  200.   * @ 参数    : 无
  201.   * @ 返回值  : 无
  202.   **********************************************************************/
  203. //static void Receive2_Task(void* parameter)
  204. //{
  205. //        BaseType_t xReturn = pdTRUE; /* 定义一个创建信息返回值,默认为pdTRUE */
  206. //        while(1)
  207. //        {

  208. //                LED2_TOGGLE;
  209. //                vTaskDelay(10); /* 任务延时10个tick 启动调度器 */
  210. //        }
  211. //}
  212. /***********************************************************************
  213.   * @ 函数名  : KEY_Task
  214.   * @ 功能说明: 读取按键 控制相关任务挂起还是恢复
  215.   * @ 参数    : 无  
  216.   * @ 返回值  : 无
  217.   **********************************************************************/
  218. //static void KEY_Task(void *parameter)
  219. //{
  220. //        BaseType_t xReturn = pdTRUE; /* 定义一个创建信息返回值,默认为pdTRUE */
  221. //        while(1)
  222. //        {//按键扫描判断
  223. //                if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON)//KEY1
  224. //                {
  225. //      printf ( "KEY1被按下\n" );
  226. //                        LED2_TOGGLE;
  227. //                }
  228. //         
  229. //                if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON)//KEY2
  230. //                {
  231. //      printf ( "KEY2被按下\n" );
  232. //                        LED3_TOGGLE;
  233. //                }               
  234. //                vTaskDelay(10); /* 任务延时10个tick 启动调度器 */
  235. //        }               
  236. //}

  237. /***********************************************************************
  238.   * @ 函数名  : BSP_Init
  239.   * @ 功能说明: 硬件初始化
  240.   * @ 参数    : 无
  241.   * @ 返回值  : 无
  242.   **********************************************************************/
  243. void BSP_Init(void)
  244. { BaseType_t xReturn = pdTRUE; /* 定义一个创建信息返回值,默认为pdTRUE */
  245.         /*
  246.          * STM32中断优先级分组为4,即4bit都用来表示抢占优先级,范围为:0~15
  247.          * 优先级分组只需要分组一次即可,以后如果有其他的任务需要用到中断,
  248.          * 都统一用这个优先级分组,千万不要再分组,切忌。
  249.          */       
  250.         NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
  251.     /* 延时函数初始化 */
  252.         delay_init();
  253.           /* LED初始化 */
  254.         LED_GPIO_Config();       
  255.     /* KEY按键初始化 */
  256.         Key_GPIO_Config();
  257.         /* 串口1初始化-->调试打印        */
  258.         uart_init(115200);/* 正点原子驱动 */
  259.         /* 串口2初始化-->匿名4轴上位机使用 */
  260.         USART_Config();/* 野火驱动 */
  261.         /* TIM1的PWM输出CH1-CH1N BDT刹车通道初始化 */
  262.         ADVANCE_TIM_Init();
  263.        
  264.         /* 初始化MPU6050 GPIO等 */
  265.         xReturn = MPU_Init();       
  266.         printf("MPU6050_Init:%ld\r\n",xReturn);       
  267.        
  268.         /* mpu6050,dmp初始化及检测 */
  269.         xReturn = mpu_dmp_init();
  270.         printf("MPU6050dmp初始化:%ld\r\n",xReturn);
  271.        
  272. }



  273. /********************************END OF FILE****************************/
复制代码

Keil代码下载:
D3球形机器人(10).7z (371.77 KB, 下载次数: 61)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:962202 发表于 2024-4-22 09:45 | 显示全部楼层
谢分享了,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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