nuvoton - M451 Timer
Timer 支援的功能有
- 4 個 32-bits timer 控制器( 24 bits 的計數器和 8 bits 預除器)
- 6 個時脈來源
- 支援由 power-down mode 喚醒 CPU
- 支援事件計數功能
- 支援外部事件觸發功能
- 支援 4 種工作模式
- One-shot
- Periodic
- Toggle
- Continuous counting
Timer Clock Source
- HXT (High Speed External Clock Source)
- TMRxSEL = 000b
- 4 - 24MHz
- LXT (Low Speed External Clock Source)
- TMRxSEL = 001b
- 32.768 KHz
- PCLK
- TMRxSEL = 010b
- T0 - T3
- TMRxSEL = 011b
- LIRC (Low Speed Internal Clock Source)
- TMRxSEL = 100b
- 10 KHz
- HIRC (High Speed Internal Clock Source)
- TMRxSEL = 101b
- 22.1184 MHz
Timer Block Diagram
由方塊圖得知,以 32 bits 計數器(8 bits pre-scale and 24 bits counter) 為核心, 計數 internal clock , external clock, external Event 等,計數的結果放在 TCNT. 而 Capture 模組,使用於計數 clock 數來取得速度.Timer Function Mode
根據設定,Timer 可以分成四種工作模式如下表:Timer 的中斷
- TIF (TIMERx_INSTS[0]) - 當 TIMERx_CNT[23:0] 計數到 TIMERx_CMPDAT[23:0]
- CAPIF (TIMERx_EINSTS[0]) - 當 Tx_EXT 接腳接收到變化而且 CAPEDGE (TIMERx_EXTCTL[2:1] 設為 1.
Timer 四種工作模式如下:
- Timer Counting Mode : 分為四種計數模式如下 -
- One-shot mode :
- TIMERx_CTL[28:27] = 00b
- TIMERx_CTL[30] = 1b , 開始計數
- 當 TIMERx_CNT[23:0] 計數到 TIMERx_CMPDAT[23:0], TIF (TIMERx_INTSTS[0]) 會被設起來.
- TIMERx_CNT[23:0] 和 CNTEN 會被清為 0
- 若 INTEN 設為 enable, 就會產生中斷.
- Periodic mode :
- TIMERx_CTL[28:27] = 01b
- TIMERx_CTL[30] = 1b , 開始計數
- 當 TIMERx_CNT[23:0] 計數到 TIMERx_CMPDAT[23:0], TIF (TIMERx_INTSTS[0]) 會被設起來.
- TIMERx_CNT[23:0] 會被清為 0, 重新計數.
- 若 INTEN 設為 enable, 就會產生中斷.
- Toggle-output mode :
- TIMERx_CTL[28:27] = 10b
- TIMERx_CTL[30] = 1b , 開始計數
- 當 TIMERx_CNT[23:0] 計數到 TIMERx_CMPDAT[23:0], TIF (TIMERx_INTSTS[0]) 會被設起來.
- TIMERx_CNT[23:0] 會被清為 0, Toggle output signal, 重新計數.
- 若 INTEN 設為 enable, 就會產生中斷.
- Continuous counting operation mode :
- TIMERx_CTL[28:27] = 11b
- TIMERx_CTL[30] = 1b , 開始計數
- 當 TIMERx_CNT[23:0] 計數到 TIMERx_CMPDAT[23:0], TIF (TIMERx_INTSTS[0]) 會被設起來.
- 中斷產生時,可以再重新設定 CMPDAT 的值.
- TIMERx_CNT[23:0] 會繼續計數到最大值
- 若 INTEN 設為 enable, 就會產生中斷.
- Event Counting Mode
- 計數輸入的事件(T[3:0]) 並存到 CNT (TIMERx_CNT[23:0])
- EXTCNTEN (TIMERx_CTL[24]) = 1b
- Clock source 為 PCLK[1:0]
- Input event frequency < 1/3 PCLK[1:0] without de-bounce ; < 1/8 PCLK[1:0] with de-bounce
- External Capture Mode
- 當偵測 T[3:0]_EXT 有位準轉換, 就會把 CNT (TIMERx_CNT[23:0])存到 CAPDAT (TIMERx_CAP[23:0])
- CAPFUNCS (TIMERxEXCTL[4]) = 0b
- Clock source 為 PCLK[1:0]
- Input event frequency < 1/3 PCLK[1:0] without de-bounce ; < 1/8 PCLK[1:0] with de-bounce
- External Reset Counter Mode
- 當偵測 T[3:0]_EXT 有位準轉換, 就會把 CNT (TIMERx_CNT[23:0]) 清除為 0
- CAPFUNCS (TIMERxEXCTL[4]) = 1b
Timer Trigger Function
- Timer Trigger PWM
- TRGPWM (TIMERx_CTL[19]) = 1, if the timer interrupt.
- The timer will trigger pulse as PWM external clock source
- Timer Trigger DAC
- TRGDAC (TIMERx_CTL[20]) = 1, if the timer interrupt.
- The timer trigger DAC to start converter
- Timer Trigger EADC
- TRGEADC (TIMERx_CTL[21]) = 1, if the timer interrupt.
- The timer trigger EADC to start converter
Timer Coding Flow
- Enable Clock for Timer #0 module
CLK_EnableModuleClock(TMR0_MODULE);
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, 0);
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 2);
TIMER_EnableInt(TIMER0);
NVIC_EnableIRQ(TMR0_IRQn);
TIMER_Start(TIMER0);
void TMR0_IRQHandler(void)
{
// clear Timer0 interrupt flag
TIMER_ClearIntFlag(TIMER0);
}
隨著時代的變遷,MCU 的程式開發也都加入了 RTOS 來加快了程式碼的開發和 Task 的排程管理,因此範例程式使用了 nuvoton 提供的 FreeRTOS 範例程式來開發,並且在 NuEdu M453 的開發板上驗証功能完成。
在 FreeRTOS 的範例中,啟動 Timer 1 並且建立了4 個 Task
- USER-IF Task : 保留給 User UART command 做 debug 功能
- Toggle LED Task : 開關 NuEdu 開發板的 LED
- Segment LED Task : 顯示七段顯示器的功能
- Timer 1 ISR Task : 完成 Timer 1 中斷服務程式未完成的事件
Reference document :
- nuvoton NuMicro-M451-Series-Training-Material
- nuvoton TRM_M451_Series_EN_Rev2.08
留言
張貼留言