1.准备FreeRTOS源文件
1.1、到freertos.org下载最新版本的源文件,链接地址
1.2、FreeRTOS 文件结构如下:
需要用到的是粉色的头文件和翠绿色c文件。
2、使用STM32CubeMX生成初始化代码(BSP_Init)
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
3、复制FreeRTOS文件到工程目录中
3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
最后看起来目录结构是这样
+FreeRTOS
|+include
|+source
3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"
4、修改代码
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
4.2、在main.c添加代码,添加任务
- /* USER CODE BEGIN Includes */
- #include "FreeRTOS.h"
- #include "task.h"
- #include "queue.h"
- #include "semphr.h"
- #include "event_groups.h"
- #include "timers.h"
- /* USER CODE END Includes */
- *
- *
- *
- /* USER CODE BEGIN PV */
- static void Send_Task(void* pvParameters);
- static void Callback_LEDTOGGLE(void* pvParameters);
- static void AppTaskCreate(void);
- /*Task Handle*/
- static TaskHandle_t AppTaskCreate_Handle=NULL;
- static TaskHandle_t Send_Task_Handle=NULL; //PRO:3
- /*Timer handle*/
- static TimerHandle_t Timer1=NULL;
- static void Callback_LEDTOGGLE(void* pvParameters)
- {
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
- }
- /* USER CODE END PV */
- *
- *
- *
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- BaseType_t xReturn =pdPASS;
- /* USER CODE END 1 */
- *
- *
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\
- (const char *)"APPTASKCREATE",\
- (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
- (TaskHandle_t*)&AppTaskCreate_Handle);
- if(pdPASS==xReturn)
- vTaskStartScheduler();
- else
- return -1;
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
- *
- *
- /* USER CODE BEGIN 4 */
- /***********
- *@Function name:SEND_Task
- *@description:SEND_Task body
- *@Parameter:None
- *@return:None
- *************/
- static void Send_Task(void* pvParameters)
- {
- while(1)
- {
- vTaskDelay(100); //Just to demonstrate task switching.
- }
- }
- static void AppTaskCreate(void)
- {
- BaseType_t xReturn=pdPASS;
- taskENTER_CRITICAL();
- /* Create Timer1 Handle*/
- Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
- if(NULL!=Timer1)
- {}
- xTimerStart(Timer1,0);
- /*SEND task*/
- xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
- (const char*)"SEND_TASK",\
- (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
- (TaskHandle_t*)&Send_Task_Handle);
- if(pdPASS==xReturn)
- {}
- vTaskDelete(AppTaskCreate_Handle);
- taskEXIT_CRITICAL();
- }
- /* USER CODE END 4 */
复制代码
4.3、编译烧录。
|