簡單例子理解TIMx
4.1 使得PB5-TIM3通道2產生頻率為12.5Hz的方波,該方波控制LED1的閃爍
主函數為:
1 int main(void)
2 {
();//系統時鐘設置及外設時鐘使能
(); //中斷源配置
();//定時器3的初始化
6 while(1);
7 }
配置各外設的時鐘和系統時鐘:
1 /*************************
2 * 名 稱:void (void)
3 * 功 能:系統時鐘配置為72MHZ, 外設時鐘配置
4 *************************/
5 void (void)
6{
7 ();
8 md(, );
9 md(| |
| | , );
}
配置中斷向量:(因為這里用到了TIM3,所以要配置其中斷向量)
1 /*****************
2 * 名稱:on(void)
3 * 功能:中斷源配置
4*****************/
5 void (void)
6 {
;
onfig();
. = ; //配置定時器中斷
10 . = 0;
. =0;
12 . = ;
13 (&);
14 }
TIM3的2通道配置:(下面首先配置GPIO PB5(為Tim3的2通道),PB5引腳默認是作為通用IO口使用,為了產生特定頻率,利用了該引腳可以復用為,根據手冊,需要用到局部復用映射,才能將映射到PB5。)
在定時器3的初始化中,用到了輸出比較2模式的翻轉設置。也就是當=時,翻轉輸出的電平。以產生需要的頻率,的值決定了翻轉的頻率。當=時,產生一次電平翻轉,并在中斷服務程序里重新完成對的裝載。依次往復,產生了所需要的12.5Hz的頻率。(注意注釋的第15~17行介紹如何控制輸出頻率,=45000)
1 void (void){
;
Cmd(, );//定時器3時鐘使能
4
. = ;//PB5復用為TIM3的通道2
. = ;
. = ;
(GPIOB, &);
9
10/* TIM3局部復用功能開啟在TIM3的局部復用開啟時,PB5會被復用為*/
11 (M3 , );
12
13 /* Time Base */
14/*----------------
=72MHz 預分頻系數=63 經過分頻 定時器時鐘為1.
16捕獲/比較寄存器2 =
17 2通道產生的更新頻率是=1./=25Hz
18
19-----------------*/
ture. = 63; //預分頻器=63
ture. = ;//計數器向上計數模式 [4]=0
ture. =; //自動重裝載寄存器
ture. = 0x0; //時鐘分頻因子 [9:8]=00
24
(TIM3,&re); //寫TIM3各寄存器參數
26
re. = ; //[14:12]=011 翻轉 當=時,翻轉的電平
re. = le; //輸入/捕獲2輸出允許 OC2信號輸出到對應的輸出引腳PB5
re. =;//若CC1通道配置為輸出:CCR2是裝入當前捕獲/比較2 寄存器的值(預裝載值)。
30//當前捕獲/比較寄存器包含了與計數器比較的值,并且在OC端口上輸出信號
re. = ; //輸出極性 低電平有效 [5]=1;
32
(TIM3, &);
ig(TIM3, e); //[1]=0 禁止寄存器的預裝載功能,可隨時寫入
35//且新值馬上起作用
36
37 (TIM3,); //啟動定時器3 [0]=1;
38 (TIM3,,); //[2]=1 允許捕獲/比較2中斷
39 }
TIM3的中斷服務子程序(每次=產生一次中斷,在中斷子程序中取出上一次的加上作為新的,這樣等加到和相等時又會觸發一次中斷)
1 void (void)
2 {
3
4 if ((TIM3, ) != RESET)//判斷狀態寄存器 [2] 是否發生了捕
獲/比較2 中斷
5{
6 t(TIM3, ); //軟件清除狀態寄存器 [2]
捕獲/比較2 中斷中斷標志
7
8 = (TIM3); //獲取的預裝值
(TIM3, + ); //和累加后裝入 這是為了配合計數
器值的遞增。以在下一次作出比較。
10
11 }
12 }
4.2周期控制通用定時器3的2通道,實現1KHz的不同占空比波形,控制LED實現呼吸燈
主函數為:(不同于上面固定的頻率定時方法,這里在while里不斷更改的值來改變占空比)
1 int main(void)
2 {
3 char a=0;
4 ;
5 ();
6 ();
7 (72000);//配置時鐘節拍為1ms一次
8 while(1){
9 Delay(1);//延時1ms
10 . = ;//PWM模式2
11 . = le;//輸出禁止
12 . = ;//確定占空比
13 . = ;
14 (TIM3, &);
15
16/*調整的值來改變占空比,逐步的控制LED1的亮度, 占空比大過一定值時,
17亮度的變化就不明顯了,所以最大設定到17000*/
18 if(a==0) =+10;
19 else =-10;
20 if(>17000){ =17000; a=1;}
21 else if( }
23 }
配置各外設的時鐘和系統時鐘:
1 /******************
2 * 名稱:void (void)
3 * 功能:系統時鐘配置為72MHZ, 外設時鐘配置
4 ******************/
5 void (void){
6
7 ();
8 md(, );
9 md( | |
10| | , );
11 }
TIM3的2通道配置:(注意,這里沒有用到中斷向量和中斷子程序!!!下面首先配置GPIO PB5(為Tim3的2通道),PB5引腳默認是作為通用IO口使用,為了產生特定頻率,利用了該引腳可以復用為,根據手冊,需要用到局部復用映射,才能將映射到PB5。)
由于TIM3計數器的時鐘頻率是72MHz,希望各通道輸出頻率為1KHZ,根據3倍預分頻后,時鐘頻率為24MHz,根據公式ftim3=/(+1),可得到TIM3預分頻的值為24000, 根據公式根據公式 通道輸出占空比=/(+1),可以得到的計數值,逐步改變這個值,可以控制占空比, 從而獲得LED1 亮度明暗漸變的效果。(所以在main函數的while中不斷重置值來控制不同占空比)
1 /********
2 *名稱:void (void)
3 * 功能:TIM3初始化
4 ********/
5 void (void){
6 ;
7 md(, );
8
9 . = ;//PB5復用為TIM3的通道2
10 . = ;
11 . = ;
12 (GPIOB, &);
13 /*TIM3局部復用功能開啟在TIM3的局部復用開啟時,PB5會被復用為*/
14 (M3 , );
15
16/*------------------------------
17 =72MHz預分頻系數=2 經過分頻定時器時鐘為24MHz
18 根據公式 通道輸出占空比=/(+1),可以得到的計數值
19 捕獲/比較寄存器2 =
20 ------------------------------*/
21 re. = 2;//預分頻器=3
22 re. = ;//計數器向上計數模式 [4]=0
23 re. =24000;//自動重裝載寄存器 確定頻率為1KHz
24 re. = 0x0;//時鐘分頻因子 [9:8]=00
25 re.r = 0x0;
26
27 (TIM3,&re);//寫TIM3各寄存器參數
28
29 . = ;//PWM模式2 [14:12]=111 在向上計數時單片機定時器里寫程序,
30//一旦 . = le;//輸入/捕獲2輸出允許OC2信號輸出到對應的輸出引腳PB5
32 . = ;//確定占空比,這個值決定了有效電平的時間。
33 . = ;//輸出極性低電平有效 [5]=1;
34
35 (TIM3, &);
36 (TIM3, );
37 (TIM3,);//啟動定時器3 [0]=1;
38 }
我們官方的QQ群1:
我們官方的QQ群2:
特別感謝網友的大力支持。
我們的開源團隊不斷擴大單片機定時器里寫程序,希望大家快來一起加入我們吧。
在這里還是要謝謝大家的大力支持!
大家快來關注吧!