KEIL MDK 使用配置工具和STM32CUBEMX工具新建项目 (二)- 添加FreeRTOS

本文介绍如何在STM32上集成FreeRTOS实时操作系统,包括解决中断函数重复定义问题、配置FreeRTOS参数、创建LED任务及配置中断优先级等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的基础上,添加FreeRTOS的步骤如下:

1. 打开MDK配置工具,选择FreeRTOS的相关组件

2. 编译项目,提示三个函数重复定义了:

.\Objects\TST4.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f3xx_it.o).
.\Objects\TST4.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f3xx_it.o).
.\Objects\TST4.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by cmsis_os2.o and stm32f3xx_it.o).

那么在 stm32f3xx_it.c 文件中将对应的这三个中断函数 weak 掉,再编译就通过了。

__weak void SysTick_Handler(void)

__weak void PendSV_Handler(void)

__weak void SVC_Handler(void)

3. 修改 FreeRTOSConfig.h 配置文件,MDK提供的配置向导页面比较直观,将tick改为100Hz,并使用tick hook。

4. 修改main.c文件,添加FreeRTOS相关头文件:

/* USER CODE BEGIN Includes */
#include "FreeRTOS.h" /* Must come first. */
#include "task.h"     /* RTOS task related API prototypes. */
#include "queue.h"    /* RTOS queue related API prototypes. */
#include "timers.h"   /* Software timer related API prototypes. */
#include "semphr.h"   /* Semaphore related API prototypes. */

添加LED task

// main() 函数--------------------------------------------------------------------------

  /* USER CODE BEGIN 2 */

    /* Create the queue receive task as described in the comments at the top
    of this file. */
    xTaskCreate(    prvLedTask,
                                    /* Text name for the task, just to help debugging. */
                                    "LED",
                                    /* The size (in words) of the stack that should be created
                                    for the task. */
                                    configMINIMAL_STACK_SIZE,
                                    /* A parameter that can be passed into the task.  Not used
                                    in this simple demo. */
                                    NULL,
                                    tskIDLE_PRIORITY + 2 ,
                                    NULL );

  /* USER CODE END 2 */
    vTaskStartScheduler();
// main() 函数结束--------------------------------------------------------------------------

 

添加 prvLedTask 函数

/* USER CODE BEGIN 4 */
static void prvLedTask( void *pvParameters )
{
        pvParameters = pvParameters;
    for( ;; )
    {
            HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
            vTaskDelay( 20 );
    }
}
 

修改SystemClock_Config() 函数中系统 Systic中断时间,使用 configTICK_RATE_HZ 这个FreeRTOS配置文件中的定义:

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/configTICK_RATE_HZ);
 

注意HAL_IncTick();函数原来是由 SysTick_Handler() 调用的,但添加了FreeRTOS之后,重新定义了这个中断指向 xPortSysTickHandler(),此时HAL_IncTick();无法执行,原来依赖于HAL_Delay延时的函数可能无法执行。
 

5. 添加中断优先级配置函数

static void prvSetupHardware( void )
{
    /* Ensure all priority bits are assigned as preemption priority bits
    if using a ARM Cortex-M microcontroller. */
//    NVIC_SetPriorityGrouping( 0 );
        HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
    /* TODO: Setup the clocks, etc. here, if they were not configured before
    main() was called. */
}
 

并在main中调用:

  /* USER CODE BEGIN SysInit */
    prvSetupHardware();    // HAL_Init() 中也进行了相同的配置,此处可以删除
  /* USER CODE END SysInit */

6. 编译项目,下载到MCU板,运行便可以看到LED闪。

7. 需要注意的是,如果调用了 STM32CubeMX 重新配置并生成代码,那么之前的 stm32f3xx_it.c 文件中三个中断函数,SystemClock_Config() 函数中系统 Systic中断时间 相关的代码会被恢复为默认代码,需要重新修改过了。

 

 

<think>好的,用户想了解如何使用STM32CubeMX配置FreeRTOS项目的教程或示例,并且需要下载资源。首先,我需要回忆一下之前提供的引用内容。引用1提到了一个项目地址,里面可能有相关的资源。引用2是一个配置实例,详细描述了如何通过CubeMX新建工程,版本是6.0.0。引用3则关于任务通知的教程,可能有GitHub链接。 用户需要的是配置FreeRTOS的教程示例,所以引用2中的步骤是关键。应该先指导用户如何在CubeMX新建项目,选择正确的MCU型号,然后配置FreeRTOS的参数,比如任务、队列、信号量等。同时,需要提到生成代码后的步骤,比如使用IDE打开项目,编译下载等。 另外,用户可能还需要具体的示例项目下载,引用1中的项目地址引用3的GitHub链接可以提供资源。需要确保这些链接是有效的,并且用户能够访问。同时,可能还需要补充一些常见问题,比如如何验证配置是否正确,或者如何处理依赖项的问题。 还要注意用户的真实需求,他们可能是在实际开发中遇到问题,需要详细的步骤示例代码。因此,回答需要结构清晰,分步骤说明,并且提供参考资料,让用户能够自行查找更多信息。此外,需要确保所有的LaTeX格式正确,符合之前提到的系统级指令,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式较少,更多是代码配置步骤。 最后,生成的相关问题应该围绕FreeRTOS配置的常见疑问,比如如何优化、添加任务,或者处理特定错误。这些问题需要与用户的需求紧密相关,帮助他们进一步解决问题。</think>### STM32CubeMX配置FreeRTOS项目教程 #### 1. 创建新工程 1. 打开STM32CubeMX,选择 **File -> New Project**。 2. 在MCU选择界面输入型号(如STM32F103C8),双击目标芯片进入配置界面[^2]。 #### 2. 配置FreeRTOS 1. 在 **Middleware** 分类下启用 **FREERTOS**。 2. 选择 **Interface** 模式为 **CMSIS_V2**(推荐兼容性更好)。 3. 在 **Tasks and Queues** 标签页添加任务,设置优先级、堆栈大小等参数。例如: ```c void StartDefaultTask(void *argument) { for(;;) { osDelay(1000); // 任务周期为1秒 } } ``` #### 3. 外设与时钟配置 1. 根据需求配置时钟树(如使用外部晶振并设置主频为72MHz)。 2. 启用必要的外设(如UART、GPIO等)并与FreeRTOS任务关联。 #### 4. 生成代码 1. 点击 **Project Manager**,设置工程名称、路径IDE(如Keil MDK)。 2. 勾选 **Generate peripheral initialization as a pair of .c/.h files**。 3. 点击 **GENERATE CODE** 生成项目文件。 #### 5. 验证与下载 1. 使用IDE打开工程,编译后下载到开发板。 2. 通过调试工具(如ST-Link)验证任务调度是否正常[^2]。 --- ### 示例项目资源 1. **已验证的配置实例**: 包含FreeRTOS任务、队列信号量实现的STM32F10xx工程,支持CubeMX 6.0.0:[项目地址](https://gitcode.com/Resource-Bundle-Collection/9c1e4)[^1]。 2. **任务通知案例**: GitHub仓库提供基于任务通知的FreeRTOS实现代码:[HaoJosephWen/FreeRtos_personal](https://github.com/HaoJosephWen/FreeRtos_personal)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值