stm32的定时器怎么定时
时间: 2025-01-03 16:35:34 浏览: 40
### 使用STM32定时器实现定时功能
#### 配置教程
为了使用STM32的定时器来执行定时操作,开发者需遵循一系列配置步骤。这些步骤涉及初始化定时器、设置预分频系数以及自动重装载寄存器等参数,从而确保定时器能够按照预期工作[^2]。
#### 初始化定时器
在开始之前,应确认已包含了必要的头文件`stm32f10x_tim.h`,该文件定义了与定时器相关的库函数和数据结构[^3]。接着,在程序中创建一个`TIM_TimeBaseInitTypeDef`类型的实例,并对其进行适当配置:
```c
TIM_TimeBaseInitTypeDef TIM_InitStruct;
```
此结构体用于指定定时器的基础特性,如周期长度、频率等属性。对于通用定时器而言,只需关注前四个字段;而第五个字段则专属于高级定时器[^5]。
#### 设置预分频值(PSC)
通过调整预分频器(Pre-scaler),可以控制定时器的工作频率。这一步骤至关重要,因为它直接影响到最终的时间间隔准确性。假设希望得到精确至毫秒级别的延时效果,则可以根据系统时钟源计算合适的PSC数值并赋给相应的成员变量:
```c
// 假设APB1时钟为72MHz, 要求定时器每ms触发一次中断
uint16_t PrescalerValue = (uint16_t)((SystemCoreClock / 72) - 1); // 计算预分频值
TIM_InitStruct.TIM_Prescaler = PrescalerValue; // 设定预分频值
```
此处采用减法运算的原因在于,ST官方文档规定预分频器的实际除数等于设定值加一[^4]。
#### 自动重载值(AutoReload Value)
接下来,还需指定期望达到的目标时间单位数量——即当计数到达多少次之后才会发生溢出事件。如果目标是每隔一秒产生一次中断信号,那么就需要根据上述选定的预分频比例推导出自加载值ARR:
```c
TIM_InitStruct.TIM_Period = 9999; // 对于上面的例子来说就是如此
```
注意这里的`Period`实际上对应着满量程范围内的最大计数值,因此其取值应当小于或等于65535(针对16位宽的定时/计数单元)。
#### 启用更新中断及NVIC
为了让定时器能够在每次完成一轮完整的计数循环后向CPU发送通知消息,必须开启对应的中断请求通道。此外,还需要调用相应API注册回调服务例程ISR,并将其地址传递给嵌套矢量中断控制器(NVIC):
```c
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
```
以上代码片段展示了如何激活特定编号IRQ线路及其关联的服务例程入口点。同时设置了抢占优先级和子优先级两个维度上的权重分配策略,以便更好地管理多任务环境下的资源竞争状况。
#### 开启定时器
最后一步便是正式启动所选中的硬件外设模块:
```c
TIM_Cmd(TIM3, ENABLE);
```
此时,整个系统的准备工作已经就绪,等待下一个上升沿的到来便会立即进入运行模式,直至下一次被手动停止为止。
阅读全文