stm32中有着三种定时器:两个高级定时器(TIM1,TIM8),四个通用定时器(TIM2 TIM3 TIM4 TIM5)和基本定时器(TIM6和TIM7)。我用的是通用定时器2来定时,每一秒就让LED闪烁一下,定时器的强大之处表示让新手的我吃了很大的苦头,对于别的功能一时也不理解,所以想知道定时器的具体工作原理的小伙伴门看一下视频或资料,这里贴上一个前辈的文章:https://blog.csdn.net/liming0931/article/details/82938522
定时器的定时中断功能还是比较简单的,无非就是配置三个寄存器:控制寄存器(TIM_CR1),预分频器( TIM_PSC)和 自动重装载寄存器(TIM_ARR),其中定时器的时间公式为: Tout = ((arr+1)*(psc+1))/Tclk,arr就是指设定的值,计时器一旦超过或者低过就产生中断信号,psc指的是预分频的值,Tclk是指时钟的频率,一般默认72MHZ,贴上代码:
#include "Time.h"
void Time_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseInitTypeDef time;
time.TIM_Period=7199; //arr=7199
time.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
time.TIM_Prescaler=9999; //PSC=9999
TIM_TimeBaseInit(TIM2,&time);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_InitTypeDef nvic;
nvic.NVIC_IRQChannel=TIM2_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority=2;
nvic.NVIC_IRQChannelSubPriority=2;
nvic.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&nvic);
}
void TIM2_IRQHandler()
{
Led_YellowTurn();
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
时间= ((arr+1)(psc+1))/Tclk
=((7199+1)(9999+1))/7200HZ(1M=10的6次方)
=1s