当前位置: 首页 > article >正文

STM32定时器配置1毫秒中断

在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毫秒触发一次中断,用户可在中断服务函数中添加所需功能。


http://www.kler.cn/a/584811.html

相关文章:

  • Node.js Web 模块详解
  • 【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]
  • 接口自动化入门 —— JSON中的万能密码--JSONPath解析!
  • 基于javaweb的SpringBoot个人健康管理系统小程序微信小程序设计与实现(源码+文档+部署讲解)
  • Java 实现 Android ViewPager2 顶部导航:动态配置与高效加载指南
  • 【SpringBoot】MD5加盐算法的详解
  • RabbitMQ 实现原理及流程
  • 【数据结构】-哈夫曼树以及其应用
  • 【原创】springboot+vue校园新冠疫情统计管理系统设计与实现
  • git切换版本
  • 根据开始和结束日期,获取每一天和每个月的开始和结束日期的list
  • 深度对话:AI界的奥本海默与通用人工智能(AGI)的未来
  • 如何在Futter开发中做性能优化?
  • 前端面试:React生态有哪些?
  • Unity开发的抖音小游戏接入抖音开放平台中的流量主(抖音小游戏接入广告)
  • ubuntu 设置允许root远程登录
  • 使用联核科技四向穿梭车能给企业带来哪些效益?
  • CSS-基础选择器,字体属性,文本属性介绍
  • 【MySQL】基本操作 —— DDL
  • JVM 解释器和即时编译器有什么区别?