STM32cubeMX配置FreeRTOS软件定时器

本文详细介绍了FreeRTOS中的软件定时器,包括其特性、如何使用cubeMX配置和代码实现。软件定时器分为一次性与周期性两种类型,通过设置回调函数在指定时间执行特定任务。文章还提供了配置软件定时器的步骤和代码示例,强调了定时器优先级的重要性,并展示了如何启动和停止定时器。

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

文章目录

前言

本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器。

1.软件定时器概述

一.软件定时器特性

软件定时器就是一个闹钟当时间到了就执行相对应的任务或者代码。软件定时器是基于系统滴答中断的。在FreeRTOS中我们可以设置无数个软件定时器。
指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期
(period)。

指定类型定时器有两种类型:
1.一次性
这类定时器启动后,它的回调函数只会被调用一次;可以手工再次启动它,但是不会自动启动它。
2.自动加载定时器
这类定时器启动后,时间到之后它会自动启动它;这使得回调函数被周期性地调用。

二、使用cubeMX生成软件定时器

1.开启软件定时器的相应宏
在这里插入图片描述
2.添加软件定时器
在这里插入图片描述
3.设置软件定时器参数
在这里插入图片描述
1.Timer Name:定时器名字
2.CallBack:定时器回调函数名字
3.Type:定时器类型选择(周期性,一次性)

三、代码讲解

1.定时器相关宏修改
我们在这里需要将configTIMER_TASK_PRIORITY这个宏进行修改这个宏代表的是软件定时器的优先级,软件定时器优先级如果设置的太低将会导致软件定时器无法运行,所以要修改相应的宏。

/* Software timer definitions. */
#define configUSE_TIMERS                         1
#define configTIMER_TASK_PRIORITY                3//( 2 )
#define configTIMER_QUEUE_LENGTH                 10
#define configTIMER_TASK_STACK_DEPTH             256

2.创建定时器及开启软件定时器

/* Create the timer(s) */
/* definition and creation of myTimer01 */
osTimerDef(myTimer01, Callback01);
myTimer01Handle = osTimerCreate(osTimer(myTimer01), osTimerPeriodic, NULL);

/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */

下面代表的是选择定时器是一次性的还是周期性的

typedef enum  {
  osTimerOnce             =     0,       ///< one-shot timer
  osTimerPeriodic         =     1        ///< repeating timer
} os_timer_type;

软件定时器回调函数

/* Callback01 function */
void Callback01(void const * argument)
{
  /* USER CODE BEGIN Callback01 */
   
  /* USER CODE END Callback01 */
}

开启软件定时器

osTimerStart(myTimer01Handle,1000);//1000代表回调函数回调周期

总结

一般我们只会使用到硬件定时器,但是在硬件定时器不足的时候我们可以创建软件定时器来代替硬件定时器的使用。

<think>我们参考用户提供的引用资料,特别是引用[1]和引用[3]中关于使用STM32CubeMX配置FreeRTOS的指导。用户希望了解在STM32CubeMX中如何配置FreeRTOS。以下为详细步骤: ### 步骤1:启用FreeRTOS 1. 打开STM32CubeMX,创建新工程并选择STM32F103VETx芯片。 2. 在`Pinout & Configuration`选项卡中,左侧选择`Middleware`(中间件)。 3. 在中间件列表中选择`FREERTOS`,并在右侧模式选择框中选择`Interface`为`CMSIS_V2`(这是FreeRTOS的CMSIS-RTOS API V2版本,推荐使用)[^1][^3]。 ### 步骤2:配置FreeRTOS参数 在`FREERTOS`配置界面中,有多个子选项卡: - **Config parameters**:配置FreeRTOS核心参数 - `TICK_RATE_HZ`:设置系统节拍频率(通常设为1000Hz,即1ms一个节拍)[^2]。 - `TOTAL_HEAP_SIZE`:设置堆大小(根据任务需求调整,例如STM32F103VET6有64KB RAM,可设为40KB左右)。 - `USE_PREEMPTION`:选择是否启用抢占式调度(通常启用)。 - `MAX_PRIORITIES`:设置最大优先级数(默认16,通常够用)。 - `MINIMAL_STACK_SIZE`:最小任务栈大小(单位字,默认128,可适当增加)。 - `USE_TIME_SLICING`:是否启用时间片轮转(通常启用)。 - **Include parameters**:选择包含的功能 - 启用`vTaskDelay`、`vTaskDelayUntil`等所需API。 - 根据需求启用软件定时器、事件组、流缓冲区等高级功能。 - **User constants**:定义用户常量(可选) ### 步骤3:配置系统时基源(关键步骤) - 在`Pinout & Configuration`选项卡左侧,进入`System Core` > `SYS`。 - 将`Timebase Source`(时基源)从默认的`SysTick`改为其他定时器(如`TIM2`)[^3]。 > **原因**:FreeRTOS会占用SysTick作为系统节拍定时器,因此需要将HAL库的时基源切换到其他定时器,避免冲突。 ### 步骤4:创建任务 1. 在`Tasks and Queues`选项卡中,点击`Add`按钮创建新任务。 2. 配置任务参数: - `Task Name`:任务名称(如`LED_Task`) - `Priority`:优先级(数字越大优先级越高) - `Stack Size`:栈大小(单位字节,通常至少128字×4字节=512字节) - `Entry Function`:任务入口函数名(自动生成,如`StartLEDTask`) - `Code Generation Option`:代码生成选项(建议选`As weak`) ### 步骤5:生成代码 1. 进入`Project Manager`选项卡: - 设置工程名称和路径。 - 在`Code Generator`中勾选`Generate peripheral initialization as a pair of '.c/.h' files`(推荐)。 2. 点击`GENERATE CODE`生成代码。 ### 步骤6:编写任务代码 在生成的工程中: - 任务函数模板位于`Src/freertos.c`(或用户指定的文件)。 - 在弱定义的入口函数中编写任务逻辑: ```c void StartLEDTask(void *argument) { for(;;) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); osDelay(500); // 使用FreeRTOS延时函数(500ms) } } ``` ### 验证配置 在`main.c`中检查: ```c int main(void) { HAL_Init(); SystemClock_Config(); MX_FREERTOS_Init(); // FreeRTOS初始化 osKernelStart(); // 启动内核 while (1) {} } ``` ### 注意事项 1. **堆空间分配**:在`FreeRTOSConfig.h`中检查`configTOTAL_HEAP_SIZE`是否与CubeMX设置一致。 2. **中断优先级**:FreeRTOS要求最低几个中断优先级(如STM32中优先级5-15)留给系统,确保: ```c #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 ``` 3. **时钟一致性**:确认`SystemCoreClock`变量(在`system_stm32f1xx.c`中)与实际系统时钟匹配[^2]。 > **性能提示**:使用`osDelay`代替`HAL_Delay`,因为后者依赖HAL时基源且会阻塞整个系统。 §§相关问题§§ 1. 如何在STM32CubeMX配置FreeRTOS的低功耗模式? 2. FreeRTOS任务栈溢出检测如何实现? 3. STM32CubeMX生成的FreeRTOS工程中如何添加软件定时器? 4. 如何调整FreeRTOS的内存分配方案(heap_1至heap_5)? 5. 在FreeRTOS中如何安全调用HAL库的延时函数?</think>### 在STM32CubeMX配置FreeRTOS的完整步骤 以下是针对STM32F103VET6的FreeRTOS配置流程(基于STM32CubeMX 6.9+版本): #### 1. 创建工程并选择芯片 1. 打开STM32CubeMX → 新建工程 2. 在搜索框输入`STM32F103VETx`并选择对应芯片 #### 2. 配置系统时钟(关键步骤) - 左侧导航栏选择 **Clock Configuration** - 配置时钟树: ``` HSE(外部晶振)→ PLL PLLCLK = HSE * 9 = 72MHz SYSCLK = PLLCLK = 72MHz AHB Prescaler = /1 → 72MHz APB1 Prescaler = /2 → 36MHz(不超过36MHz限制) APB2 Prescaler = /1 → 72MHz ``` #### 3. 启用FreeRTOS(核心配置) 1. 左侧导航栏选择 **Middleware** 2. 找到 **FREERTOS** 并启用 3. 选择接口模式:`CMSIS_V2`(推荐) ![FreeRTOS启用界面](https://www.st.com/bin/ecommerce/api/image.PF262393.en.feature-description-include-personalized-no-cpn-large.jpg) [^1] #### 4. 关键参数配置 在 **FREERTOS** 配置页面修改: ```c /* 基本参数 */ TICK_RATE_HZ = 1000 // 1ms节拍周期 TOTAL_HEAP_SIZE = 32768 // 堆大小(32KB,根据RAM调整) /* 调度选项 */ USE_PREEMPTION = Enabled // 启用抢占式调度 MAX_PRIORITIES = 56 // 优先级数量 MINIMAL_STACK_SIZE = 128 // 最小任务栈(单位:字) /* 时间片配置 */ USE_TIME_SLICING = Enabled // 启用时间片轮转 ``` #### 5. 配置时基源(关键!) 1. 左侧导航栏选择 **System Core** → **SYS** 2. 将 **Timebase Source** 改为除SysTick外的定时器(如TIM2) > **为什么必须修改?** > FreeRTOS会独占SysTick作为系统节拍定时器[^3],HAL库需要另一个定时器作为时基源 #### 6. 创建任务 1. 在 **Tasks and Queues** 选项卡点击 **Add** 2. 配置任务参数: ```c Task Name: LED_Task Priority: osPriorityNormal (24) Stack Size: 128 * 4 = 512字节 Entry Function: StartLEDTask (自动生成) ``` 3. 重复添加其他任务(如UART_Task等) #### 7. 生成代码 1. 进入 **Project Manager** 选项卡 2. 设置工程名称/路径,选择IDE(MDK-ARM/IAR/STM32IDE) 3. **关键选项**: - 勾选 `Generate peripheral initialization as a pair of '.c/.h' files` - 在 **Advanced Settings** 中确保FreeRTOS的钩子函数选项正确 4. 点击 **GENERATE CODE** #### 8. 编写任务代码 在生成的工程中编辑任务函数(示例LED闪烁任务): ```c /* freertos.c */ void StartLEDTask(void *argument) { for(;;) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 翻转LED // 使用FreeRTOS延时(非HAL_Delay!) osDelay(500); // 500ms延时 // 或使用精确延时宏 // vTaskDelay(pdMS_TO_TICKS(500)); } } ``` #### 9. 启动FreeRTOS内核 在`main.c`中确认启动流程: ```c int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_FREERTOS_Init(); // FreeRTOS初始化 osKernelStart(); // 启动内核 ← 关键调用! while (1) {} // 不会执行到这里 } ``` #### 验证配置 1. 编译下载程序 2. 使用逻辑分析仪测量: - PB0引脚:应有500ms周期方波 - SysTick中断频率:1kHz(每1ms一次) > **最佳实践**: > 1. 在`FreeRTOSConfig.h`中检查生成的配置 > 2. 使用`uxTaskGetStackHighWaterMark()`监控栈使用 > 3. 优先使用`osDelay()`而非`vTaskDelay()`(CMSIS-RTOS V2封装更安全)[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值