1、思路:通过设定定时器3的溢出中断,实现对LED灯的闪烁控制。
2、主要过程:由于在实验过程中使用到的是刷新(溢出)中断,所以我们要开启计数器计数使能,刷新中断使能,设定分频因子、分频系数、计数类型等。
3、注意点:分频系数(psc):用于对计数器时钟进行分频,它的数值可以在1-65535取值。计数器的时钟频率(CK_CNT)等于fCK_PSC/( PSC[15:0]+1)。
分频因子:就是常说的二分频、四分频,用于改变计数器的时钟频率。
自动装载的周期值(arr):设置在下一个更新事件装入活动的自动重装载寄存器周期的值。
(分频因子与分频系数决定定时器的工作频率)
定时的时间计算公式:Tout= ((arr+1)*(psc+1))/Tclk Tout:中断时间 Tclk:TIM3的输入时钟频率
我们将看 DS0 不停闪烁(每 400ms 闪烁一次),而 DS1也是不停的闪烁,但是闪烁时间较 DS0 慢(1s 一次):
DS0闪烁的时间计算:
while(1)
{
LED0=!LED0;
delay_ms(200);
}
DS1闪烁时间计算:
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
}
在main函数中,我们设置psc=7199,arr=4999;依据公式可以得出时间为500ms.那么一个周期就是1s亮一次。
PS:比如你的晶振是10M,定时器的计数器是65535,如果没有分频器,只能计时65535/10000000=6.5毫秒如果有了分频器,2分频,定时长度就变为2倍了,当然精度也下降。