STM32单片机定时器编程:从基础到实战,掌握时间控制技巧
发布时间: 2024-07-03 17:02:26 阅读量: 102 订阅数: 58
YOLO算法-城市电杆数据集-496张图像带标签-电杆.zip
![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. STM32单片机定时器编程技巧
### 2.1 定时器的配置和初始化
#### 2.1.1 定时器的时钟源和分频
STM32单片机定时器的时钟源可以是内部时钟(HSI、HSE、LSI)或外部时钟(LSE)。时钟源的频率可以通过分频器进行分频,以获得所需的定时器时钟频率。
```c
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_ClkInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_ClkInitStruct.PLL.PLLMUL = 9;
RCC_ClkInitStruct.PLL.PLLDIV = 3;
RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
```
**参数说明:**
* `RCC_ClkInitStruct.ClockType`:时钟类型,此处为系统时钟(SYSCLK)。
* `RCC_ClkInitStruct.SYSCLKSource`:系统时钟源,此处为外部高速时钟(HSE)。
* `RCC_ClkInitStruct.AHBCLKDivider`:AHB总线时钟分频系数,此处为不分频(DIV1)。
* `RCC_ClkInitStruct.APB1CLKDivider`:APB1总线时钟分频系数,此处为SYSCLK的1/2(DIV2)。
* `RCC_ClkInitStruct.APB2CLKDivider`:APB2总线时钟分频系数,此处为不分频(DIV1)。
* `RCC_ClkInitStruct.PLL.PLLState`:PLL状态,此处为开启(ON)。
* `RCC_ClkInitStruct.PLL.PLLSource`:PLL时钟源,此处为HSE。
* `RCC_ClkInitStruct.PLL.PLLMUL`:PLL倍频系数,此处为9。
* `RCC_ClkInitStruct.PLL.PLLDIV`:PLL分频系数,此处为3。
* `RCC_ClockConfig`:配置时钟。
* `FLASH_LATENCY_2`:设置Flash延迟状态,因为PLL时钟频率较高,需要增加Flash延迟。
#### 2.1.2 定时器的计数模式和中断
STM32单片机定时器支持多种计数模式,包括向上计数、向下计数和向上/向下计数。定时器还支持中断功能,当计数器达到指定值时触发中断。
```c
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.Period = 10000;
TIM_TimeBaseInitStruct.Prescaler = 8400 - 1;
TIM_TimeBaseInitStruct.ClockDivision = TIM_CLOCKDIVISION_DIV1;
TIM_TimeBaseInitStruct.CounterMode = TIM_COUNTERMODE_UP;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
```
**参数说明:**
* `TIM_TimeBaseInitStruct.Period`:自动重装载寄存器(ARR)的值,即定时器计数上限。
* `TIM_TimeBaseInitStruct.Prescaler`:定时器时钟分频系数,此处为8400-1,即时钟频率为1MHz。
* `TIM_TimeBaseInitStruct.ClockDivision`:定时器时钟分频系数,此处为不分频(DIV1)。
* `TIM_TimeBaseInitStruct.CounterMode`:计数模式,此处为向上计数(UP)。
* `TIM_TimeBaseInit`:初始化定时器。
### 2.2 定时器的捕获和比较功能
#### 2.2.1 输入捕获模式
输入捕获模式允许定时器捕获外部信号的边缘,并将其存储在捕获寄存器(CCR)中。
```c
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_ICInitStruct.ICPolarity = TIM_ICPOLARITY_RISING;
TIM_ICInitStruct.ICSelection = TIM_ICSELECTION_DIRECTTI;
TIM_ICInitStruct.ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.ICFilter = 0x0F;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
```
**参数说明:**
* `TIM_ICInitStruct.ICPolarity`:捕获极性,此处为上升沿(RISING)。
* `TIM_ICInitStruct.ICSelection`:捕获通道,此处为直接输入(DIRECTTI)。
* `TIM_ICInitStruct.ICPrescaler`:捕获分频系数,此处为不分频(DIV1)。
* `TIM_ICInitStruct.ICFilter`:捕获滤波器,此处为15个采样周期。
* `TIM_ICInit`:初始化捕获通道。
#### 2.2.2 输出比较模式
0
0