STM32F103C8T6(TIM定时器)实战:从基础中断到PWM电机控制全解析

1. TIM定时器基础与中断配置

STM32F103C8T6的TIM定时器是嵌入式开发中非常重要的外设,它不仅能实现精确的定时功能,还能处理各种复杂的时序控制任务。我刚开始接触STM32的时候,最常用的就是TIM定时器来做各种时间相关的控制,比如延时、定时采集数据等。

TIM定时器本质上就是一个计数器,它可以对时钟脉冲进行计数,当计数值达到我们设定的阈值时,就会触发中断或者产生其他事件。STM32F103C8T6内部有72MHz的主频,如果不进行分频,计数器每秒钟会计数7200万次,这样的速度对于大多数应用来说都太快了,所以我们需要使用预分频器来降低计数频率。

预分频器的工作原理很有意思,它实际上是一个分频计数器。比如设置预分频值为7199,那么每7200个时钟脉冲才会产生一个计数脉冲,这样就把72MHz的时钟频率降低到了10kHz。配合16位的自动重装载寄存器,最大可以实现65.536ms的定时。如果需要更长的定时时间,可以通过多次中断来实现。

在实际项目中配置定时器中断时,有几个坑我踩过很多次。首先是预分频器的缓冲机制,修改预分频值后不会立即生效,而是要等到更新事件发生时才会更新。这就导致有时候定时时间不准,解决办法是在初始化完成后手动清除更新标志位。另一个常见问题是中断服务函数中执行了太耗时的操作,导致后续中断被延迟甚至丢失。

下面是一个基本的定时器中断配置代码,我习惯把定时器相关的操作都封装成独立的模块:

// Timer.h
#ifndef _TIMER_H_
#define _TIMER_H_
#include "stm32f10x.h"

void Timer_Init(void);
#endif

// Timer.c
#include "Timer.h"

void Timer_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1;     // 自动重装载值
    TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1;   // 预分频值
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
    
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
    
    TIM_Cmd(TIM2, ENABLE);
}

这个配置实现了1秒的定时中断,预分频值7200将72MHz分频到10kHz,自动重装载值10000表示计数10000次产生一次中断,这样中断周期就是1秒。在实际使用中,我建议根据具体需求调整这两个参数,既要考虑定时精度,也要注意不要产生太频繁的中断影响系统性能。

2. 外部时钟模式与脉冲计数

除了使用内部时钟源,STM32的定时器还可以使用外部时钟源,这个功能在实际项目中非常实用。我经常用它来测量旋转编码器的脉冲、计数传感器的信号,或者作为外部事件的计数器。

外部时钟模式有两种配置方式:模式1和模式2。模式1使用定时器的输入通道作为时钟源,模式2使用专门的ETR引脚。在STM32F103C8T6上,TIM2的ETR引脚复用在PA0上,这个信息在数据手册中可以查到,但我建议直接查看芯片的引脚定义图更直观。

配置外部时钟模式时需要注意信号的电平特性。如果外部信号有抖动,需要配置输入滤波器的参数。滤波器实际上是一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值