围绕 STM32 中的 TIM6 和 TIM7,用 费曼学习法讲透这个模块,从原理、寄存器、应用,到完整代码例子,一步步来,让你真正理解,不再只是“调库”。
🧠 一、什么是基本定时器(TIM6/TIM7)
✅ 定义:
基本定时器是 STM32 中最简单的定时器,仅具备定时中断和触发事件功能,不支持 PWM、输入捕获等高级功能。
STM32 的基本定时器(比如 TIM6)像是一个闹钟,每次从 0 数到一个设定值(ARR),就“叮”一下(产生中断),你可以在中断里做点事,比如闪一下 LED。你可以通过设置“预分频器”(PSC)让它数得慢一点,比如 1 秒叮一次。它不管 PWM、不懂信号采集,就是一个“定时器闹钟”。
🔍 它们的核心特性是:
特性 | 说明 |
---|---|
没有通道 | 不能输出 PWM,也不能捕获输入信号 |
支持中断 | 可设置固定时间周期触发中断 |
可作为触发源 | 比如 DAC 的触发 |
配置简单 | 只需设定 计数周期 和 分频 |
✅ 实例:
STM32F103ZETx 芯片上有两个基本定时器:
-
TIM6
-
TIM7
⚙️ 二、基本定时器的工作原理
定时器 = 计数器 + 自动重装
计数器从 0 计数 → 达到 ARR 值 → 溢出 → 产生中断 → 从 0 再来
⏱️ 定时周期计算公式:
T定时周期=(ARR+1)×(PSC+1)FAPB1T_{定时周期} = \frac{(ARR + 1) \times (PSC + 1)}{F_{APB1}}
-
ARR
: 自动重装寄存器值(Auto Reload Register) -
PSC
: 预分频器(Prescaler) -
F_APB1
: APB1 时钟(一般 36MHz) -
T
: 期望的定时时间(秒)
🔍 举例:实现 1 秒中断一次
假设 APB1 = 36MHz
-
PSC = 35999
-
ARR = 999
T=(999+1)×(35999+1)36,000,000=1秒T = \frac{(999 + 1) \times (35999 + 1)}{36,000,000} = 1\text{秒}
🧰 三、关键寄存器(如果你不用 HAL,可以直接操作)
寄存器 | 含义 |
---|---|
PSC | 预分频器设置 |
ARR | 自动重装值(周期计数到这) |
CNT | 当前计数值 |
CR1 | 控制定时器启动、方向等 |
DIER | 中断使能寄存器 |
SR | 状态寄存器,判断 UIF 中断标志位 |
🧪 四、CubeMX + HAL + Keil 实现 TIM6 基本定时器中断
✅ 1. CubeMX 配置步骤:
-
打开 TIM6,设置为 Internal Clock
-
Prescaler:
35999
-
Counter Period:
999
-
NVIC ➜ 使能 TIM6 中断
✅ 2. main.c
关键代码
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM6_Init();
HAL_TIM_Base_Start_IT(&htim6); // 开启中断模式
while (1)
{
// 主循环啥也不用做
}
}
✅ 3. 添加中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 闪烁LED
}
}
✅ 4. TIM6 中断函数(自动生成,无需改动)
void TIM6_DAC_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim6);
}