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

目录

1.准备FreeRTOS源文件

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

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

4、修改代码


1.准备FreeRTOS源文件

1.1、到freertos.org下载最新版本的源文件,链接地址

1.2、FreeRTOS 文件结构如下:

需要用到的是粉色的头文件和翠绿色c文件。

STM32G0学习手册——移植FreeRTOS v202107.00_第1张图片

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

2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)

2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档

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

3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹

最后看起来目录结构是这样

STM32G0学习手册——移植FreeRTOS v202107.00_第2张图片

+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文件添加进去

STM32G0学习手册——移植FreeRTOS v202107.00_第3张图片

3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"

STM32G0学习手册——移植FreeRTOS v202107.00_第4张图片

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,stm32,stm32,嵌入式,物联网,freertos)