stm32关于通用定时器的周期、频率计算公式

本文详细介绍了STM32定时器的中断实验,包括时基单元、时钟来源、预分频器和自动装载寄存器的工作原理。定时器时钟频率通过预分频系数(psc)进行分频,计数器频率为Tclk/(psc+1)MHz。当计数器达到预设的自动装载值时,会产生溢出中断。通过计算预分频系数和重装载值,可以精确设定定时器的周期。举例说明,配置定时器在默认系统时钟下生成1ms的时钟信号。内容适合嵌入式硬件和STM32开发者参考。

以下内容针对正点原子的定时器中断实验

定时器时基单元包含:

● 计数器寄存器(TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)——该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。
● 自动装载寄存器 (TIMx_ARR)

定时器的时钟来源(4个):

        1)内部时钟(CK_INT)
        2)外部时钟模式 1:外部输入脚(TIx)
        3)外部时钟模式 2:外部触发输入(ETR)
        4)内部触发输入(ITRx)


Tclk是定时器时钟源,默认情况下是72Mhz 。
我们将分配的时钟进行分频,指定分频值为psc,就将我们的Tclk分了psc+1,我们定时器的最终频率就是Tclk/(psc+1) MHz
这里的频率的意思就是1s中记 Tclk/(psc+1)M个数 (1M=10的6次方) ,每记一个数的时间为(psc+1)/Tclk ,很好理解频率的倒数是周期,这里每一个数的周期就是(psc+1)/Tclk 秒

通用定时器的主要部分是一个16位计数器和相关的自动装载寄存器。
此计数器时钟由预分频器分频得到,CK_INT -> TIMx_PSC -> CK_CNT。

APB1是通过对AHB分频得到,AHB是通过对SYSCLK分频得到。
当SYSCLK=72MHz,并且AHB分频系数=1时,AHB=72MHz。
当AHB=72MHz,并且APB1分频系数=2,APB1=36MHz,同时TIMxCLK=72MHz。

这里的 CK_INT 时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1,否则通用定时器 TIMx 的时钟 是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx 的时钟就等于 APB1 的时钟。上述APB1预分频系数=2,所以通用定时器TIM2~TIM5 = 72MHz。

图1.内部时钟选择

图2.通用定时器工作流程图

当满足以下条件时,会产生溢出事件,去触发中断或者DMA请求:

  • 向上计数:计数器从0开始计数至arr(重装载)值,产生溢出事件
  • 向下计数:计数器从arr值开始计数至0,产生溢出事件

定时器的周期计算:

psc:预分频系数 (16位寄存器,有效值1~65535)
arr:重装载数 (16位寄存器,有效值1~65535)
Tclk:定时器的输入时钟源(单位MHZ)

注:计数器的arr和时钟分频psc都要加1,因为这两个值是配置在寄存器中的,从0开始计数,故要加1输入值 = 设置值 - 1

公式:

计数器的时钟频率 f = CK_CNT = f(ck_psc) / (psc+1) = Tclk / (psc + 1)  ,对时钟源分频 。
Tout溢出时间 =  (1/f) * (arr+1)  = ((psc+1) / Tlck) * (arr+1) 

如:F103默认配置下,生成1ms的时钟:Tout = (( 1+35 ) / 36M ) * ( 1+999 ) = 1ms

参考博文:

stm32 基本定时器定时配置

STM32定时器定时计算公式

内容可能有误,欢迎评论指正更改

### STM32 TIM定时器周期的计算方法 STM32的TIM定时器周期的计算依赖于定时器的时钟源、预分频器(TIMx_PSC)和自动重载寄存器(TIMx_ARR)的配置。定时器周期可以通过以下公式计算: $$ \text{定时器周期} = \frac{(\text{TIMx_ARR} + 1) \times (\text{TIMx_PSC} + 1)}{\text{定时器时钟频率}} $$ 其中: - **TIMx_ARR** 是自动重载寄存器的值,决定了定时器计数到多少时触发一次更新事件(如中断或PWM周期结束)。 - **TIMx_PSC** 是预分频器的值,用于对定时器的输入时钟进行分频。 - **定时器时钟频率** 是定时器的输入时钟源频率,通常由系统时钟(SYSCLK)或APB总线时钟决定。如果APB预分频为1,则定时器的时钟频率等于APB时钟频率;否则,定时器的时钟频率是APB时钟的2倍[^4]。 #### 示例计算 假设定时器的时钟频率为 72 MHz,TIMx_PSC 设置为 71(即分频系数为72),TIMx_ARR 设置为 9999(即计数到10000次触发一次更新事件): $$ \text{定时器周期} = \frac{(9999 + 1) \times (71 + 1)}{72,000,000} = \frac{10000 \times 72}{72,000,000} = 0.01 \, \text{秒} $$ 因此,定时器周期为 **10毫秒**。 #### 定时器的中断频率 如果需要计算定时器中断的频率,则可以通过以下公式获得: $$ \text{中断频率} = \frac{\text{定时器时钟频率}}{(\text{TIMx_PSC} + 1) \times (\text{TIMx_ARR} + 1)} $$ 在上述示例中,中断频率为: $$ \text{中断频率} = \frac{72,000,000}{(71 + 1) \times (9999 + 1)} = \frac{72,000,000}{72 \times 10000} = 100 \, \text{Hz} $$ 这意味着定时器每秒触发100次中断。 #### 配置代码示例 以下是一个简单的代码示例,展示如何配置TIM2定时器以生成10毫秒的周期: ```c #include "stm32f10x.h" void TIM2_Init(void) { // 1. 使能TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 2. 配置TIM2 TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Prescaler = 71; // 预分频系数为72 TIM_TimeBaseStruct.TIM_Period = 9999; // 自动重载值为9999 TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频为1 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct); // 3. 使能TIM2 TIM_Cmd(TIM2, ENABLE); } int main(void) { TIM2_Init(); while (1) { // 等待定时器更新事件 while (!TIM_GetFlagStatus(TIM2, TIM_FLAG_Update)); // 清除更新标志 TIM_ClearFlag(TIM2, TIM_FLAG_Update); // 执行定时任务 } } ``` #### 定时器的中断配置 如果需要使用中断,则需要额外配置中断优先级并启用定时器中断。以下是中断配置的代码片段: ```c void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // 处理定时器中断 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志 } } int main(void) { TIM2_Init(); // 4. 配置定时器中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 5. 配置NVIC中断优先级 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); while (1) { // 主循环 } } ``` 通过上述配置,可以实现定时器的精确周期控制,并根据需要触发中断或执行其他操作。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值