STM32 定时器时间设定及计算最简单理解

该文章介绍了STM32的定时器初始化过程,特别是如何计算定时时间。通过示例代码解释了TIM_Period和TIM_Prescaler的设置,以及如何根据定时器时钟频率来确定定时时间,例如,设置TIM_Period为5000,TIM_Prescaler为84,在84MHz的定时器时钟频率下,可以实现5ms的定时。

玩了一段时间STM32,没有经过系统学习,对这个定时器定时时间计算理解很懵懂!
如下面定时器初始化代码

void timer7_init(u16 clock,u16 Preiod)//void timer7_init(84,5000)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE); 
    TIM_DeInit(TIM7);
    /*TIM_Period=自动装载值,TIM_Prescaler=预分频值*/
    TIM_TimeBaseStructure.TIM_Period = Preiod - 1;  //5000定时器预分频器
    TIM_TimeBaseStructure.TIM_Prescaler = clock - 1;  //84 预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟频率不分频
    /*TIM_CounterMode:定时器计数方式,可为向上计数、向下计数以及中心对齐模式*/
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);
    TIM_ClearFlag(TIM7,TIM_FLAG_Update);
    TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
    TIM_Cmd(TIM7,ENABLE);  
}	

TIM_Period=自动装载值
TIM_Prescaler=预分频值
定时时间计算:
定时时间=(TIM_Period)X(TIM_Prescaler)/Timer clocks(定时器时钟频率)
假如:TIM_Period=5000,TIM_Prescaler=84,Timer clocks=84Mhz
(5000X84)/84=5000us=5ms
对定时器时间设定可以理解为:
假如你需要定时1MS,TIM_Period(自动装载值)设定为1000,也就是1000us,
TIM_Prescaler(预分频值)设定与Timer clocks(定时器时钟频率)相同就行,比如
定时器时钟频率是84,TIM_Prescaler(预分频值)设定为84就行。

### STM32 定时器时间设定配置方法 在 STM32 中,定时器时间设定主要依赖于以下几个参数的计算和配置:系统时钟频率、预分频器(PSC)、自动重装载寄存器(ARR),以及定时器的工作模式。以下是详细的说明: #### 1. 计算定时器的计数值 为了实现特定的时间间隔,需要先计算所需的计数值。公式如下: \[ \text{计数值} = (\text{系统时钟频率 (Hz)} / (\text{预分频系数} + 1)) \times \text{所需延迟时间 (秒)} \] 其中: - **系统时钟频率** 是指 TIMx 的输入时钟频率。 - **预分频系数** 存储在 `TIM_Prescaler` 寄存器中,用于降低计数器的计数速度。 此公式的应用可以通过调整 PSC 和 ARR 来满足不同的延时需求[^1]。 #### 2. 初始化定时器的关键步骤 ##### (1)使能定时器时钟 在使用任何外设之前,都需要开启其对应的时钟信号。对于 STM32定时器而言,这一步骤通常通过 RCC 外设时钟控制寄存器完成。 ##### (2)设置预分频器 预分频器的作用是将输入时钟分成更慢的速度以便精确控制延时。它存储在 `TIM_Prescaler` 寄存器中,范围为 0 到 65535。例如,如果希望将输入时钟除以 72,则应将该值写入到 `TIM_Prescaler`[^2]。 ##### (3)设置自动重装载值 自动重装载值决定了计数器达到最大值后的溢出次数。这个值被存储在 `TIM_AutoReloadRegister` 或者简称 `TIM_ARR` 中。当计数器从零增加至等于 ARRs 值时发生一次更新事件并重新开始计数。 ##### (4)启动定时器 最后,在完成了上述所有必要的初始化之后,还需要启用定时器本身及其可能关联的功能模块比如中断或者 DMA 请求等操作才能让整个过程生效。 #### 示例代码 以下是一个基于 HAL 库的简单示例程序,展示如何配置一个通用定时器来产生固定时间段的脉冲输出: ```c #include "stm32f4xx_hal.h" void MX_TIM2_Init(void){ __HAL_RCC_TIM2_CLK_ENABLE(); // Enable Timer Clock TIM_HandleTypeDef htim; htim.Instance = TIM2; htim.Init.Prescaler = 7199; // Set Prescaler Value For Desired Frequency htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 9999; // Auto Reload Register Value htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if(HAL_TIM_Base_Init(&htim)!= HAL_OK){ Error_Handler(); } } int main(){ HAL_Init(); SystemClock_Config(); MX_TIM2_Init(); while(1); } ``` 以上代码片段展示了如何利用 HAL 函数对 TIM2 进行基本初始化,并设置了具体的预分频器与周期值以达成指定毫秒级延时效果[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值