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倍了,當然精度也下降。