1、ME32F030基本定時器簡介
ME32F030內置 4 個基本功能的 16 位定時器/計數器。 定時器/計數器工作時鐘由 SYSAHBCLKDIV 寄存器控制。關閉 SYSAHBCLKDIV 寄存器中定時器/計數器的時鐘供給可節省系統功耗。主要功能如下:
? 可預置分頻的 16 位定時器/計數器
? 1 個 16 位匹配寄存器:
–可產生中斷
–停止定時器
–對定時器復位
16 位基本型定時器/計數器模塊框圖如下圖所示:
圖1 基本定時器結構圖
為了便于理解,可以將基本定時器框圖分為4個功能單元。
①:預分頻計數單元,由PRESCALE COUNTER (PC) 和 PRESCALE REGISTER (PR)組成,預分頻計數器(PC)會在每個 PCLK 時鐘上遞增計數。達到設定的預分頻值后,定時器計數器就會加1,而預分頻值就是由PR寄存器決定的。
②:定時器計數單元,由TIMER COUNTER (TC) 和 TIMER CONTROL REGISTER (TCR)組成,定時器控制寄存器TCR決定計數器TC是否啟用。預分頻計數器(PC)溢出后,定時器計數器(TC)加1,達到設定的匹配值MR0之后可以根據設置產生中斷等行為。
③:定時器匹配單元:該單元只有一個MATCH REGISTER0(MR0),它決定著定時器計數器TC的匹配值。
④:定時器控制單元,由MATCH CONTROL REGISTER (MCR) 和 INTERRUPT REGISTER (IR)組成,二者共同作用,控制著定時器的主要功能和參數。
2、ME32F030基本定時器寄存器
在簡介中,我們介紹了基本定時器的模塊框圖,其實每個功能模塊都有對應的寄存器來實現其功能。基本定時器的寄存器列表如圖所示:
2-1 中斷寄存器
中斷寄存器包含用于匹配中斷的位。如果有中斷產生, IR 中的相應位為高電平。否則,該位為低電平。向對應的 IR 位寫邏 輯 1 會使中斷復位。寫 0 無效。
2-2 定時器控制寄存器
定時器控制寄存器用于控制計數器/定時器的操作。它主要控制著計數器的使能和復位,具體的操作如圖所示:
圖3 控制寄存器
2-3 定時器計數寄存器
當預分頻器計數器達到其 PC 數值時, 16 位定時器計數器會遞增計數。如果 TC 在到達計數器上限之前沒有復位,它將一直 計數到 0x0000 FFFF 然后翻轉到 0x0000 0000。該事件不會產生中斷,如果需要,可使用匹配寄存器檢測溢出。
2-4 預分頻寄存器
16 位預分頻寄存器指定預分頻計數器的最大值。當預分頻計數器計數到此值后,會從0開始重新計數。
2-5 預分頻計數寄存器
16 位預分頻計數器用某個常量來控制 PCLK 的分頻,再使其輸入到定時器計數器。它所控制的是定時器分辨率與最大時間之間的關系,從而能防止定時器溢流。預分頻計數器會在每個 PCLK 時鐘上遞增計數。當預分頻計數器的計數達到預分頻寄存器中存儲的值時,定時器計數器將遞增計數,并且在下一個 PCLK 時鐘上對預分頻計數器復位。這將使得 TC 當 PR = 0 時在每個 PCLK 上遞增計數,當 PR = 1 時,在每 2 個 PCLK 上遞增計數,依次類推。.
2-6 匹配控制寄存器
匹配控制寄存器用于控制當其中一個匹配寄存器的值與定時器計數器的值匹配時應執行的操作。功能如下所示。
位0:決定著計數器TC與匹配值相等后,中斷是否使能。
位1:MR0與TC匹配時,決定TC是否復位。如果選擇復位,TC則會清0重新計數,這樣就會形成一個固定時間的計數周期。
位2:MR0與TC匹配時,決定TC是否停止。如果置1選擇使能,TC則不再會計數。這樣就是個單次周期的計數了。如果想要周期性循環計數,那么就需要置0(默認)禁止。
圖4 匹配控制寄存器
2-7 匹配寄存器
匹配寄存器的值會不斷地與定時器計數器值進行比較。當兩個值相等時,自動觸發相應操作。這些操作包括產生中斷、復位定時器計數器或停止定時器。所有操作均由 MCR 寄存器中的設置控制。
3、基本定時器驅動函數
在例程LIB->common->Drivers->Source文件夾內有timer.c文件,這個就是提供的定時器庫程序,里面除了基本定時器的驅動函數,還包括高級定時器、PWM輸出等功能函數,本章節先對基本定時器的函數進行講解。
3-1 基本定時器初始化
ct:要初始化的定時器模塊,可選TIM0、TIM1、TIM2、TIM3。
tickpersecond:預分頻系數。
voidTIM0_Init(TIM0_Type*ct,uint32_ttickpersecond) { if(ct==TIM0) { SYSCON->SYSAHBCLKCTRL_b.TIM0_CLK=1;//使能定時器時鐘 SYSCON->PRESETCTRL_b.TIM0_RST_N=0;//復位定時器 SYSCON->PRESETCTRL_b.TIM0_RST_N=1; } elseif(ct==TIM1) { SYSCON->SYSAHBCLKCTRL_b.TIM1_CLK=1; SYSCON->PRESETCTRL_b.TIM1_RST_N=0; SYSCON->PRESETCTRL_b.TIM1_RST_N=1; } elseif(ct==TIM2) { SYSCON->SYSAHBCLKCTRL_b.TIM2_CLK=1; SYSCON->PRESETCTRL_b.TIM2_RST_N=0; SYSCON->PRESETCTRL_b.TIM2_RST_N=1; } elseif(ct==TIM3) { SYSCON->SYSAHBCLKCTRL_b.TIM3_CLK=1; SYSCON->PRESETCTRL_b.TIM3_RST_N=0; SYSCON->PRESETCTRL_b.TIM3_RST_N=1; }elsereturn; //設置預分頻系數 if(tickpersecond>SystemCoreClock) tickpersecond=SystemCoreClock; ct->PR_b.PRVAL=SystemCoreClock/tickpersecond-1; return; }
3-2 設置匹配寄存器
這個函數用于設置定時器的匹配值,以及達到匹配值之后的行為。
Ct:要設置的定時器模塊,可選TIM0、TIM1、TIM2、TIM3。
Ticks:要寫入的計數器匹配值。
Action: 觸發中斷 TIM_MATCH_TRIGGER_INT
復位計數器 TIM_MATCH_RESET_COUNTER
停止計數器 TIM_MATCH_STOP_COUNTER
voidTIM0_ConfigMatch(TIM0_Type*ct,uint16_tticks,uint8_taction) { ct->MR0_b.MATCH=ticks-1; ct->MCR=action; return; }
3-3 設置預分頻計數器值
voidTIM0_SetTimerCounter(TIM0_Type*ct,uint16_ttick) { ct->PC_b.PCVAL=tick; return; }
3-4 復位預分頻計數器值
voidTIM0_ResetTimerCounter(TIM0_Type*ct) { ct->PC_b.PCVAL=0; return; }
來源:敏矽MCU
-
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
計數器
+關注
關注
32文章
2256瀏覽量
94477 -
定時器
+關注
關注
23文章
3246瀏覽量
114720 -
Cortex-M0
+關注
關注
4文章
124瀏覽量
38673
發布評論請先 登錄
相關推薦
評論