概述
- 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 | 中断使能,清除标志位 |
配置流程
- 关闭复位功能,手册上貌似也没给太详细的说明,不清零定时器起不来
- 配置分频,
TCFG0, TCFG1
- 手动更新位置1,置1后定时器自动将
TCNTB
和TCMPB
的值送TCNT
和TCMP
,不置1定时器起不来 - 配置VIC
- 中断使能,
TINT_CSTAT
- 按需求开启自动重装载,启动定时器,同时清0手动更新位,
TINT_CSTAT
- 中断服务程序退出前要清除中断标志位,以及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;
}