关于STM32 通用定时器初始化参数的理解

本文详细解析了STM32定时器初始化结构体TIM_TimeBaseInitTypeDef的各个成员及其作用,包括预分频因子TIM_Prescaler、计数模式TIM_CounterMode、溢出上限值TIM_Period等,阐述了定时器时钟源的选择和配置,适用于嵌入式硬件与软件开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时器初始化结构体定义为

typedef struct
{
  uint16_t TIM_Prescaler;        
                                       
  uint16_t TIM_CounterMode;     

  uint16_t TIM_Period;       

  uint16_t TIM_ClockDivision;   
  
  uint8_t TIM_RepetitionCounter; 
  
} TIM_TimeBaseInitTypeDef;       

其中:

  • TIM_Prescaler为预分频因子,取值范围为0x0000 到 0xFFFF,决定了定时器时钟频率。定时器时钟频率 = 定时器时钟源频率 / TIM_Prescaler。其中,定时器时钟源有4个:
    1) 内部时钟(CK_INT)
    2) 外部时钟模式 1:外部输入脚(TIx)
    3) 外部时钟模式 2:外部触发输入(ETR)
    4) 内部触发输入(ITRx):

这个时钟源是由寄存器TIMx_SMCR设置的,在手册中可以看出,它的复位值是0x00,如果不专门设置,(在使能了定时器的前提下)定时器时钟源选择的是内部时钟(CK_INT),它的频率是72MHZ(在系统频率SYSCLK是72MHz的情况下)。具体分析是,根据时钟树,SYSCLK为72MHz,AHB为72MHz,APB1被2分频变为36MHz,而根据时钟树上的话“如果APB1预分频系统=1则频率不变,否则乘2”,这里APB1被2分频,故需要乘2,定时器2~7的时钟频率就为72MHz。时钟树截图

  • TIM_CounterMode为计数模式,可以向上,向下或向上/向下计数,很简单,不多说。
  • TIM_Period是定时器的溢出上限值,定时器向上计数到TIM_Period或从TIM_Period向下计数到0时溢出。注意这个值是自动重新装载的。
  • TIM_ClockDivision仅用于定时器时钟源是“外部触发输入”(即之前说的第3个时钟源)时的情况,它是“外部触发输入时钟”的分频系数。在定时器时钟源是其他情况时(比如内部时钟72MHz)没有意义。
  • TIM_RepetitionCounter,这个只在高级定时器1和8中才有意义。
STM32通用定时器( TIM寄存器组)的初始化通常需要设置以下几个关键参数: 1. **TIM_TimeBaseInit结构体**:这是初始化定时器的基本结构体,主要包括: - `Prescaler` (预分频器):决定时钟信号如何分割到定时器内部,比如选择系统时钟、外部输入时钟等。 - `ArrivalTime` 或 `Counter`:定时器的最大计数值,用于计算定时周期。 - `AutoReload`:是否自动重装载计数器,在计数器溢出后是否自动回零并继续计数。 2. **TIM_PrescalerConfig函数**:配置预分频器的值,例如设置TIMx_APB1ENR寄存器的位来启用特定时钟源。 3. **TIM_Cmd函数**:控制定时器的使能状态,设置为 ENABLE 可以开始计时,DISABLE 则停止。 4. **TIM_TimeBaseInit结构体成员的具体设置**: - `Timer Prescaler`(计数器预分频器):如需使用系统时钟频率除以N,设置为系统时钟频率减去1。 - `Auto-reload` (自动重载模式):如果设置为 TRUE,计数器溢出后会自动从0开始再次计数。 - `ClockDivision`:对于某些高级定时器,可能还需要设置时钟分频系数。 ```c // 示例代码片段 TIM_TimeBaseInitTypeDef.TIM_Period = 5000; // 设置定时器最大计数周期为5000个计数单位 TIM_TimeBaseInit.TIM_Prescaler = SystemCoreClock / 8 - 1; // 预设基本时钟源,这里假设是APB1,8倍频 TIM_TimeBaseInit.TIM_ClockDivision = 0; // 如果有分频选项,设置为0 TIM_TimeBaseInit.TIM_CounterMode = TIM_COUNTER_MODE_UP; // 上升计数模式 HAL_TIM_Base_Init(&htim1, &TIM_TimeBaseInit); // 初始化通用定时器 HAL_TIM_Base_Start_IT(&htim1); // 开始定时器,并异步触发中断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值