1. 程式人生 > >S5P4418裸機開發(十四):TIMER

S5P4418裸機開發(十四):TIMER

概述

在這裡插入圖片描述

  • S5P4418,5個定時器
  • Timers 0, 1, 2, and 3有連線GPIO,可以輸出PWM
  • 時鐘源PCLK,2nboot預設配置為200MHz
  • Timers 0 and 1共享一個預分頻器,Timers 2, 3, and 4共享另外一個

相關暫存器

暫存器 功能
TCFG0 死區,預分頻
TCFG1 DMA,分頻
TCON 自動重灌載,手動更新,輸出翻轉,啟動/停止定時器
TCNTB 存放重灌載值
TCMPB0 比較值
TCNTO0 RO,觀察計數器值,不是TCNT
TINT_CSTAT 中斷使能,清除標誌位

配置流程

在這裡插入圖片描述 在這裡插入圖片描述

  1. 關閉復位功能,手冊上貌似也沒給太詳細的說明,不清零定時器起不來
  2. 配置分頻,TCFG0, TCFG1
  3. 手動更新位置1,置1後定時器自動將TCNTBTCMPB的值送TCNTTCMP,不置1定時器起不來
  4. 配置VIC
  5. 中斷使能,TINT_CSTAT
  6. 按需求開啟自動重灌載,啟動定時器,同時清0手動更新位,TINT_CSTAT
  7. 中斷服務程式退出前要清除中斷標誌位,以及VIC的VICADDRESS

例子

void timer0_init(){
    IP_RESET_REGISTER1 |= (1 << 4);     // 關閉復位

    TCFG0 |= (250 - 1);     // PCLK = 200MHz 200000000 / 16 / 250 = 50000;
    TCFG1 |
= 0x4; TCNTB0 = 50000; // 1s TCON |= (1 << 1); vic_init(23, (u32)timer0_ISR); // 註冊VIC TINT_CSTAT |= (1 << 0); // 中斷使能 TCON &= ~(1 << 1); TCON |= ((1 << 3) | (1 << 0)); // 自動重灌載,啟動定時器 } void timer0_ISR(){ printf("timer_ISR %x\r\n", 0); TINT_CSTAT |
= (1 << 5); // 清除中斷標誌 VICADDRESS_CH0 = 0x0; }

工程程式碼: