如何使用 STM32 定时器 TIM1 来管理定时任务
在 STM32 中,定时器是一种非常常见的外设,广泛应用于定时控制、PWM 输出、定时任务等场景。本文将展示如何使用 STM32 的定时器 TIM1 来管理定时任务,并通过回调函数实现任务的调度,避免使用传统的延时函数。我们将通过一个简单的例子来说明如何配置定时器、编写任务函数以及如何在 main.c 中调用这些任务。
- 介绍
在嵌入式开发中,定时器广泛应用于定时控制、PWM 输出以及事件驱动的编程。使用定时器中断代替延时函数是一种更高效、更精准的编程方法。STM32 提供了强大的定时器功能,能够精确控制时间并触发事件。本文通过 TIM1 定时器和任务函数指针实现一个简单的定时任务调度器。 - STM32CubeMX 配置 TIM1
首先,我们需要使用 STM32CubeMX 配置 TIM1 定时器,以便它可以周期性地触发中断。下面是配置步骤:
在CUBEMX中配置 TIM1
在 Peripherals 标签页下,找到 TIM1 并点击它。
在 TIM1 配置窗口中:
配置 TIM1 为 “Time Base” 模式(也可以选择 PWM 模式,取决于需求)。
配置 Prescaler 和 Auto-Reload Register (ARR) 以生成合适的时间周期。
假设你希望每 1 毫秒产生一次中断,可以设置:
Prescaler = 72 - 1(将 72 MHz 时钟分频为 1 MHz,即每个定时器周期为 1 微秒)。
ARR = 1000 - 1(定时器每 1 毫秒触发一次中断)。
启用 TIM1 中断:点击 “NVIC” 按钮,勾选 TIM1 update interrupt。
配置完成后,点击 Project -> Generate Code。
选择你使用的 IDE(如 STM32CubeIDE 或 KEIL),点击 Generate。 - 在 main.c 中使用定时器
在 main.c 中,我们需要通过定时器的中断回调函数来执行任务。我们会通过一个简单的例子来演示如何使用定时器管理任务。
步骤 1:包含头文件
首先,包含定时器任务相关的头文件 TIMER_TASKS.h,以便我们可以在 main.c 中使用定时器任务函数。
#include "TIMER_TASKS.h" // 包含定时器任务相关的头文件
步骤 2:定义定时任务
假设我们希望在定时器周期内切换一个 LED 状态,我们可以定义一个 LED_Toggle 函数:
void LED_Toggle(void) {
// 切换 LED 状态
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 假设 LED 连接在 GPIOB_PIN_0
}
然后,在 main.c 中设置定时器回调任务为 LED_Toggle:
int main(void) {
HAL_Init(); // 初始化 HAL 库
// 初始化硬件,如 GPIO、定时器等
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init(); // 初始化 TIM1
// 设置定时器任务
Timer1_SetTask(LED_Toggle);
// 启动 TIM1 定时器中断
HAL_TIM_Base_Start_IT(&htim1); // 启动 TIM1 中断
while (1) {
// 主循环代码