在STM32中配置定时器以产生1毫秒中断的步骤如下:
1. 确定定时器时钟频率
假设系统主频为72MHz,定时器挂载在APB1总线(如TIM2),且APB1预分频系数为1,则定时器时钟为72MHz。
2. 计算预分频器和自动重载值(ARR)
- 目标周期:1ms = 0.001秒
- 定时器时钟:72MHz → 72,000,000 Hz
- 计数值:72,000,000 Hz × 0.001s = 72,000
- 分频与ARR设置:
- 预分频器(Prescaler):71 → 分频后时钟 = 72MHz / (71+1) = 1MHz(每微秒计数一次)
- ARR:999 → 计数1000次(0到999)后溢出,时间 = 1000 × 1µs = 1ms
3. 配置定时器(以标准外设库为例)
初始化定时器
#include "stm32f10x.h"
void TIM2_Init(void) {
TIM_TimeBaseInitTypeDef TIM_InitStruct;
// 使能TIM2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置定时器基础参数
TIM_InitStruct.TIM_Prescaler = 71; // 预分频值
TIM_InitStruct.TIM_Period = 999; // ARR值
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
// 使能更新中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
// 启动定时器
TIM_Cmd(TIM2, ENABLE);
}
配置NVIC
void NVIC_Configuration(void) {
NVIC_InitTypeDef NVIC_InitStruct;
// 设置中断优先级并启用TIM2中断
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
中断服务函数
void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志
// 用户自定义代码(如翻转LED)
// GPIO_ToggleBits(GPIOA, GPIO_Pin_0);
}
}
4. 主函数中调用初始化
int main(void) {
// 系统时钟初始化(假设已配置为72MHz)
SystemInit();
// 初始化NVIC和定时器
NVIC_Configuration();
TIM2_Init();
while(1) {
// 主循环
}
}
关键点说明
时钟计算:若系统频率不同,需重新计算预分频器和ARR值。公式为:
中断优先级:根据实际需求调整NVIC中的优先级设置。
HAL库适配:若使用HAL库,需调用
HAL_TIM_Base_Start_IT()
并实现回调函数HAL_TIM_PeriodElapsedCallback()
。
验证方法
- 在中断服务函数中翻转GPIO引脚,用示波器或逻辑分析仪测量波形周期是否为1ms。
- 使用调试器观察中断触发频率。
通过以上步骤,定时器将每1毫秒触发一次中断,用户可在中断服务函数中添加所需功能。