STM32定时器核心知识
-
定时器类型
- 基本定时器(TIM6/TIM7)
- 仅支持向上计数,无输入捕获/输出比较功能
- 用于基础定时、DMA触发、DAC同步
- 通用定时器(TIM2-TIM5, TIM9-TIM14)
- 支持向上/向下计数、输入捕获、输出比较、PWM生成
- 可连接外部时钟源
- 高级定时器(TIM1/TIM8)
- 支持通用定时器所有功能 + 死区控制、互补输出
- 用于电机控制、电源转换等复杂场景
- 基本定时器(TIM6/TIM7)
-
关键功能
- 定时模式
- 通过预分频器(PSC)和自动重载寄存器(ARR)控制时间
- 计算公式:
定时时间 = (ARR+1) * (PSC+1) / 时钟频率
- 输入捕获
- 测量外部信号脉宽/频率(如编码器信号)
- 输出比较
- 生成PWM、单脉冲或定时中断
- PWM生成
- 通过占空比(CCR寄存器)控制输出波形
- 定时模式
-
时钟源配置
- 内部时钟(默认APB总线时钟)
- 外部时钟(外部引脚输入)
- 内部触发互联(级联定时器)
-
中断与DMA
- 支持更新中断、捕获/比较中断
- DMA请求用于定时器事件触发数据传输
使用示例
一.PWM波占空比丝滑调节
CubeMX配置:
- 选择TIM3通道1(PA6)为PWM输出
- 时钟源:72MHz
- 预分频PSC=72-1(1MHz)
- 自动重载值ARR=1000-1(周期1ms)
- 脉冲宽度初始值Pulse=500(50%占空比)
代码实现:
// 主循环中实现渐变
while (1) {
for(uint16_t duty=0; duty<=1000; duty+=10) {
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty);
HAL_Delay(10);
}
for(uint16_t duty=1000; duty>0; duty-=10) {
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty);
HAL_Delay(10);
}
}
二.步进电机频率控制(占空比不变)
CubeMX配置:
- 选择TIM4通道1(PB6)为PWM输出
- 初始频率1kHz(PSC=72-1,ARR=1000-1)
- 固定占空比50%(Pulse=500)
代码实现:
void Set_Frequency(uint32_t freq) {
uint32_t new_arr = (72000000 / (72 * freq)) - 1;
__HAL_TIM_SET_AUTORELOAD(&htim4, new_arr);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, new_arr/2); // 保持50%占空比
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
}
// 示例:频率从1Hz渐变到1kHz
for(uint32_t freq=1; freq<=1000; freq++) {
Set_Frequency(freq);
HAL_Delay(10);
}
三.定时器计时功能
CubeMX配置:
- 选择TIM2为基本定时器
- 预分频PSC=7200-1(10kHz)
- 自动重载值ARR=10000-1(1秒中断)
代码实现:
volatile uint32_t timer_count = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if(htim->Instance == TIM2) {
timer_count++;
}
}
// 启动定时器
HAL_TIM_Base_Start_IT(&htim2);
// 使用示例
uint32_t get_seconds() {
return timer_count;
}
关键公式说明:
- PWM频率:
fPWM=fCLK/[(PSC+1)×(ARR+1)] - 占空比计算:
DutyCycle=CCR/(ARR+1)×100%