精确控制STM32单片机定时器:时间事件的掌控者
发布时间: 2024-07-02 02:46:08 阅读量: 5 订阅数: 10
![精确控制STM32单片机定时器:时间事件的掌控者](http://embedded-lab.com/blog/wp-content/uploads/2014/11/Clock-Internal-1024x366.png)
# 1. STM32定时器概述**
STM32微控制器系列集成了多个高级定时器外设,它们提供灵活且功能强大的计时和控制功能。这些定时器可用于各种应用,包括:
* 时间测量和生成
* PWM输出生成
* 输入捕获和比较
* 定时器级联和同步
STM32定时器具有丰富的功能集,包括可配置的时钟源、多种工作模式、可编程预分频器和自动重装载功能。它们还支持中断,允许在特定事件发生时触发代码执行。
# 2. 定时器编程基础
### 2.1 定时器寄存器结构
STM32定时器外设具有丰富的寄存器集,用于配置和控制定时器的各种功能。主要寄存器包括:
| 寄存器 | 功能 |
|---|---|
| CR1 | 控制寄存器 1,用于配置定时器模式、时钟源和预分频器 |
| CR2 | 控制寄存器 2,用于配置定时器中断、预装载值和更新事件 |
| SR | 状态寄存器,用于指示定时器当前状态和中断标志 |
| EGR | 事件生成寄存器,用于触发特定事件,如更新事件或触发中断 |
| CNT | 计数器寄存器,用于存储当前计数值 |
| PSC | 预分频器寄存器,用于设置时钟源的预分频因子 |
| ARR | 自动重装载寄存器,用于设置定时器重装载值 |
### 2.2 定时器模式和配置
STM32定时器支持多种模式,包括:
| 模式 | 功能 |
|---|---|
| Upcounting | 计数器从 0 开始向上计数 |
| Downcounting | 计数器从 ARR 值开始向下计数 |
| Center-aligned | 计数器从 ARR 值的一半开始计数 |
| Asymmetric | 计数器以不同的速率向上和向下计数 |
定时器的配置可以通过设置 CR1 和 CR2 寄存器来实现。以下代码示例展示了如何配置定时器 2 为向上计数模式:
```c
// 使能定时器 2
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
// 设置计数模式为向上计数
TIM2->CR1 &= ~TIM_CR1_DIR;
// 设置时钟源为内部时钟
TIM2->CR1 &= ~TIM_CR1_CKD;
// 设置预分频因子为 10000
TIM2->PSC = 10000;
// 设置自动重装载值
TIM2->ARR = 65535;
```
### 2.3 定时器中断处理
STM32定时器支持中断,允许在特定事件(如溢出或比较匹配)发生时触发中断服务程序。
要启用中断,需要设置 CR2 寄存器的相关中断标志位。以下代码示例展示了如何启用定时器 2 的溢出中断:
```c
// 使能溢出中断
TIM2->CR2 |= TIM_CR2_IE;
```
在中断服务程序中,需要清除中断标志位以避免重复触发中断。以下代码示例展示了如何清除定时器 2 的溢出中断标志位:
```c
// 清除溢出中断标志位
TIM2->SR &= ~TIM_SR_UIF;
```
# 3. 定时器高级应用
### 3.1 PWM输出生成
PWM(脉冲宽度调制)是一种通过改变脉冲宽度来控制输出电压或电流的调制技术。在STM32定时器中,PWM输出可以通过TIMx_CCR1~TIMx_CCR4寄存器来控制。
**配置PWM输出**
1. **选择PWM模式:**在TIMx_CR1寄存器的CMS位设置PWM模式。
2. **设置预分频器:**在TIMx_PSC寄存器中设置预分频器,以确定定时器时钟频率。
3. **设置自动重装载值:**在TIMx_ARR寄存器中设置自动重装载值,以确定PWM周期的长度。
4. **设置比较值:**在TIMx_CCR1~TIMx_CCR4寄存器中设置比较值,以确定PWM脉冲的宽度。
**代码示例:**
```c
// 初始化TIM3为PWM模式
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->CR1 |= TIM_CR1_CEN;
TIM3->PSC = 7199;
TIM3->ARR = 999;
TIM3->CCR1 = 500;
TIM3->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2;
TIM3->CCER |= TIM_CCER_CC1E;
```
**逻辑分析:**
* RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;:使能TIM3时钟。
* TIM3->CR1 |= TIM_CR1_CEN;:使能TIM3计数器。
* TIM3->PSC = 7199;:设置预分频器为7200,即TIM3时钟频率为1MHz。
* TIM3->ARR = 999;:设置自动重装载值为1000,即PWM周期为1ms。
* TIM3->CCR1 = 500;:设置比较值为500,即PWM脉冲宽度为0.5ms。
* TIM3->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2;:设置输出比较模式为PWM模式1。
* TIM3->CCER |= TIM_CCER_CC1E;:使能输出比较通道1。
### 3.2 输入捕获和比较
输入捕获功能允许定时器捕获外部事件的发生时间,而比较功能则允许定时器与外部事件进行比较。
0
0