news 2026/6/10 15:07:29

FreeRTOS-STM32-HAL库一步步移植教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FreeRTOS-STM32-HAL库一步步移植教程

FreeRTOS-HAL库一步步移植教程

  • 下载FreeRTOS
  • 裁切文件
  • 创建HAL工程
    • 配置时钟
    • 配置时钟树
    • 配置时基源
    • 配置NVIC
    • 配置代码生成 code generstion
    • 移植测试引脚
    • 生成Keil工程项目
  • 移植FreeRTOS到Keil 并配置
    • 配置Keil
    • 配置include paths
    • FreeRTOSConfig.h 文件添加宏定义
    • stm32f1xx_it.c 文件配置
  • 创建一个动态任务测试

下载FreeRTOS

首先下载FreeRTOS的网址:FreeRTOS网址

打开网址后,选择下载弹出窗口,再次点击查看更多下载选项和后续步骤

点击就会跳转新的页面 在下载FreeRTOS一栏中 找到后续步骤内容中的之前版本

选择要下载的版本FreeRTOSv202212.01.zip(这是2022年12月发布的稳定版本)

裁切文件

将下载的压缩包解压,复制7个C文件,文件在路径 FreeRTOSv202212.01\FreeRTOS\Source

自己创建一个空白的文件夹用来放这7个C文件,例如我的 Middlewares\FreeRTOS\Source,这个Middlewares以后就可以直接复制移植到工程中。

在当前文件夹创建一个 portable 文件夹

这个文件夹里面分别再创建两个文件夹

首先第一个 MemMang ,将官方的文件夹中MemMang里面 heap_4.c文件复制到我们创建的文件夹中

转移到自己创建的

下面是 RVDS 文件夹,直接复制官方的RVDS里面的ARM_CM3这个选择跟芯片有关系

下图是自己创建的

下面移植include文件夹,将官方的include文件夹直接复制到自己的Source文件夹中


最后一个文件路径如下

我先暂时放到FreeRTOS路径下面,等创建好工程再转移到专门放头文件的路径下

创建HAL工程

这里使用cubemx创建工程

配置时钟

配置时钟树

配置时基源

配置NVIC

将时基源优先级设为1(数字越小优先级越高)

配置代码生成 code generstion

这样就不会每次更改cubemx都要进行注释这个两个中断函数了

移植测试引脚

生成Keil工程项目

当前工程还没将FreeRTOS复制过去

移植FreeRTOS到Keil 并配置

直接将 Middlewares 文件夹移动到 FreeRTOS_basic 工程路径下

再将 Middlewares 文件夹中的 FreeRTOSConfig.h 文件移动到 Inc 文件夹中,移动完成后开始配置Keil

配置Keil

添加文件分类

添加 FreeRTOSConfig.h 文件 有利于修改配置

配置include paths

添加这两个路径

FreeRTOSConfig.h 文件添加宏定义

/* FreeRTOS中断服务函数相关定义 */#definexPortPendSVHandlerPendSV_Handler#definevPortSVCHandlerSVC_Handler/* 可选函数, 1: 使能 */#defineINCLUDE_xTaskGetSchedulerState1/* 获取任务调度器状态 */

stm32f1xx_it.c 文件配置

添加头文件

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

配置中断服务函数

voidSysTick_Handler(void){/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 *//* USER CODE BEGIN SysTick_IRQn 1 */if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED){xPortSysTickHandler();}/* USER CODE END SysTick_IRQn 1 */}

引用函数extern void xPortSysTickHandler( void );

创建一个动态任务测试

将LED0每1000ms闪烁一次

#include"freertos_task.h"#include"FreeRTOS.h"#include"task.h"#include"main.h"#defineSTART_TASK_PRIO1/* 任务优先级 */#defineSTART_STK_SIZE128/* 任务堆栈大小 */TaskHandle_t StartTask_Handler;/* 任务句柄 */voidstart_task(void*pvParameters);/* 任务函数 */#defineTASK1_PRIO2/* 任务优先级 */#defineTASK1_STK_SIZE128/* 任务堆栈大小 */TaskHandle_t Task1Task_Handler;/* 任务句柄 */voidtask1(void*pvParameters);/* 任务函数 */voidfreertos_init(void){xTaskCreate((TaskFunction_t)start_task,/* 任务函数 */(constchar*)"start_task",/* 任务名称 */(uint16_t)START_STK_SIZE,/* 任务堆栈大小 */(void*)NULL,/* 传入给任务函数的参数 */(UBaseType_t)START_TASK_PRIO,/* 任务优先级 */(TaskHandle_t*)&StartTask_Handler);/* 任务句柄 */vTaskStartScheduler();}voidstart_task(void*pvParameters){taskENTER_CRITICAL();/* 进入临界区 *//* 创建任务1 */xTaskCreate((TaskFunction_t)task1,/* 任务函数 */(constchar*)"task1",/* 任务名称 */(uint16_t)TASK1_STK_SIZE,/* 任务堆栈大小 */(void*)NULL,/* 传入给任务函数的参数 */(UBaseType_t)TASK1_PRIO,/* 任务优先级 */(TaskHandle_t*)&Task1Task_Handler);/* 任务句柄 */vTaskDelete(StartTask_Handler);/* 删除开始任务 */taskEXIT_CRITICAL();/* 退出临界区 */}voidtask1(void*pvParameters){while(1){HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);vTaskDelay(1000);}}

在 main 函数中初始化 freertos_init 任务即可创建成功 并执行task1任务 每1s翻转一次电平,此次移植完成

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:51:50

大厂笔试“性格测试”和“情商题”真的能刷人?过来人教你如何准备(非技术篇攻略)

大厂笔试“性格测试”和“情商题”真的能刷人?揭秘非技术环节的底层逻辑与实战策略当技术能力达到一定水平后,大厂笔试中的非技术环节往往成为决定成败的关键分水岭。许多候选人在LeetCode上刷题数百道,却可能因为一道看似简单的图形推理题或…

作者头像 李华
网站建设 2026/6/10 14:44:19

AI照亮一切 却照不进人类心灵的暗处

《缓慢的暗处》我们正被光驯养。AI是这光,一种平滑、高效、无处不在的照明。它将事物的轮廓照得清晰,将选择照得黑白分明。在它的照耀下,世界运转如精密的钟表。我们习惯了被照亮的感觉——疑惑总在点击后消散,前路总在计算后明朗…

作者头像 李华
网站建设 2026/6/10 14:29:58

模板驱动型文档自动化:结构化思维重构文档生产流

1. 这不是“套模板填空”,而是用结构化思维重构文档生产流你有没有过这种体验:月底要交三份不同格式的客户提案,每份都要调封面、改页眉、统一字体、手动更新目录、反复核对页码——明明内容差不多,却硬生生花掉一整天在排版上&am…

作者头像 李华
网站建设 2026/6/10 14:22:00

iOS 27 更新:AirPods 配备自定义均衡器,音频调节灵活性大幅提升!

AirPods 迎来自定义均衡器,音频调节更灵活在即将推出的 iOS 27 更新中,AirPods 将配备自定义均衡器。这一功能允许用户调整 AirPods 播放任何音频的效果,可通过自定义配置文件调节低音、中音和高音,打破了此前苹果提供的固定音效配…

作者头像 李华