自己學習FreeRTOS和MPU6050時寫的一個姿態測試程序,希望有大佬發表相關意見!僅僅是做了一些簡單的測試!!! 但是Row角的偏移有點大!!!
單片機源程序如下:
- /*
- *************************************************************************
- * 包含的頭文件
- *************************************************************************
- */
- /* 系統標準頭文件 */
- #include <string.h> //字符串操作相關函數
- #include <stdio.h> //標準輸入輸出
- #include <limits.h> //高等大數據定義
- #include <stdlib.h> //內存操作相關函數
- /* FreeRTOS頭文件 */
- #include "FreeRTOS.h" //FreeRTOS系統配置頭文件
- #include "task.h" //創建任務頭文件
- #include "queue.h" //內核隊列頭文件
- #include "semphr.h" //信號量頭文件
- #include "event_groups.h" //事件處理頭文件
- #include "list.h" //鏈表頭文件
-
- /* 開發板硬件bsp頭文件 */
- #include "stm32f10x.h"
- #include "delay.h"
- #include "usart.h"
- #include "bsp_usart.h"
- #include "bsp_led.h"
- #include "bsp_key.h"
- //#include "bsp_i2c_ee.h" //軟件I2C通訊底層
- //#include "bsp_i2c_gpio.h"//軟件I2C通訊底層IO口
- //#include "bsp_i2c_ee.h" //硬件I2C底層
- #include "bsp_TiMbase.h"
- #include "bsp_AdvanceTim.h"
- #include "mpu6050.h"
- #include "mpu6050_app.h"
- #include "inv_mpu.h"
- #include "inv_mpu_dmp_motion_driver.h"
- /**************************** 任務塊 ********************************/
- /* 仿照正點原子的按照任務的相關性來進行聲明和定義所有的類型等變量
- *
- */
- /* 創建任務函數句柄 */
- static TaskHandle_t AppTaskCreate_Handle=NULL;
- /* 創建任務函數堆棧大小 */
- #define AppTask_STK_SIZE 512
- /* 創建任務函數任務優先級 */
- #define AppTask_TASK_PRIO 1
- /* 創建任務函數聲明 */
- static void AppTaskCreate(void);/* 用于創建任務 */
- /* Work任務函數句柄 */
- static TaskHandle_t Work_TaskHandle=NULL;
- /* Work任務函數堆棧大小 */
- #define Work_STK_SIZE 512
- /* Work任務函數任務優先級 */
- #define Work_TASK_PRIO 2
- /* Work任務函數聲明 */
- static void Work_Task(void* parameter);/* Work任務相關任務 */
- // /* Receive2任務函數句柄 */
- //static TaskHandle_t Receive2_TaskHandle=NULL;
- // /* Receive2任務函數堆棧大小 */
- //#define Receive2_STK_SIZE 512
- // /* Receive2任務函數任務優先級 */
- //#define Receive2_TASK_PRIO 3
- // /* Receive2任務函數聲明 */
- //static void Receive2_Task(void* parameter);/* Receive2任務相關任務 */
- // /* KEY任務函數句柄 */
- //static TaskHandle_t KEY_TaskHandle=NULL;
- // /* KEY任務函數堆棧大小 */
- //#define KEY_STK_SIZE 512
- // /* KEY任務函數任務優先級 */
- //#define KEY_TASK_PRIO 3
- // /* KEY任務函數聲明 */
- //static void KEY_Task(void* parameter);/* KEY任務 */
- /**************************** 任務句柄 ********************************/
- /*
- * 任務句柄是一個指針,用于指向一個任務,當任務創建好之后,它就具有了一個任務句柄
- * 以后我們要想操作這個任務都需要通過這個任務句柄,如果是自身的任務操作自己,那么
- * 這個句柄可以為NULL。
- */
- /********************************** 內核對象句柄 *********************************/
- /*
- * 信號量,消息隊列,事件標志組,軟件定時器這些都屬于內核的對象,要想使用這些內核
- * 對象,必須先創建,創建成功之后會返回一個相應的句柄。實際上就是一個指針,后續我
- * 們就可以通過這個句柄操作這些內核對象。
- *
- * 內核對象說白了就是一種全局的數據結構,通過這些數據結構我們可以實現任務間的通信,
- * 任務間的事件同步等各種功能。至于這些功能的實現我們是通過調用這些內核對象的函數
- * 來完成的
- *
- */
- /******************************* 宏定義 ************************************/
- /*
- * 當我們在寫應用程序的時候,可能需要用到一些宏定義。
- */
- /******************************* 全局變量聲明 ************************************/
- /* 當我們在寫應用程序的時候,可能需要用到一些全局變量。
- */
- /*
- *************************************************************************
- * 函數聲明
- *************************************************************************
- */
- static void BSP_Init(void);/* 硬件初始化 */
- /* 裸機驅動測試主函數 */
- //int main(void)
- //{
- // delay_init(); //延時函數初始化
- // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
- // uart_init(115200); //串口初始化為115200
- //
- // DHT11_Init(); //DHT11初始化
- // while(1)
- // {
- // DHT11_Read_Data(&temperature,&humidity);
- // printf("%0.2d℃ %0.2d%%\r\n",temperature,humidity);
- // delay_ms(1000);
- // }
- //}
- /*****************************************************************
- * @brief 主函數
- * @param 無
- * @retval 無
- * @note 第一步:開發板硬件初始化
- 第二步:創建APP應用任務
- 第三步:啟動FreeRTOS,開始多任務調度
- ****************************************************************/
- int main(void)
- {
- BaseType_t xReturn = pdTRUE; /* 定義一個創建信息返回值,默認為pdTRUE */
-
- /* 開發板硬件初始化 */
- BSP_Init();
-
- /* 創建AppTaskCreate任務 */
- xReturn = xTaskCreate( (TaskFunction_t) AppTaskCreate, /* 任務入口函數 */
- (const char * ) "AppTaskCreate", /* 任務名稱 */
- (uint16_t ) AppTask_STK_SIZE, /* 任務棧大小 */
- (void * ) NULL, /* 任務入口函數參數 */
- (UBaseType_t ) AppTask_TASK_PRIO, /* 任務優先級 */
- (TaskHandle_t *) &AppTaskCreate_Handle);/* 任務控制塊指針(句柄) */
- if(xReturn == pdTRUE)/* 檢測任務是否創建成功 */
- { printf("任務AppTaskCreate創建成功,開啟任務調度!\r\n"); }
- else{return -1;}
-
- vTaskStartScheduler();/* 啟動任務,開啟調度 */
-
- while(1); /* 正常不會執行到這里 用于判斷是否調度出錯 */
- }
- /***********************************************************************
- * @ 函數名 : AppTaskCreate
- * @ 功能說明: 為了方便管理,所有的任務創建函數都放在這個函數里面
- * @ 參數 : 無
- * @ 返回值 : 無
- **********************************************************************/
- static void AppTaskCreate(void)
- {
- BaseType_t xReturn = pdTRUE; /* 定義一個創建信息返回值,默認為pdTRUE */
-
- taskENTER_CRITICAL(); /* 進入臨界段 防止創建多個任務被打斷 */
-
- xReturn = xTaskCreate( (TaskFunction_t) Work_Task, /* 任務入口函數 */
- (const char * ) "Work_Task", /* 任務名稱 */
- (uint16_t ) Work_STK_SIZE, /* 任務棧大小 */
- (void * ) NULL, /* 任務入口函數參數 */
- (UBaseType_t ) Work_TASK_PRIO, /* 任務優先級 */
- (TaskHandle_t *) &Work_TaskHandle); /* 任務控制塊指針(句柄) */
- if(xReturn == pdPASS){ printf("創建任務Work_Task成功!\r\n"); }/* 檢測任務是否創建成功 */
- else{printf("創建任務Work_Task失敗!\r\n");}
-
- // xReturn = xTaskCreate( (TaskFunction_t) KEY_Task, /* 任務入口函數 */
- // (const char * ) "KEY_Task", /* 任務名稱 */
- // (uint16_t ) KEY_STK_SIZE, /* 任務棧大小 */
- // (void * ) NULL, /* 任務入口函數參數 */
- // (UBaseType_t ) KEY_TASK_PRIO, /* 任務優先級 */
- // (TaskHandle_t *) &KEY_TaskHandle); /* 任務控制塊指針(句柄) */
- // if(xReturn == pdPASS){ printf("創建任務KEY_Task成功!\r\n"); }/* 檢測任務是否創建成功 */
- // else{printf("創建任務KEY_Task失敗!\r\n");}
-
- vTaskDelete(AppTaskCreate_Handle);/* 刪除AppTaskCreate任務 */
-
- taskEXIT_CRITICAL(); /* 退出臨界段開始正常執行程序 */
- }
- /***********************************************************************
- * @ 函數名 : Work_Task
- * @ 功能說明: 任務的相關操作信息調試任務
- * @ 參數 : 無
- * @ 返回值 : 無
- **********************************************************************/
- static void Work_Task(void* parameter)
- {
- // BaseType_t xReturn = pdTRUE; /* 定義一個創建信息返回值,默認為pdTRUE */
- while(1)
- {
-
- MPU6050_AppWork();
-
- vTaskDelay(1); //延時10個Tick 啟動調度
- }
- }
- /***********************************************************************
- * @ 函數名 : EventSet_Task
- * @ 功能說明: 任務的相關操作信息調試任務
- * @ 參數 : 無
- * @ 返回值 : 無
- **********************************************************************/
- //static void Receive2_Task(void* parameter)
- //{
- // BaseType_t xReturn = pdTRUE; /* 定義一個創建信息返回值,默認為pdTRUE */
- // while(1)
- // {
- // LED2_TOGGLE;
- // vTaskDelay(10); /* 任務延時10個tick 啟動調度器 */
- // }
- //}
- /***********************************************************************
- * @ 函數名 : KEY_Task
- * @ 功能說明: 讀取按鍵 控制相關任務掛起還是恢復
- * @ 參數 : 無
- * @ 返回值 : 無
- **********************************************************************/
- //static void KEY_Task(void *parameter)
- //{
- // BaseType_t xReturn = pdTRUE; /* 定義一個創建信息返回值,默認為pdTRUE */
- // while(1)
- // {//按鍵掃描判斷
- // if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON)//KEY1
- // {
- // printf ( "KEY1被按下\n" );
- // LED2_TOGGLE;
- // }
- //
- // if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON)//KEY2
- // {
- // printf ( "KEY2被按下\n" );
- // LED3_TOGGLE;
- // }
- // vTaskDelay(10); /* 任務延時10個tick 啟動調度器 */
- // }
- //}
- /***********************************************************************
- * @ 函數名 : BSP_Init
- * @ 功能說明: 硬件初始化
- * @ 參數 : 無
- * @ 返回值 : 無
- **********************************************************************/
- void BSP_Init(void)
- { BaseType_t xReturn = pdTRUE; /* 定義一個創建信息返回值,默認為pdTRUE */
- /*
- * STM32中斷優先級分組為4,即4bit都用來表示搶占優先級,范圍為:0~15
- * 優先級分組只需要分組一次即可,以后如果有其他的任務需要用到中斷,
- * 都統一用這個優先級分組,千萬不要再分組,切忌。
- */
- NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
- /* 延時函數初始化 */
- delay_init();
- /* LED初始化 */
- LED_GPIO_Config();
- /* KEY按鍵初始化 */
- Key_GPIO_Config();
- /* 串口1初始化-->調試打印 */
- uart_init(115200);/* 正點原子驅動 */
- /* 串口2初始化-->匿名4軸上位機使用 */
- USART_Config();/* 野火驅動 */
- /* TIM1的PWM輸出CH1-CH1N BDT剎車通道初始化 */
- ADVANCE_TIM_Init();
-
- /* 初始化MPU6050 GPIO等 */
- xReturn = MPU_Init();
- printf("MPU6050_Init:%ld\r\n",xReturn);
-
- /* mpu6050,dmp初始化及檢測 */
- xReturn = mpu_dmp_init();
- printf("MPU6050dmp初始化:%ld\r\n",xReturn);
-
- }
- /********************************END OF FILE****************************/
復制代碼
Keil代碼下載:
D3球形機器人(10).7z
(371.77 KB, 下載次數: 62)
2021-11-20 17:52 上傳
點擊文件名下載附件
|