FreeRTOS移植STM32详细步骤介绍【附代码示例】

我在查找FreeRTOS移植的相关教程特别少,所以想非常详细的介绍FreeRTOS移植stm32详细步骤,包括源码的下载,源码介绍,系统移植,代码验证等,每一步都有对应的介绍和解释,希望可以帮助到你们。


文章目录

  • 1. FreeRTOS源码的下载
  • 2. FreeRTOS源码介绍
  • 3. FreeRTOS系统移植
  • 4. 系统代码验证

  • 1. FreeRTOS源码的下载

    官网下载,仓库下载,镜像下载,百度网盘下载,私信我


    1.1 可以直到FreeRTOS官网去下载,【FreeRTOS官网传送门】,但是下载速度很慢,不翻墙的话不建议使用这个方法下载。

    1.1.1 官网页面如下,点击右上角或下方的下载入口


    1.1.2 进入下载页面有两个下载选项,

  • 第一个选项是FreeRTOS 202212.01,下载的数据包包含最新 FreeRTOS 内核、 FreeRTOS-Plus 库 和 AWS IoT 库,以及示例项目
  • 第二个选项是FreeRTOS 202210.01 LTS,数据包包含 FreeRTOS LTS 库,其中包括 FreeRTOS 内核和 IoT 库,但没有示例项目
  • 一般我们下载第一个就行


    1.2 直接通过仓库下载,【仓库地址传送门】,同样很慢,甚至打不开网页,也不建议使用这种方法。


    1.3 通过国内镜像下载,这种方式下载不受域名影响,是最直接的方式
    【国内镜像传送门】,建议使用


    1.3.1 打开链接页面


    1.3.2 点击下载/克隆,下载成功


    1.4 使用我上传到百度网盘的源码,是在官方网站直接下载的数据包,建议使用,起码比官网和仓库快

    链接:【百度网盘传送门】
    提取码:sqml


    1.5 以上方式都不行的可以直接私信我

    下载好的压缩包解压好的文件呀包含下面的内容:

    压缩包88.3MB,解压文件夹506MB


    2. FreeRTOS源码介绍

    前面的文章已经很详细介绍过了,可以直达前面的文章去了解源码结构,可以更好的帮助你理解移植的原理和FreeRTOS的实现原理。

    博客传送门:【FreeRTOS】详细目录结构和作用

    基本上可以概括为下面一张图:


    3. FreeRTOS系统移植

    3.1 准备好FreeRTOS源码和一个配置好的STM32项目工程,我使用的是之前一个已经成功实现的LED闪烁的工程


    3.2 在项目工程中创建一个FreeRTOS文件夹,里面存放所有的移植文件


    3.3 在刚才创建的FreeRTOS文件夹中,分别新建src、inc、port文件夹:

  • src文件夹用来存放源码
  • inc文件夹用来存放头文件
  • port文件夹用来存放移植平台的相关文件

  • 3.4 接下来我们将FreeRTOS源码的移植到我们新建的文件夹中

    3.4.1首先我们打开源码中的Soure文件夹中的protable文件夹,找到MemMang文件夹,这个文件夹中都是内存管理文件,我们只用到heap_4.c文件,将其复制到port文件夹中


    3.4.2 接着我们在刚才的portable文件夹中,找到RVDS文件夹,选择里面的ARM_M3中的port.c和portmacro.h两个文件,也复制到我们的工程文件port文件夹中


    3.4.3 回到source文件夹中,将这个文件夹中的.c文件全部复制到工程新建的src文件夹中



    3.4.4 在source文件夹中的include文件夹里全部都是FreeRTOS的头文件,将其添加到工程新建的inc文件夹中


    3.4.5 添加一个配置文件,在FreeRTOS文件夹中的demo文件夹中找到CORTEX_STM32F103_Keil文件夹,复制里面的FreerRTOSConfig.h文件到新建的FreeRTOS文件夹中


    3.5 接着我们添加文件路径,打开keil软件点击魔术棒,进入C/C++,在Include Paths中添加文件路径,将FreeRTO、src、inc、port的路径全部添加进来


    3.6 新建组将文件全部添加到工程中,点击魔术棒旁边的三个格子的图标,选择新建组,我们分别新建FreeRTOS_src、FreeRTOS_inc、FreeRTOS_port三个组,将工程文件夹src中的所有.c文件添加到FreeRTOS_src中,将工程文件夹inc中的所有.h文件添加到FreeRTOS_inc中(不包括.readme),将工程文件夹port中的文件(heap_4.c、port.c添加到FreeRTOS_port中,还有配置文件FreeRTOSConfig.h添加到FreeRTOS_inc组中


    3.7 完成中断函数的宏定义,在FreeRTOSConfig.h中,在条件编译中加入

    #define xPortPendSVHandler PendSV_Handler
    #define vPortSVCHandler SVC_Handler
    #define xPortSysTickHandler SysTick_Handler
    


    3.8 注释掉STM库函数中的三个中断空函数

    分别为:

    void SVC_Handler(void);
    void PendSV_Handler(void);
    void SysTick_Handler(void);
    

    至此,系统移植已经全部完成


    4. 系统代码验证

    4.1 首先在main文件中添加头文件FreeRTOS.h和task.h

    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    #include "FreeRTOS.H"
    #include "task.h"
    

    4.2 我们直接使用LED灯闪烁的代码进行验证,先创建一个任务函数

    static void task1(void *arg)
    {
    	while(1)
    	{
    		GPIO_ResetBits(GPIOC, GPIO_Pin_13);
    		vTaskDelay(500);
    		GPIO_SetBits(GPIOC, GPIO_Pin_13);
    		vTaskDelay(500);
    	}
    }
    

    4.3 在主函数中创建一个任务并开启任务调度器

    	xTaskCreate(task1,"task1",512,NULL,2,&task1Handler);
    	vTaskStartScheduler();
    

    4.4 当然要使用LED肯定要初始化串口,我们以GPIOC中的GPIO_Pin_13为例

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOC, &GPIO_InitStructure);
    

    4.5 main文件中的全部代码为

    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    #include "FreeRTOS.H"
    #include "task.h"
    
    TaskHandle_t task1Handler;
    
    static void task1(void *arg)
    {
    	while(1)
    	{
    		GPIO_ResetBits(GPIOC, GPIO_Pin_13);
    		vTaskDelay(500);
    		GPIO_SetBits(GPIOC, GPIO_Pin_13);
    		vTaskDelay(500);
    	}
    }
    int main(void)
    {
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOC, &GPIO_InitStructure);
    	
    	xTaskCreate(task1,"task1",512,NULL,2,&task1Handler);
    	vTaskStartScheduler();
    	
    }
    

    FreeRTOS常用函数传送口:【FreeRTOS】常用函数总结


    4.6 完成编译后可以烧录到开发板上进行验证


    4.7 或者使用keil自带的调试器进行调试
    4.7.1 首先在魔术棒中找到debug选项,选择use simulate,下面也要配置成相应的单片机型号


    4.7.2 点击调试按钮,在上方添加逻辑分析仪


    4.7.3 点击逻辑分析仪的setup,添加信号,我们使用的是stm32f103c8t6,所以信号为PORTC.13,不同的开发板可以查看配置的串口和单片机对应的寄存器,注意需要将信号类型选择为bit


    4.7.4 全速运行可以得到串口准确的波形

    你也可以创建多个任务,查看波形分析任务的执行情况


    项目工程完整代码传送口:
    链接:FreeRTOS示例工程
    提取码:k8uk

    物联沃分享整理
    物联沃-IOTWORD物联网 » FreeRTOS移植STM32详细步骤介绍【附代码示例】

    发表评论