S5P4418裸机开发(十四):TIMER

概述

S5P4418裸机开发(十四):TIMER_第1张图片

  • 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 中断使能,清除标志位

配置流程

在这里插入图片描述
S5P4418裸机开发(十四):TIMER_第2张图片

  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;
}

工程代码:

9_pwm_timer

你可能感兴趣的:(嵌入式)