基于STM32F103的HAL库手动配置FreeRTOS

源码下载

FreeRTOS源码下载包括示例工程与内核工程。
示例工程:获取与开发环境相关的架构文件
内核工程:移植FreeRTOS的内核文件
示例工程Gitee地址
内核工程GirHub地址

STM32工程创建

使用STM32CubeMX创建新工程,注意基准时钟源使用除滴答时钟(SysTick)外的定时器担当。
原因:在FreeRTOS中滴答定时器被作为任务调度定时器。
基于STM32F103的HAL库手动配置FreeRTOS-LMLPHP

FreeRTOS移植

1、源文件移植
将下载的内核工程目录下的所有C文件添加到工程中
2、头文件移植
将下载的内核工程目录中的include文件夹添加到工程中
3、环境文件移植
将下载的内核工程目录中的portable文件夹添加到工程中,其中保留Keil、MenMang、RVDS三个文件夹即可,Keil为使用的环境,MenMang为内存管理文件,RVDS为所使用的芯片架构
4、添加配置文件
在下载的示例工程中选择对应的芯片Demo,复制FreeRTOSConfig.h(配置头文件)到工程下
基于STM32F103的HAL库手动配置FreeRTOS-LMLPHP
基于STM32F103的HAL库手动配置FreeRTOS-LMLPHP

Keil工程配置

创建Groups并添加相应的资源文件
基于STM32F103的HAL库手动配置FreeRTOS-LMLPHP
基于STM32F103的HAL库手动配置FreeRTOS-LMLPHP
在FreeRTOSConfig.h文件中添加宏定义(用于顶替默认工程的相关中断),同时删除默认工程下的对应定义(stm32f1xx_it.c文件夹中)
基于STM32F103的HAL库手动配置FreeRTOS-LMLPHP
编译后无报错无警告即可。

测试

测试示例:一个LED1S闪烁,另外一个0.5S闪烁
添加头文件:

#include "FreeRTOS.h"
#include "task.h"

任务函数:

void VTask1(void *pvParameters)
{
	while(1)
	{
		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
		HAL_Delay(1000);
	}
}

void VTask2(void *pvParameters)
{
	while(1)
	{
		HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
		HAL_Delay(500);
	}
}

创建任务并执行:

  xTaskCreate(VTask1,"LED1",128,NULL,1,NULL);
  xTaskCreate(VTask2,"LED2",128,NULL,1,NULL);

  vTaskStartScheduler();
05-29 10:29