一.流程

1. 准备工作

  • 安装 Keil5:从 Keil 官方网站下载并安装 Keil5 MDK(Microcontroller Development Kit),安装过程中需要选择合适的 ARM 编译器支持包。
  • 安装 STM32F103 芯片支持包:打开 Keil5,通过 Pack Installer 安装 STM32F103 系列的芯片支持包,这样 Keil5 才能识别并支持该芯片。
  • 下载 FreeRTOS 源码:从 FreeRTOS 官方网站下载最新的 FreeRTOS 源码包,并解压到本地。

2. 创建 Keil5 项目

  1. 打开 Keil5,选择 Project -> New μVision Project
  2. 在弹出的对话框中,选择项目保存的路径并输入项目名称,点击 保存
  3. 在 Device 选项卡中,选择 STMicroelectronics -> STM32F1 Series -> STM32F103,选择具体的芯片型号(如 STM32F103C8),点击 OK
  4. 在弹出的 Manage Run - Time Environment 对话框中,勾选 CMSIS -> CORE 和 Device -> Startup,点击 OK

3. 添加 FreeRTOS 源码到项目

  1. 复制 FreeRTOS 源码到项目目录:在项目目录下创建一个名为 FreeRTOS 的文件夹,将解压后的 FreeRTOS 源码中的 Source 文件夹复制到该目录下。
  2. 添加 FreeRTOS 源文件到项目:在 Keil5 的 Project 窗口中,右键点击项目名称,选择 Manage Project Items
  3. 在 Groups 选项卡中,点击 Add Group,创建一个名为 FreeRTOS 的组。
  4. 选择 FreeRTOS 组,点击 Add Files,将 FreeRTOS/Source 文件夹下的所有 .c 文件添加到项目中。注意,portable 文件夹下只需要添加对应编译器和芯片架构的文件,对于 Keil5 和 STM32F103,需要添加 portable\RVDS\ARM_CM3 文件夹下的 port.c 和 portmacro.h,以及 portable\MemMang 文件夹下的 heap_4.c
  5. 添加完成后,点击 OK

4. 配置 FreeRTOS 头文件路径

  1. 右键点击项目名称,选择 Options for Target
  2. 在 C/C++ 选项卡中,点击 Include Paths 后面的按钮,添加 FreeRTOS 头文件的路径,包括 FreeRTOS/Source/include 和 FreeRTOS/Source/portable/RVDS/ARM_CM3
  3. 点击 OK 保存配置。

5. 配置 FreeRTOSConfig.h 文件

  1. 从 FreeRTOS 源码的 Demo 文件夹中找到适合 STM32F103 的 FreeRTOSConfig.h 文件,复制到项目目录下。
  2. 可以根据项目需求对 FreeRTOSConfig.h 文件进行修改,例如设置任务优先级范围、时钟节拍频率等。在下面有一个简单的配置示例:

6. 编写 FreeRTOS 应用代码

以下以下是基于 STM32F103 在 Keil 环境下使用 FreeRTOS 实现 PA8 和 PA9 引脚交替闪烁(PA8 2 秒闪烁一次,PA9 0.5 秒闪烁一次)的代码示例:

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

// 任务1:控制PA8引脚,2秒闪烁一次
void vTaskLED8(void *pvParameters) {
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA8为推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    while (1) {
        GPIO_SetBits(GPIOA, GPIO_Pin_8);
        vTaskDelay(pdMS_TO_TICKS(2000)); // 延迟2秒
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        vTaskDelay(pdMS_TO_TICKS(2000)); // 延迟2秒
    }
}

// 任务2:控制PA9引脚,0.5秒闪烁一次
void vTaskLED9(void *pvParameters) {
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA9为推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    while (1) {
        GPIO_SetBits(GPIOA, GPIO_Pin_9);
        vTaskDelay(pdMS_TO_TICKS(500)); // 延迟0.5秒
        GPIO_ResetBits(GPIOA, GPIO_Pin_9);
        vTaskDelay(pdMS_TO_TICKS(500)); // 延迟0.5秒
    }
}

int main(void) {
    // 创建任务1
    xTaskCreate(vTaskLED8, "LED8Task", 128, NULL, 1, NULL);
    // 创建任务2
    xTaskCreate(vTaskLED9, "LED9Task", 128, NULL, 1, NULL);

    // 启动调度器
    vTaskStartScheduler();

    // 如果调度器启动失败,程序会执行到这里
    while (1);
}

7. 编译和下载程序

  1. 点击 Keil5 工具栏中的 Build 按钮编译项目,如果代码没有错误,会在输出窗口显示编译成功的信息。
  2. 连接 STM32F103 开发板到电脑,通过 ST - Link 或其他下载工具将生成的 .hex 文件下载到开发板。
  3. 下载完成后,开发板上的 LED 灯应该会按照程序设定的逻辑闪烁。

其他参考(一定要看)

三分钟移植FreeRTOS - 知乎

二.问题与补充

1.选对要下载的FreeRTOS,地址FreeRTOS™ - FreeRTOS™

2. 新手选对要下载的文件

3.FreeRTOSConfig.h在那里

stm32f10x芯片的的地址在

...FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_IAR

直接就能看到

 4. FreeRTOSConfig.h中添加必须的四个宏 与 stm32f10x_it.c中必须注释的内容(你也不想你的小灯灯他不亮吧,嘿嘿嘿)

/* 添加必须的四个宏 */
#define xPortPendSVHandler              PendSV_Handler
#define vPortSVCHandler                 SVC_Handler
#define xPortSysTickHandler	        SysTick_Handler
#define INCLUDE_xTaskGetSchedulerState  1

5.port在哪添加

portable 文件夹下只需要添加对应编译器和芯片架构的文件,对于 Keil5 和 STM32F103,需要添加 portable\RVDS\ARM_CM3 文件夹下的 port.c 和 portmacro.h,以及 portable\MemMang 文件夹下的 heap_4.c

.....\FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS\ARM_CM3 

(.h文件添加到include中

.....\FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source\portable\MemMang

(只要heap_4.c

6.FreeRTOSConfig.h配置与注释

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

// 启用抢占式调度,1表示开启,高优先级可抢占低优先级任务
#define configUSE_PREEMPTION 1 
// 禁用空闲任务钩子函数,1启用,可在空闲任务执行时添加自定义操作
#define configUSE_IDLE_HOOK 0 
// 禁用时钟节拍钩子函数,1启用,在时钟节拍中断时可执行自定义代码 
#define configUSE_TICK_HOOK 0 
// 设置CPU时钟频率为72000000Hz,需依实际硬件配置
#define configCPU_CLOCK_HZ ((unsigned long ) 72000000 )
// 定义时钟节拍频率为1000Hz,即1ms一个节拍 
#define configTICK_RATE_HZ (( TickType_t ) 1000 )
// 系统最大任务优先级数量为5,优先级范围0 - 4 
#define configMAX_PRIORITIES ( 5 )
// 空闲任务最小栈大小为128(单位依平台) 
#define configMINIMAL_STACK_SIZE (( unsigned short ) 128 )
// 总堆内存大小为17 * 1024字节,用于动态内存分配 
#define configTOTAL_HEAP_SIZE (( size_t ) ( 17 * 1024 ) )
// 任务名称最大长度为16个字符 
#define configMAX_TASK_NAME_LEN ( 16 )
// 禁用跟踪功能,1启用,用于监控系统运行状态 
#define configUSE_TRACE_FACILITY 0 
// 不使用16位时钟节拍计数器,用32位 
#define configUSE_16_BIT_TICKS 0 
// 空闲任务应让出CPU资源,0表示不让出 
#define configIDLE_SHOULD_YIELD 1 

// 启用vTaskPrioritySet函数,1表示启用,用于设置任务优先级
#define INCLUDE_vTaskPrioritySet 1 
// 启用uxTaskPriorityGet函数,1表示启用,用于获取任务优先级
#define INCLUDE_uxTaskPriorityGet 1 
// 启用vTaskDelete函数,1表示启用,用于删除任务
#define INCLUDE_vTaskDelete 1 
// 禁用vTaskCleanUpResources函数,1表示启用,用于清理任务相关资源
#define INCLUDE_vTaskCleanUpResources 0 
// 启用vTaskSuspend函数,1表示启用,用于挂起任务
#define INCLUDE_vTaskSuspend 1 
// 启用vTaskDelayUntil函数,1表示启用,用于使任务延迟到指定时间
#define INCLUDE_vTaskDelayUntil 1 
// 启用vTaskDelay函数,1表示启用,用于使任务延迟指定时间
#define INCLUDE_vTaskDelay 1 

// 配置内核中断优先级为255,该值用于设置内核相关中断的优先级,
// 具体数值需根据硬件和系统需求合理调整,数值大小含义依平台而定
#define configKERNEL_INTERRUPT_PRIORITY 255
// 配置最大系统调用中断优先级为191,限制系统调用相关中断的最高优先级,
// 可避免高优先级系统调用中断影响系统稳定性和实时性
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191
// 配置FreeRTOS库使用的内核中断优先级为15,
// 用于设定库中涉及的内核中断在系统中的优先级水平
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15

/* 添加必须的四个宏 */
#define xPortPendSVHandler              PendSV_Handler
#define vPortSVCHandler                 SVC_Handler
#define xPortSysTickHandler	        SysTick_Handler
#define INCLUDE_xTaskGetSchedulerState  1

#endif /* FREERTOS_CONFIG_H */

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐