STM32学习之通用定时器的使用
STM32一共有8个通用16位Timer,其中TIMER1和TIMER8是高级定时器,其它的TIMER2~TIMER7是普通定时器。此外还有一个Systick(系统滴答定时器),这个定时器通常在操作系统中作为系统的任务切换周期。还有一个RTC,是一个毫秒定时器,支持秒级中断,用来做实时时钟计数器。看门狗定时器 也可以算一个。 STM32系列微控制器拥有丰富的定时器资源,其中包括8个通用16位定时器,分别是TIMER1和TIMER8(高级定时器),以及TIMER2至TIMER7(普通定时器)。此外,STM32还配备了一个系统滴答定时器Systick,主要用于在实时操作系统中调度任务切换。RTC(实时时钟)则是一个支持秒级中断的毫秒定时器,适用于时间同步和实时时钟功能。另一个值得注意的定时器是看门狗定时器,它用于监控系统运行状态,防止程序陷入死循环。 STM32的定时器时钟源来自APB1或APB2总线。TIMER1和TIMER8连接到APB2,最高可配置到72MHz的时钟频率。而TIMER2至TIMER7连接到APB1,最高时钟频率为36MHz。这些定时器可以通过预分频器调整其实际工作频率。 在编程中,我们可以利用定时器来实现特定的定时任务,例如控制LED灯的闪烁。以下是一个简单的例子,用定时器TIM2控制LED灯以0.5秒的周期交替亮灭: 配置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; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); } ``` 接着,配置中断控制器NVIC,选择TIM2中断通道,并设置抢占和子优先级。 ```c void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 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); TIM_TimeBaseStructure.TIM_Period = 1000; TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); } ``` 在主函数`main()`中,初始化系统时钟(如果尚未完成),配置GPIO、NVIC和定时器,然后进入无限循环。 ```c int main(void) { SystemInit(); GPIO_Config(); NVIC_Config(); Timer_Config(); while (1) { // 在这里可以添加其他任务 } } ``` 当定时器TIM2的计数值达到预设周期(1000个计数单位),会触发更新中断。在中断服务程序中,可以处理中断事件,例如改变LED的状态。需要注意的是,为了确保中断功能正常工作,还需要在中断向量表中定义相应的中断服务程序。 通过上述步骤,我们可以理解STM32通用定时器的基本使用方法,包括时钟源配置、中断配置和定时器参数设置。这种知识对于开发STM32应用至关重要,因为定时器广泛应用于各种实时控制、信号发生、延迟等功能。熟练掌握定时器的使用,能够帮助我们更好地发挥STM32的性能,实现复杂的嵌入式系统设计。