STM32定时器应用详解:15个实战案例,掌握时间控制精髓
发布时间: 2024-07-02 12:10:29 阅读量: 6 订阅数: 14
![STM32定时器应用详解:15个实战案例,掌握时间控制精髓](https://img-blog.csdnimg.cn/1ab5ae04c5884932a838594a0562057f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASk9VX1hRUw==,size_20,color_FFFFFF,t_70,g_se,x_16)
# 1. STM32定时器基础**
STM32定时器是一种多功能外设,用于生成精确的时间信号和控制事件。它具有多种模式和功能,可以满足各种应用需求。
定时器的基本结构包括一个计数器、一个预分频器和一个时钟源。计数器负责递增或递减计数,预分频器用于降低时钟频率,而时钟源提供定时器的时钟信号。
通过配置定时器的模式和参数,可以实现各种功能,如:
* 产生周期性中断
* 生成PWM波形
* 捕获外部事件
* 测量脉冲宽度
# 2. STM32定时器编程技巧
### 2.1 定时器配置与初始化
#### 2.1.1 定时器模式选择
STM32定时器支持多种模式,包括:
* **向上计数模式:**计数器从0开始向上计数,达到上限值后复位为0。
* **向下计数模式:**计数器从上限值开始向下计数,达到0后复位为上限值。
* **中心对齐模式:**计数器从上限值一半开始计数,向上或向下计数,达到上限值或0后复位。
* **PWM模式:**用于生成脉宽调制信号,通过改变占空比控制输出电平。
模式选择通过TIMx_CR1寄存器的CMS和DIR位进行设置。
```c
// 设置定时器1为向上计数模式
TIM1->CR1 &= ~TIM_CR1_CMS;
TIM1->CR1 &= ~TIM_CR1_DIR;
```
#### 2.1.2 定时器时钟源设置
STM32定时器可以由多种时钟源驱动,包括:
* **内部时钟(APB1或APB2):**时钟频率与系统时钟频率相同。
* **外部时钟(ETR):**外部时钟输入引脚。
* **内部时钟(LSI或LSE):**低速时钟,频率较低。
时钟源选择通过TIMx_CR1寄存器的CKD位进行设置。
```c
// 设置定时器1的时钟源为APB1
TIM1->CR1 &= ~TIM_CR1_CKD;
```
### 2.2 定时器中断管理
#### 2.2.1 中断源配置
STM32定时器支持多种中断源,包括:
* **更新中断:**计数器达到ARR寄存器设定的值时触发。
* **比较中断:**计数器达到CCRx寄存器设定的值时触发。
* **触发中断:**外部触发事件触发。
* **捕获中断:**输入捕获模式下,捕获到外部信号时触发。
中断源配置通过TIMx_DIER寄存器进行设置。
```c
// 启用定时器1的更新中断
TIM1->DIER |= TIM_DIER_UIE;
```
#### 2.2.2 中断处理函数编写
中断处理函数需要在程序中定义,用于处理定时器中断事件。中断处理函数的名称通常为TIMx_IRQHandler,其中x为定时器编号。
```c
void TIM1_IRQHandler(void)
{
// 清除更新中断标志位
TIM1->SR &= ~TIM_SR_UIF;
// 执行中断处理逻辑
}
```
### 2.3 定时器捕获和比较功能
#### 2.3.1 输入捕获模式
输入捕获模式允许定时器捕获外部信号的上升沿或下降沿。捕获值存储在CCRx寄存器中。
```c
// 设置定时器1的通道1为输入捕获模式
TIM1->CCMR1 &= ~TIM_CCMR1_CC1S;
TIM1->CCMR1 |= TIM_CCMR1_CC1S_0;
```
#### 2.3.2 输出比较模式
输出比较模式允许定时器在计数器达到CCRx寄存器设定的值时输出一个脉冲。脉冲宽度由CCR和ARR寄存器的值决定。
```c
// 设置定时器1的通道1为输出比较模式
TIM1->CCMR1 &= ~TIM_CCMR1_OC1M;
TIM1->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2;
```
# 3.1 LED闪烁控制
**3.1.1 基本闪烁效果**
基本闪烁效果是最简单的定时器应用,通过定时器周期性地切换LED的状态,实现LED的闪烁。
**步骤:**
1. 配置定时器:
- 设置定时器模式为向上计数模式。
- 设置定时器时钟源为内部时钟。
- 设置定时器重装载值,决定闪烁周期。
2. 配置GPIO:
- 设置LED引脚为输出模式。
3. 在定时器中断服务函数中:
- 读取定时器的当前值。
- 如果当前值等于重装载值,则切换LED的状态。
**代码块:**
```c
#include "stm32f10x.h"
// LED引脚定义
#define LED_PIN GPIO_Pin_13
#define LED_PORT GPIOC
// 定时器配置结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
// GPIO配置结构体
GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_TIM8, ENABLE);
// 配置GPIO
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &GPIO_InitStructure);
// 配置定时器
TIM_TimeBaseInitStructure.TIM_Period = 1000; // 闪烁周期为1s
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1; // 分频系数为7200
TIM_TimeBaseInitStruc
```
0
0