定时器延时公式

公式:定时器加一需要的时间=(prescaler+1)/这个定时器的频率

根据这个公式可知stm32f103c8t6的最小延时是1/72微秒。

在cubemx中配置定时器:点击internal clock,下面参数部分填写prescaler,把auto-reload preload的值设为enable,其他的值一般不需要改变。

注意最大延迟是(65535+1)x定时器加一需要的时间,其中65535储存在一个16位的寄存器中。

### 解决 TIM 定时器延时不准的方案 在 STM32 微控制器中,TIM 定时器延时不准通常是由以下几个原因引起的:系统时钟配置错误、预分频系数设置不当以及中断优先级冲突等。以下是详细的分析和解决方案。 #### 1. 系统时钟校准 确保系统的主时钟频率(`SystemCoreClock`)被正确初始化并匹配实际硬件晶振频率。如果 `SystemCoreClock` 的值不准确,则会影响定时器的时间基准计算[^1]。可以通过以下方法验证: ```c uint32_t actual_clock = SystemCoreClock; if (actual_clock != EXPECTED_CLOCK_VALUE) { // 调整或重新配置 RCC 配置 } ``` #### 2. 正确配置预分频器和自动重装载寄存器 定时器延时时间由其预分频器 (`Prescaler`) 和自动重装载寄存器 (`Period`) 决定。公式如下: \[ \text{Delay Time} = (\text{Prescaler} + 1) \times (\text{Period} + 1) / f_{\text{clock}} \] - **预分频器**:应根据所需的分辨率调整。例如,为了实现微秒级别的延迟,可以将 `Prescaler` 设置为 `(SystemCoreClock / 1000000) - 1`。 - **自动重装载值**:用于设定具体的延时时长。例如,要实现 1 秒的延时,可设 `Period = 999999` 当 `Prescaler` 对应每微秒触发一次更新事件时。 代码示例: ```c void TIM_Config(void) { TIM_HandleTypeDef htim; htim.Instance = TIM1; htim.Init.Prescaler = (SystemCoreClock / 1000000) - 1; // 每微秒触发一次 htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 999999; // 计数值对应 1s HAL_TIM_Base_Init(&htim); HAL_TIM_Base_Start(&htim); } ``` 对于 F4 系列芯片,需注意不同定时器可能挂载于不同的 APB 总线,因此需要区分 PCLK1 或 PCLK2 来动态计算预分频值[^2]。 #### 3. 使用软件延时替代硬中断中的延时 在中断服务程序中调用阻塞型延时函数可能导致其他高优先级任务无法及时响应,从而引发整体系统性能下降甚至死锁现象[^3]。推荐改用状态机或者回调机制处理长时间操作逻辑。 假设当前场景下仍需依赖单一计时单元完成多路信号同步管理功能,则可通过标志位配合轮询检测方式间接达成目标效果而无需额外增加资源消耗量。 #### 4. 注意外设供电电压影响 某些情况下,电源波动也可能引起内部 RC 振荡电路漂移进而改变最终输出周期特性;建议始终维持稳定的工作条件以获得最佳一致性表现[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值