短文标题:PSC分频、ARR定周期、OPM停一次:基本定时器三要素

你有没有想过一个问题:STM32最简单的定时器能做什么?怎么用?基本定时器(TIM6/TIM7)是"定时器中的螺丝刀"------功能单一但实用。三要素:PSC分频降速,ARR定周期,OPM一次停。定时器核心三寄存器
定时周期 = (ARR+1) × (PSC+1) / 定时器时钟定时周期计算
目标:1ms中断,定时器时钟=72MHz
- 选PSC:PSC=71 → 分频后时钟 = 72MHz/72 = 1MHz(周期1µs)
- 算ARR:1ms = 1000µs → ARR=1000-1=999
TIM6->PSC = 71; // 分频
TIM6->ARR = 999; // 周期
TIM6->CR1 |= TIM_CR1_CEN; // 启动
应用1:数码管动态扫描
用TIM6定时中断,每5ms切换一位数码管,4位循环20ms,频率50Hz不闪烁。
void TIM6_IRQHandler(void)
{
static uint8_t index = 0;
// 关位选→改段选→开位选
index = (index+1) % 4;
TIM6->SR &= ~TIM_SR_UIF; // 清标志
}
应用2:OPM单脉冲模式(一次延时)
TIMx_CR1寄存器的OPM位(位3)使能单脉冲模式:
- OPM=0:连续计数(循环)
- OPM=1:单脉冲模式,计数到ARR后自动停止(CEN位清零),只触发一次
适合:上电延时启动、单次超时检测、按键消抖。
TIM6->CR1 |= TIM_CR1_OPM; // 单脉冲模式
TIM6->ARR = 20000; // 20ms @ 1MHz
TIM6->CR1 |= TIM_CR1_CEN; // 启动,一次后自动停
配置流程
// 1. 使能TIM6时钟
__HAL_RCC_TIM6_CLK_ENABLE();
// 2. 配置PSC和ARR
TIM6->PSC = 71;
TIM6->ARR = 999;
// 3. 使能更新中断
TIM6->DIER |= TIM_DIER_UIE;
// 4. NVIC使能
HAL_NVIC_SetPriority(TIM6_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(TIM6_IRQn);
// 5. 启动定时器
TIM6->CR1 |= TIM_CR1_CEN;
基本定时器 vs 通用定时器

这个故事的启示, 基本定时器功能不多,但"够用"。定时中断、动态扫描、单脉冲延时------不需要PWM和捕获的场景,基本定时器刚好合适。写在最后 TIM6/TIM7是入门定时器的起点。PSC分频、ARR定周期、OPM一次停------三要素学会,基本定时器就能玩转了。
(本文灵感源于于振南《新概念ARM32单片机》教程第6.4节、第6.5节。)
觉得有用?点赞、转发,让更多人看懂基本定时器的核心用法。
