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);
    
  • Select Timer #0 clock source
  • CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, 0);
    
  • Initialize Timer #0 periodic mode (2Hz)
  • TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 2);
    
  • Enable Timer #0 interrupt
  • TIMER_EnableInt(TIMER0);
    NVIC_EnableIRQ(TMR0_IRQn);
    
  • Start Timer #0
  • TIMER_Start(TIMER0);
    
  • Timer #0 Interrupt Service
  • 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 中斷服務程式未完成的事件 


範例程式碼位於 Github 的 nuvoton-M451-Sample 的 FreeRTOS-Timer1-Sample branch


Reference document :
  • nuvoton NuMicro-M451-Series-Training-Material
  • nuvoton TRM_M451_Series_EN_Rev2.08 

留言

這個網誌中的熱門文章

EC 所需知識 - SMBUS

EC 所需知識 - KBC

EC 所需知識 - LPC