掌握STM32单片机定时器编程:时间控制利器,助你掌控时间
发布时间: 2024-07-04 15:32:35 阅读量: 48 订阅数: 25
![掌握STM32单片机定时器编程:时间控制利器,助你掌控时间](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单片机中的定时器是一种灵活且功能强大的外设,用于生成精确的时间间隔和脉冲。它具有多种模式,可满足各种应用需求,包括:
* **定时器模式:**用于生成固定频率的脉冲或方波。
* **计数器模式:**用于计数外部事件或测量时间间隔。
* **捕获模式:**用于捕获外部事件的发生时间。
* **输出比较模式:**用于生成可编程宽度和频率的脉冲。
定时器通过一系列可编程寄存器进行配置,这些寄存器控制定时器的时钟源、预分频、自动重装载值和中断行为。通过对这些寄存器的巧妙使用,可以实现各种定时和计数功能。
# 2. 定时器编程基础
### 2.1 定时器寄存器结构
STM32单片机的定时器具有丰富的寄存器结构,用于配置和控制定时器的各种功能。本章节将介绍定时器中最重要的寄存器,包括定时器控制寄存器(TIMx_CR1)、定时器预分频寄存器(TIMx_PSC)和定时器自动重装载寄存器(TIMx_ARR)。
#### 2.1.1 定时器控制寄存器(TIMx_CR1)
定时器控制寄存器(TIMx_CR1)是定时器的核心控制寄存器,用于配置定时器的基本功能,包括定时器使能、时钟源选择、计数模式和中断使能等。
```
typedef struct
{
uint32_t CEN:1; /*!< Counter enable */
uint32_t UDIS:1; /*!< Update disable */
uint32_t URS:1; /*!< Update request source */
uint32_t OPM:1; /*!< One-pulse mode */
uint32_t DIR:1; /*!< Direction */
uint32_t CMS:2; /*!< Center-aligned mode selection */
uint32_t ARPE:1; /*!< Auto-reload preload enable */
uint32_t CKD:2; /*!< Clock division */
uint32_t ARR:1; /*!< Auto-reload register preload */
} TIM_CR1_TypeDef;
```
| 位域 | 描述 |
|---|---|
| CEN | 定时器使能位,置 1 启用定时器 |
| UDIS | 更新禁止位,置 1 禁止更新事件 |
| URS | 更新请求源位,置 1 表示由软件触发更新事件 |
| OPM | 单脉冲模式位,置 1 使能单脉冲模式 |
| DIR | 计数方向位,置 0 为向上计数,置 1 为向下计数 |
| CMS | 中心对齐模式选择位,用于配置计数器时钟和更新事件的触发时机 |
| ARPE | 自动重装载预装载使能位,置 1 使能自动重装载寄存器的预装载 |
| CKD | 时钟分频位,用于选择定时器的时钟源和分频系数 |
| ARR | 自动重装载寄存器预装载位,置 1 将自动重装载寄存器中的值预装载到计数器中 |
#### 2.1.2 定时器预分频寄存器(TIMx_PSC)
定时器预分频寄存器(TIMx_PSC)用于对定时器的时钟进行分频,从而降低定时器的计数频率。
```
typedef struct
{
uint32_t PSC:16; /*!< Prescaler value */
} TIM_PSC_TypeDef;
```
| 位域 | 描述 |
|---|---|
| PSC | 预分频值,用于对定时器的时钟进行分频 |
#### 2.1.3 定时器自动重装载寄存器(TIMx_ARR)
定时器自动重装载寄存器(TIMx_ARR)用于设置定时器的重装载值,当计数器达到重装载值时,计数器将自动重装载并重新开始计数。
```
typedef struct
{
uint32_t ARR:16; /*!< Auto-reload value */
} TIM_ARR_TypeDef;
```
| 位域 | 描述 |
|---|---|
| ARR | 自动重装载值,用于设置定时器的重装载值 |
### 2.2 定时器中断配置
定时器中断是定时器功能的重要组成部分,允许定时器在特定事件发生时触发中断。本章节将介绍定时器中断配置的两个重要寄存器:定时器中断标志寄存器(TIMx_SR)和定时器中断使能寄存器(TIMx_DIER)。
#### 2.2.1 定时器中断标志寄存器(TIMx_SR)
定时器中断标志寄存器(TIMx_SR)用于指示定时器中断发生的标志位。
```
typedef struct
{
uint32_t UIF:1; /*!< Update interrupt flag */
uint32_t CC1IF:1; /*!< Capture/Compare 1 interrupt flag */
uint32_t CC2IF:1; /*!< Capture/Compare 2 interrupt flag */
uint32_t CC3IF:1; /*!< Capture/Compare 3 interrupt flag */
uint32_t CC4IF:1; /*!< Capture/Compare 4 interrupt flag */
uint32_t TIF:1; /*!< Trigger interrupt flag */
uint32_t BIF:1; /*!< Break interrupt flag */
uint32_t CC1OF:1; /*!< Capture/Compare 1 overcapture flag */
uint32_t CC2OF:1; /*!< Capture/Compare 2 overcapture flag */
uint32_t CC3OF:1; /*!< Capture/Compare 3 overcapture flag */
uint32_t CC4OF:1; /*!< Capture/Compare 4 overcapture flag */
} TIM_SR_TypeDef;
```
| 位域 | 描述 |
|---|---|
| UIF | 更新中断标志位,当计数器达到重装载值时置 1 |
| CC1IF | 捕获/比较 1 中断标志位,当捕获/比较通道 1 发生事件时置 1 |
| CC2IF | 捕获/比较 2 中断标志位,当捕获/比较通道 2 发生事件时置 1 |
| CC3IF | 捕获/比较 3 中断标志位,当捕获/比较通道 3 发生事件时置 1 |
| CC4IF | 捕获/比较 4 中断标志位,当捕获/比较通道 4 发生事件时置 1 |
| TIF | 触发中断标志位,当定时器触发事件发生时置 1 |
| BIF | 中断中断标志位,当定时器中断事件发生时置 1 |
| CC1OF | 捕获/比较 1 过捕获标志位,当捕获/比较通道 1 发生过捕获事件时置 1 |
| CC2OF | 捕获/比较 2 过捕获标志位,当捕获/比较通道 2 发生过捕获事件时置 1 |
| CC3OF | 捕获/比较 3 过捕获标志位,当捕获/比较通道 3 发生过捕获事件时置 1 |
| CC4OF | 捕获/比较 4 过捕获标志位,当捕获/比较通道 4 发生过捕获事件时置 1 |
#### 2.2.2 定时器中断使能寄存器(TIMx_DIER)
定时器中断使能寄存器(TIMx_DIER)用于使能或禁止定时器中断。
```
typedef struct
{
uint32_t UIE:1; /*!< Up
```
0
0