STM32G0学习手册——移植FreeRTOS v202104.00

Posted SCCELE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32G0学习手册——移植FreeRTOS v202104.00相关的知识,希望对你有一定的参考价值。

目录

1.准备FreeRTOS源文件

2、使用STM32CubeMX生成初始化代码(BSP_Init)

3、复制FreeRTOS文件到工程目录中

4、修改代码


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中

                            下载FreeRTOSConfig.h 

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、编译烧录。

以上是关于STM32G0学习手册——移植FreeRTOS v202104.00的主要内容,如果未能解决你的问题,请参考以下文章

STM32G0学习手册——移植FreeRTOS v202104.00

STM32G0学习手册——FreeRTOS消息队列

STM32G0学习手册——FreeRTOS消息队列

STM32G0学习手册——FreeRTOS消息队列

STM32G0学习手册——FreeRTOS事件组

STM32G0学习手册——FreeRTOS事件组