通过STM32CubeIDE集成FreeRTOS到STM32

通过STM32CubeIDE集成FreeRTOS到STM32

背景:

STM32本身是不带操作系统的,一般方式有,自己通过中断调用创建抢占任务,再有就是一致FreeRTOS等其他已经成熟的实时操作系统。

操作:

1、根据单片机型号创建工程

2、配置系统基本框架,外部晶振,系统时钟,调试模式等

注意,系统时钟被freeRTOS征用了,我们把系统时钟改成别的时钟。

 3、导入freeRTOS

4、选择CMSIS_V2版本,CMSIS_V2是在freeRTOS又抽象出来了一层代码,但是老的freeRTOS标准函数都还是可以用的

5、别的配置项可以先用默认,需要的时候再改,直接在Tasks and Queues选项新建任务即可。

6、生成代码

 7、然后就完成了,在app_freertos.c文件里面就可以看到创建的任务了

 8、除此之外我们还可以通过freeRTOS原生的函数自己创建任务。

可以参考以下代码:

 

/*********************************************************************************************************************/
/*-----------------------------------------------------Includes------------------------------------------------------*/
/*********************************************************************************************************************/
#include "My_Main.h"
#include "FreeRTOS.h"
#include "task.h"
#include "My_Uart.h"
/*********************************************************************************************************************/
/*------------------------------------------------------Macros-------------------------------------------------------*/
/*********************************************************************************************************************/
#define MY_5MS_TASK_STACK_LEN			1024U

/*********************************************************************************************************************/
/*-------------------------------------------------Global variables--------------------------------------------------*/
/*********************************************************************************************************************/
extern TIM_HandleTypeDef htim4;

uint64_t Sys_Timestamp_10us_Cnt = 0;
StackType_t My_5ms_Task_Stack[MY_5MS_TASK_STACK_LEN];
StaticTask_t My_5ms_Task_TCB;
/*********************************************************************************************************************/
/*------------------------------------------------Function Prototypes------------------------------------------------*/
/*********************************************************************************************************************/

/*********************************************************************************************************************/
/*---------------------------------------------Function Implementations----------------------------------------------*/
/*********************************************************************************************************************/
void My_TIM4_Init(void)
{
	HAL_TIM_Base_Start_IT(&htim4);
}

void My_TIM4_IRQHandler(void)
{
	Sys_Timestamp_10us_Cnt++;
}

void My_5ms_Task_Fun(void const * argument)
{
    TickType_t xLastWakeTime;
    const TickType_t xPeriod = pdMS_TO_TICKS(5);  // 5ms周期

    // 初始化唤醒时间(必须在循环前初始化一次)
    xLastWakeTime = xTaskGetTickCount();
	while(1)
	{
		Shell_Loop_Printf();
		vTaskDelayUntil(&xLastWakeTime, xPeriod);
	}
}


void My_Main_Init(void)
{
	My_TIM4_Init();
	My_UART_Init();

    TaskHandle_t xTask = xTaskCreateStatic(
    		My_5ms_Task_Fun, \
			"My_5ms_Task_Fun", \
			MY_5MS_TASK_STACK_LEN, \
			NULL, \
			1, \
			My_5ms_Task_Stack, \
			&My_5ms_Task_TCB
    );

    vTaskStartScheduler();  // 启动 FreeRTOS 调度器(含初始化)
	return;
}

 

posted @ 2025-07-18 12:05  西北小蚂蚁  阅读(437)  评论(0)    收藏  举报