1. STM32定时器基础架构解析
STM32定时器是嵌入式开发中最核心的外设之一,其功能强大且应用广泛。以STM32F4系列为例,控制器包含2个高级控制定时器(TIM1/TIM8)、10个通用定时器(TIM2-TIM5/TIM9-TIM14)和2个基本定时器(TIM6/TIM7)。这些定时器在功能上形成层级关系:高级定时器 > 通用定时器 > 基本定时器。
定时器的核心功能单元包括:
- 时基单元:由16位预分频器(PSC)和16位自动重载寄存器(ARR)构成
- 计数器:支持向上、向下和中心对齐三种计数模式
- 捕获/比较通道:用于输入捕获或PWM输出
- 中断/DMA控制:用于事件触发
时钟树配置上,定时器时钟源可来自:
- 内部时钟(CK_INT):APB总线时钟经倍频后得到
- 外部时钟模式1:通过TIx引脚输入
- 外部时钟模式2:通过ETR引脚输入
- 内部触发输入:其他定时器级联
关键提示:使用外部时钟时需注意信号频率不得超过TIMx_CLK/4,否则需配置预分频器降频。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 定时中断实现详解
2.1 基本定时器配置流程
以TIM6基本定时器为例,实现定时中断需要以下步骤:
- 时钟使能:
c复制__HAL_RCC_TIM6_CLK_ENABLE();
- 时基结构体初始化:
c复制TIM_HandleTypeDef htim6;
htim6.Instance = TIM6;
htim6.Init.Prescaler = 8400-1; // 84MHz/8400 = 10kHz
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 5000-1; // 10kHz下计数5000次=0.5s
HAL_TIM_Base_Init(&htim6);
- 中断配置:
c复制HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
- 启动定时器:
c复制HAL_TIM_Base_Start_IT(&htim6);
2.2 中断服务函数实现
在stm32f4xx_it.c中添加:
c复制void TIM6_DAC_IRQHandler(void) {
HAL_TIM_IRQHandler(&htim6);
}
回调函数处理:
c复制void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if(htim->Instance == TIM6) {
HAL_GPIO_TogglePin
