本笔记深入浅出地介绍如何使用STM32微控制器中的通用定时器模块。涵盖配置步骤、中断处理及实用示例,适合初学者快速上手。
STM32系列微控制器配备了丰富的定时器资源,其中包括8个通用16位定时器:TIMER1和TIMER8属于高级定时器类别,而TIMER2至TIMER7则为普通定时器。此外,还有一个系统滴答定时器Systick,在实时操作系统中主要用于任务切换的调度;RTC(实时时钟)是一个支持秒级中断的毫秒计时器,适用于时间同步与实时时钟功能。除此之外还有看门狗定时器,用于监控系统的运行状态并防止程序陷入死循环。
STM32的这些定时器可以使用APB1或APB2总线作为它们的工作时钟源。TIMER1和TIMER8连接到APB2,并且最高可配置至72MHz的频率;而TIMER2至TIMER7则通过APB1获得最多达36MHz的时钟信号。这些定时器能够根据实际需求经由预分频器来调整其工作频率。
在编程中,我们可以利用这些定时器实现特定的功能,比如控制LED灯以一定的周期闪烁。以下是一个使用TIM2定时器与GPIO配置来控制LED灯的例子:
首先,在代码里进行必要的初始化设置:定义并开启GPIOC的第13号引脚,并将其模式设为推挽输出。
```c
#include stm32f10x.h
void GPIO_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 使用PC13引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIO配置
}
```
接着,设置中断控制器NVIC的相关参数:选择TIM2的中断通道,并设定其抢占和子优先级。
```c
void NVIC_Config(void) {
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 设置为最低优先级别分组
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // 定义TIM2的中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级设为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级也设为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); // 初始化中断控制器配置
}
```
然后,进行定时器TIM2的初始化设置:定义周期、预分频数及计时模式等关键参数。
```c
void Timer_Config(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能定时器TIM2的时钟
TIM_TimeBaseStructure.TIM_Period = 1000; // 设置计数周期为1000
TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1; // 预分频值设为最大(即系统频率/2)
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置定时器工作模式为向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 初始化TIM2的配置
TIM_ClearFlag(TIM2, TIM_FLAG_Update); // 清除更新标志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 开启定时器中断功能
TIM_Cmd(TIM2, ENABLE);
}
```
在主函数`main()`中,初始化系统时钟(如果还未完成),配置GPIO、NVIC和TIM2,并进入无限循环等待。
```c
int main(void) {
SystemInit(); // 初始化系统时钟
GPIO_Config();
NVIC_Config();
Timer_Config();
while (1) {
// 主程序的其它任务可以在此处添加
}
}
```
每当TIM2计数达到预设周期(即1000次),会触发更新中断。在相应的中断服务函数中,可以根据需求执行特定操作,例如切换LED的状态。
通过以上步骤我们可以理解STM32通用定时器的基本使用方法:包括时钟源配置、中断功能设置以及参数设定等关键环节。掌握这些知识对于开发基于STM32的应用程序至关重要,因为它们广泛应用于各种实时控制、信号生成及延迟等功能的实现当中。