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

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

相关文章:

  • Postman下载安装及简单入门
  • 59.Harmonyos NEXT 图片预览组件之PicturePreviewImage实现原理
  • 浅谈 JavaScript 对象:属性、方法与创建模式
  • 【网络协议安全】任务11:路由器配置与静态路由配置
  • C语言:5.20程序练习题
  • 第十篇《地形篇》
  • 树与二叉树的遍历
  • 数字图像处理与Python语言实现-Box模糊CUDA实现
  • 4-002:如何使用 MySQL 的 EXPLAIN 语句进行查询分析?
  • 国内IPD项目管理系统评测:7款工具对比与解析
  • 深度学习笔记35_Inception v1算法实战与解析
  • Kubernetes安全:集群保护的最佳实践
  • Nuxt3 使用 ElementUI Plus报错问题
  • Python控制语句 ——break和continue
  • 聚划算!三个模型对比预测!CNN-GRU、GRU、CNN三模型多变量时序光伏功率预测
  • 基于威胁的安全测试值得关注,RASP将大放异彩
  • 社交软件频繁更新,UI 设计在其中扮演什么角色?
  • ffmpeg + opencv 打静态库编译到可执行文件中
  • 布谷直播系统源码开发实战:从架构设计到性能优化
  • DeepSeek-R1思路训练多模态大模型-Vision-R1开源及实现方法思路
  • 怎么申请公司网址/宁波seo排名外包
  • 广州机械加工/建站 seo课程
  • 外贸公司做网站/免费crm系统手机版
  • 云南公司建网站多少钱/简述网站建设流程
  • wordpress 手机首页设置/做网站建设优化的公司排名
  • 做logo的著名网站/知名seo公司