STM32 通用定时器基础中断配置函数及实验

一、通用定时器基础中断配置函数

1. HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)

功能:

以中断方式启动定时器的基础计数功能。

参数:

复制代码
htim:定时器句柄指针

特点:

启动定时器的计数器

使能定时器更新中断

当计数器达到自动重装载值时产生更新事件和中断

适合需要周期性执行任务的场景

2. __HAL_TIM_SET_AUTORELOAD(HANDLE, AUTORELOAD)

功能:

设置定时器的自动重装载值(ARR寄存器)。

参数:

复制代码
__HANDLE__:定时器句柄
__AUTORELOAD__:自动重装载值

特点:

这是一个宏定义,直接操作寄存器

决定定时器的计数周期

改变ARR值可以调整定时器中断频率
计算公式:定时周期 = (ARR + 1) × 时钟周期

3. __HAL_TIM_SET_COUNTER(HANDLE, COUNTER)

功能:

设置定时器计数器的当前值(CNT寄存器)。

参数:

复制代码
__HANDLE__:定时器句柄
__COUNTER__:计数器值

特点:

直接设置计数器的当前值

常用于重置计数器或设置特定起始值

修改后立即生效

4. HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim)

功能:

停止定时器的基础计数功能并禁用中断。

参数:

复制代码
htim:定时器句柄指针

特点:

停止定时器计数

禁用定时器更新中断

计数器保持当前值不变

需要时可以重新启动

5. HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

功能:

定时器周期更新回调函数,当定时器计数达到自动重装载值时自动调用。

参数:

复制代码
htim:触发回调的定时器句柄指针

特点:

需要用户重写的弱函数

在定时器更新中断服务程序中调用

适合执行周期性任务

应保持函数执行时间短

二、示例实验

1. LED原理图

2. KEY原理图

3. 实验现象

通过按键控制LED闪烁频率。当按下PA0按钮时,会在两种定时器周期模式间切换:快速模式和慢速模式,同时PA1、PA2、PA3三个LED会以当前设定的频率同步闪烁。每次按下按钮,LED的闪烁速度会在快慢两种模式之间切换。

4. 示例代码

GPIO初始化

复制代码
/**
  * @brief  GPIO初始化函数
  */
void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};  // GPIO配置结构体

  // 使能GPIO端口时钟
  __HAL_RCC_GPIOC_CLK_ENABLE();  // 使能GPIOC时钟
  __HAL_RCC_GPIOD_CLK_ENABLE();  // 使能GPIOD时钟
  __HAL_RCC_GPIOA_CLK_ENABLE();  // 使能GPIOA时钟

  // 设置GPIO初始输出电平
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);  // PA1,PA2,PA3初始化为高电平

  // 配置PA0为输入引脚(按键)
  GPIO_InitStruct.Pin = GPIO_PIN_0;        // 引脚0
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  // 输入模式
  GPIO_InitStruct.Pull = GPIO_NOPULL;      // 无上拉下拉
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  // 初始化PA0

  // 配置PA1,PA2,PA3为输出引脚(LED)
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;  // 引脚1,2,3
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;              // 推挽输出模式
  GPIO_InitStruct.Pull = GPIO_NOPULL;                      // 无上拉下拉
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;             // 低速输出
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);                  // 初始化PA1,PA2,PA3
}

TIM初始化

复制代码
/**
  * @brief  TIM2定时器初始化函数
  */
void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};  // 时钟源配置结构体
  TIM_MasterConfigTypeDef sMasterConfig = {0};      // 主模式配置结构体

  // 定时器基础配置
  htim2.Instance = TIM2;                           // 定时器实例TIM2
  htim2.Init.Prescaler = 7200-1;                   // 预分频值7199(7200分频)
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;     // 向上计数模式
  htim2.Init.Period = 1000-1;                      // 自动重装载值999
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频(不分频)
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; // 使能自动重装载预装载
  
  // 初始化定时器基础配置
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();  // 错误处理
  }

  // 配置时钟源
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;  // 内部时钟源
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();  // 错误处理
  }

  // 配置主模式
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;        // 主模式触发输出复位
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; // 禁用主从模式
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();  // 错误处理
  }
}

主函数

复制代码
uint16_t aaa[2] = {100-1, 1000-1};  // 定时器周期数组:快速模式99,慢速模式999
uint8_t mode = 0;                    // 模式标志:0-快速,1-慢速

// 系统时钟配置函数声明
void SystemClock_Config(void);

/**
  * @brief  应用程序主函数
  * @retval int
  */
int main(void)
{
  // HAL库初始化
  HAL_Init();

  // 系统时钟配置
  SystemClock_Config();

  // 初始化所有配置的外设
  MX_GPIO_Init();   // GPIO初始化
  MX_TIM2_Init();   // TIM2定时器初始化

  // 启动TIM2定时器中断
  HAL_TIM_Base_Start_IT(&htim2);

  // 主循环
  while (1)
  {
    // 检测PA0按键是否按下
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)
    {
      mode = !mode;  // 切换模式(0↔1)
      
      // 停止定时器中断
      HAL_TIM_Base_Stop_IT(&htim2);
      
      // 设置新的自动重装载值
      __HAL_TIM_SET_AUTORELOAD(&htim2, aaa[mode]);
      
      // 重置计数器为0
      __HAL_TIM_SET_COUNTER(&htim2, 0);
      
      // 重新启动定时器中断
      HAL_TIM_Base_Start_IT(&htim2);
      
      // 等待按键释放(简单消抖)
      while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET);
    }
  }
}

中断回调函数

复制代码
/**
  * @brief  定时器周期到达回调函数
  * @param  htim: 定时器句柄指针
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM2)  // 判断是否为TIM2触发
  {
    // 翻转PA1、PA2、PA3引脚电平(LED闪烁)
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
  }
}
相关推荐
wotaifuzao2 小时前
STM32最新的CubeMx v6-16-1下载及安装-包含固件库下载教程(免费提供下多版本载链接)(二)
stm32·单片机·嵌入式硬件·cubemx·stm32cubemx·stm32f407
youcans_2 小时前
【STM32-MBD】(1b)Matlab2025b 安装 STM32 硬件支持包
stm32·单片机·嵌入式硬件·matlab·simulink
anghost1502 小时前
基于 STC89C52 单片机的自动窗帘系统设计
单片机·嵌入式硬件
IT方大同3 小时前
SYSTICK、RCC应用
单片机·嵌入式硬件
v先v关v住v获v取3 小时前
汽车起重机大扭矩回转减速器设计“cad32张+三维图+设计说明书
科技·单片机·51单片机
小柯博客3 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网·嵌入式·yocto
d111111111d4 小时前
STM32平衡车开发计划2-电机编码器测速
笔记·stm32·单片机·嵌入式硬件·学习
夜月yeyue13 小时前
Linux 调度类(sched_class)
linux·运维·c语言·单片机·性能优化
日更嵌入式的打工仔13 小时前
实用:嵌入式执行时间测量常用方法
笔记·单片机