STM32学习笔记——TIM_Period 和 TIM_Prescaler

概念 

TIM_TimeBaseStructure.TIM_Period 和 TIM_TimeBaseStructure.TIM_Prescaler 是STM32定时器(Timer)的两个重要参数。

  1. TIM_Period:这个参数代表的是定时器的自动重装载值(Auto-reload value)。当定时器的计数值达到这个值时,定时器就会产生一个中断或更新事件。这个参数可以用来控制定时器中断的间隔时间。

        例如,如果设置TIM_Period为7199,那么定时器每计数7199次就会产生一个中断。

  1. TIM_Prescaler:这个参数代表的是定时器的预分频值(Prescaler value)。它决定了定时器的时钟频率被分频的倍数。这可以用来控制定时器的分辨率和计数速度。通过调整TIM_Prescaler的值,可以实现对定时器行为的精细控制。

        例如,如果设置TIM_Prescaler为9,那么定时器的时钟频率将被除以9,从而降低定时器的计数速度。

这两个参数共同决定了定时器的中断间隔时间。在STM32的TIM2中,可以通过设置这两个参数来实现在特定的时间间隔产生中断的功能。

举例:

//对于72MHZ的频率,2s中断一次:
TIM_Prescaler=7200-1;   //预分频值
TIM_Period=20000-1;    //重装载值
//72M  / 7200 = 72* 10 ^ 6 / 7200= 72000000/7200=10000Hz
//周期等于频率的倒数  1/10000 = 0.0001s
//2s = 2000ms 2s/0.0001s = 20000
//要运行20000 从0开始就有20000 - 1 = 19999
//即通过19999次系统的运行,就是2000ms

总结:


定时器中断时间(s) = (TIM_Prescaler + 1)* (TIM_Period +1) / 时钟频率

定时器中断时间(ms)=(TIM_Prescaler + 1)* (TIM_Period +1) * 1000 / 时钟频率

### STM32 HAL 库定时器 `__HAL_TIM_SET_PRESCALER` 函数的具体用法 #### 1. 函数功能描述 `__HAL_TIM_SET_PRESCALER` 是一个宏定义函数,用于动态修改指定 TIMx 定时器的预分频器(Prescaler)值。通过调整预分频器值可以改变定时器的时间基准。 此函数的作用是在运行期间重新配置定时器的预分频寄存器 (TIMx_PSC),从而影响最终的计数值时间间隔[^1]。 --- #### 2. 函数原型 以下是该函数的声明形式: ```c #define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) ``` 参数说明如下: - **`__HANDLE__`**: 指向 `TIM_HandleTypeDef` 类型结构体实例的指针,表示要操作的定时器句柄。 - **`__PRESC__`**: 预分频器的新值,范围通常为 0 至 65535(即 16 位宽度),实际最大值取决于硬件设计。 注意:更改预分频器会影响定时器的工作频率计算公式 \( f_{\text{CNT}} = \frac{f_{\text{CLK}}}{(\text{PSC} + 1)} \)[^1]。 --- #### 3. 示例代码 以下是一个完整的示例程序,展示如何使用 `__HAL_TIM_SET_PRESCALER` 动态更新预分频器: ```c #include "stm32f4xx_hal.h" // 假设已经初始化了一个 TIM2 句柄 htim2 TIM_HandleTypeDef htim2; void SetNewPrescaler(void) { uint32_t new_prescaler_value = 999; // 新的预分频器值 // 修改 TIM2 的预分频器值 __HAL_TIM_SET_PRESCALER(&htim2, new_prescaler_value); // 如果需要立即生效,则停止并重启定时器 HAL_TIM_Base_Stop_IT(&htim2); HAL_TIM_Base_Start_IT(&htim2); } int main(void) { // 初始化系统时钟其他外设... // 初始化 TIM2 并启动它 HAL_TIM_Base_Init(&htim2); HAL_TIM_Base_Start_IT(&htim2); while (1) { // 调整预分频器值 SetNewPrescaler(); // 等待一段时间后再重复调整 HAL_Delay(1000); // 延迟 1 秒 } } ``` 上述代码展示了如何在运行过程中动态调整预分频器值,并确保新的设置能够正确应用到定时器上[^3]。 --- #### 4. 注意事项 - 更改预分频器可能不会立刻生效,除非手动停止再重新启动定时器。 - 计算新预分频器值时需考虑目标时间间隔以及输入时钟频率的关系,例如 \( T_{\text{out}} = (\text{ARR} + 1) \times (\text{PSC} + 1) / f_{\text{CLK}} \)。 - 在多线程环境中调用此类函数时应小心同步问题,以免造成意外行为。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值