|
自己學(xué)習(xí)FreeRTOS和MPU6050時寫的一個姿態(tài)測試程序,希望有大佬發(fā)表相關(guān)意見!僅僅是做了一些簡單的測試!!! 但是Row角的偏移有點大!!!
51hei截圖20211120175626.png (302.12 KB, 下載次數(shù): 54)
下載附件
2021-11-20 17:56 上傳
單片機源程序如下:
- /*
- *************************************************************************
- * 包含的頭文件
- *************************************************************************
- */
- /* 系統(tǒng)標(biāo)準(zhǔn)頭文件 */
- #include <string.h> //字符串操作相關(guān)函數(shù)
- #include <stdio.h> //標(biāo)準(zhǔn)輸入輸出
- #include <limits.h> //高等大數(shù)據(jù)定義
- #include <stdlib.h> //內(nèi)存操作相關(guān)函數(shù)
- /* FreeRTOS頭文件 */
- #include "FreeRTOS.h" //FreeRTOS系統(tǒng)配置頭文件
- #include "task.h" //創(chuàng)建任務(wù)頭文件
- #include "queue.h" //內(nèi)核隊列頭文件
- #include "semphr.h" //信號量頭文件
- #include "event_groups.h" //事件處理頭文件
- #include "list.h" //鏈表頭文件
-
- /* 開發(fā)板硬件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"
- /**************************** 任務(wù)塊 ********************************/
- /* 仿照正點原子的按照任務(wù)的相關(guān)性來進(jìn)行聲明和定義所有的類型等變量
- *
- */
- /* 創(chuàng)建任務(wù)函數(shù)句柄 */
- static TaskHandle_t AppTaskCreate_Handle=NULL;
- /* 創(chuàng)建任務(wù)函數(shù)堆棧大小 */
- #define AppTask_STK_SIZE 512
- /* 創(chuàng)建任務(wù)函數(shù)任務(wù)優(yōu)先級 */
- #define AppTask_TASK_PRIO 1
- /* 創(chuàng)建任務(wù)函數(shù)聲明 */
- static void AppTaskCreate(void);/* 用于創(chuàng)建任務(wù) */
- /* Work任務(wù)函數(shù)句柄 */
- static TaskHandle_t Work_TaskHandle=NULL;
- /* Work任務(wù)函數(shù)堆棧大小 */
- #define Work_STK_SIZE 512
- /* Work任務(wù)函數(shù)任務(wù)優(yōu)先級 */
- #define Work_TASK_PRIO 2
- /* Work任務(wù)函數(shù)聲明 */
- static void Work_Task(void* parameter);/* Work任務(wù)相關(guān)任務(wù) */
- // /* Receive2任務(wù)函數(shù)句柄 */
- //static TaskHandle_t Receive2_TaskHandle=NULL;
- // /* Receive2任務(wù)函數(shù)堆棧大小 */
- //#define Receive2_STK_SIZE 512
- // /* Receive2任務(wù)函數(shù)任務(wù)優(yōu)先級 */
- //#define Receive2_TASK_PRIO 3
- // /* Receive2任務(wù)函數(shù)聲明 */
- //static void Receive2_Task(void* parameter);/* Receive2任務(wù)相關(guān)任務(wù) */
- // /* KEY任務(wù)函數(shù)句柄 */
- //static TaskHandle_t KEY_TaskHandle=NULL;
- // /* KEY任務(wù)函數(shù)堆棧大小 */
- //#define KEY_STK_SIZE 512
- // /* KEY任務(wù)函數(shù)任務(wù)優(yōu)先級 */
- //#define KEY_TASK_PRIO 3
- // /* KEY任務(wù)函數(shù)聲明 */
- //static void KEY_Task(void* parameter);/* KEY任務(wù) */
- /**************************** 任務(wù)句柄 ********************************/
- /*
- * 任務(wù)句柄是一個指針,用于指向一個任務(wù),當(dāng)任務(wù)創(chuàng)建好之后,它就具有了一個任務(wù)句柄
- * 以后我們要想操作這個任務(wù)都需要通過這個任務(wù)句柄,如果是自身的任務(wù)操作自己,那么
- * 這個句柄可以為NULL。
- */
- /********************************** 內(nèi)核對象句柄 *********************************/
- /*
- * 信號量,消息隊列,事件標(biāo)志組,軟件定時器這些都屬于內(nèi)核的對象,要想使用這些內(nèi)核
- * 對象,必須先創(chuàng)建,創(chuàng)建成功之后會返回一個相應(yīng)的句柄。實際上就是一個指針,后續(xù)我
- * 們就可以通過這個句柄操作這些內(nèi)核對象。
- *
- * 內(nèi)核對象說白了就是一種全局的數(shù)據(jù)結(jié)構(gòu),通過這些數(shù)據(jù)結(jié)構(gòu)我們可以實現(xiàn)任務(wù)間的通信,
- * 任務(wù)間的事件同步等各種功能。至于這些功能的實現(xiàn)我們是通過調(diào)用這些內(nèi)核對象的函數(shù)
- * 來完成的
- *
- */
- /******************************* 宏定義 ************************************/
- /*
- * 當(dāng)我們在寫應(yīng)用程序的時候,可能需要用到一些宏定義。
- */
- /******************************* 全局變量聲明 ************************************/
- /* 當(dāng)我們在寫應(yīng)用程序的時候,可能需要用到一些全局變量。
- */
- /*
- *************************************************************************
- * 函數(shù)聲明
- *************************************************************************
- */
- static void BSP_Init(void);/* 硬件初始化 */
- /* 裸機驅(qū)動測試主函數(shù) */
- //int main(void)
- //{
- // delay_init(); //延時函數(shù)初始化
- // 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 主函數(shù)
- * @param 無
- * @retval 無
- * @note 第一步:開發(fā)板硬件初始化
- 第二步:創(chuàng)建APP應(yīng)用任務(wù)
- 第三步:啟動FreeRTOS,開始多任務(wù)調(diào)度
- ****************************************************************/
- int main(void)
- {
- BaseType_t xReturn = pdTRUE; /* 定義一個創(chuàng)建信息返回值,默認(rèn)為pdTRUE */
-
- /* 開發(fā)板硬件初始化 */
- BSP_Init();
-
- /* 創(chuàng)建AppTaskCreate任務(wù) */
- xReturn = xTaskCreate( (TaskFunction_t) AppTaskCreate, /* 任務(wù)入口函數(shù) */
- (const char * ) "AppTaskCreate", /* 任務(wù)名稱 */
- (uint16_t ) AppTask_STK_SIZE, /* 任務(wù)棧大小 */
- (void * ) NULL, /* 任務(wù)入口函數(shù)參數(shù) */
- (UBaseType_t ) AppTask_TASK_PRIO, /* 任務(wù)優(yōu)先級 */
- (TaskHandle_t *) &AppTaskCreate_Handle);/* 任務(wù)控制塊指針(句柄) */
- if(xReturn == pdTRUE)/* 檢測任務(wù)是否創(chuàng)建成功 */
- { printf("任務(wù)AppTaskCreate創(chuàng)建成功,開啟任務(wù)調(diào)度!\r\n"); }
- else{return -1;}
-
- vTaskStartScheduler();/* 啟動任務(wù),開啟調(diào)度 */
-
- while(1); /* 正常不會執(zhí)行到這里 用于判斷是否調(diào)度出錯 */
- }
- /***********************************************************************
- * @ 函數(shù)名 : AppTaskCreate
- * @ 功能說明: 為了方便管理,所有的任務(wù)創(chuàng)建函數(shù)都放在這個函數(shù)里面
- * @ 參數(shù) : 無
- * @ 返回值 : 無
- **********************************************************************/
- static void AppTaskCreate(void)
- {
- BaseType_t xReturn = pdTRUE; /* 定義一個創(chuàng)建信息返回值,默認(rèn)為pdTRUE */
-
- taskENTER_CRITICAL(); /* 進(jìn)入臨界段 防止創(chuàng)建多個任務(wù)被打斷 */
-
- xReturn = xTaskCreate( (TaskFunction_t) Work_Task, /* 任務(wù)入口函數(shù) */
- (const char * ) "Work_Task", /* 任務(wù)名稱 */
- (uint16_t ) Work_STK_SIZE, /* 任務(wù)棧大小 */
- (void * ) NULL, /* 任務(wù)入口函數(shù)參數(shù) */
- (UBaseType_t ) Work_TASK_PRIO, /* 任務(wù)優(yōu)先級 */
- (TaskHandle_t *) &Work_TaskHandle); /* 任務(wù)控制塊指針(句柄) */
- if(xReturn == pdPASS){ printf("創(chuàng)建任務(wù)Work_Task成功!\r\n"); }/* 檢測任務(wù)是否創(chuàng)建成功 */
- else{printf("創(chuàng)建任務(wù)Work_Task失敗!\r\n");}
-
- // xReturn = xTaskCreate( (TaskFunction_t) KEY_Task, /* 任務(wù)入口函數(shù) */
- // (const char * ) "KEY_Task", /* 任務(wù)名稱 */
- // (uint16_t ) KEY_STK_SIZE, /* 任務(wù)棧大小 */
- // (void * ) NULL, /* 任務(wù)入口函數(shù)參數(shù) */
- // (UBaseType_t ) KEY_TASK_PRIO, /* 任務(wù)優(yōu)先級 */
- // (TaskHandle_t *) &KEY_TaskHandle); /* 任務(wù)控制塊指針(句柄) */
- // if(xReturn == pdPASS){ printf("創(chuàng)建任務(wù)KEY_Task成功!\r\n"); }/* 檢測任務(wù)是否創(chuàng)建成功 */
- // else{printf("創(chuàng)建任務(wù)KEY_Task失敗!\r\n");}
-
- vTaskDelete(AppTaskCreate_Handle);/* 刪除AppTaskCreate任務(wù) */
-
- taskEXIT_CRITICAL(); /* 退出臨界段開始正常執(zhí)行程序 */
- }
- /***********************************************************************
- * @ 函數(shù)名 : Work_Task
- * @ 功能說明: 任務(wù)的相關(guān)操作信息調(diào)試任務(wù)
- * @ 參數(shù) : 無
- * @ 返回值 : 無
- **********************************************************************/
- static void Work_Task(void* parameter)
- {
- // BaseType_t xReturn = pdTRUE; /* 定義一個創(chuàng)建信息返回值,默認(rèn)為pdTRUE */
- while(1)
- {
-
- MPU6050_AppWork();
-
- vTaskDelay(1); //延時10個Tick 啟動調(diào)度
- }
- }
- /***********************************************************************
- * @ 函數(shù)名 : EventSet_Task
- * @ 功能說明: 任務(wù)的相關(guān)操作信息調(diào)試任務(wù)
- * @ 參數(shù) : 無
- * @ 返回值 : 無
- **********************************************************************/
- //static void Receive2_Task(void* parameter)
- //{
- // BaseType_t xReturn = pdTRUE; /* 定義一個創(chuàng)建信息返回值,默認(rèn)為pdTRUE */
- // while(1)
- // {
- // LED2_TOGGLE;
- // vTaskDelay(10); /* 任務(wù)延時10個tick 啟動調(diào)度器 */
- // }
- //}
- /***********************************************************************
- * @ 函數(shù)名 : KEY_Task
- * @ 功能說明: 讀取按鍵 控制相關(guān)任務(wù)掛起還是恢復(fù)
- * @ 參數(shù) : 無
- * @ 返回值 : 無
- **********************************************************************/
- //static void KEY_Task(void *parameter)
- //{
- // BaseType_t xReturn = pdTRUE; /* 定義一個創(chuàng)建信息返回值,默認(rèn)為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); /* 任務(wù)延時10個tick 啟動調(diào)度器 */
- // }
- //}
- /***********************************************************************
- * @ 函數(shù)名 : BSP_Init
- * @ 功能說明: 硬件初始化
- * @ 參數(shù) : 無
- * @ 返回值 : 無
- **********************************************************************/
- void BSP_Init(void)
- { BaseType_t xReturn = pdTRUE; /* 定義一個創(chuàng)建信息返回值,默認(rèn)為pdTRUE */
- /*
- * STM32中斷優(yōu)先級分組為4,即4bit都用來表示搶占優(yōu)先級,范圍為:0~15
- * 優(yōu)先級分組只需要分組一次即可,以后如果有其他的任務(wù)需要用到中斷,
- * 都統(tǒng)一用這個優(yōu)先級分組,千萬不要再分組,切忌。
- */
- NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
- /* 延時函數(shù)初始化 */
- delay_init();
- /* LED初始化 */
- LED_GPIO_Config();
- /* KEY按鍵初始化 */
- Key_GPIO_Config();
- /* 串口1初始化-->調(diào)試打印 */
- uart_init(115200);/* 正點原子驅(qū)動 */
- /* 串口2初始化-->匿名4軸上位機使用 */
- USART_Config();/* 野火驅(qū)動 */
- /* 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****************************/
復(fù)制代碼
Keil代碼下載:
D3球形機器人(10).7z
(371.77 KB, 下載次數(shù): 62)
2021-11-20 17:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|