S5PV210 PWM定时器

第一节 S5PV210的PWM定时器
S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。PWM定时器使用PCLK_PSYS作为时钟源,相关知识可以查阅"初始化时钟",相关的结构图如下:

image

第二节 程序相关讲解
完整代码见目录见详细代码下载链接。
1. main.c
核心代码如下:
int main(void)
{
// 初始化串口
uart_init();
// 中断相关初始化
system_initexception();
// 设置timer
timer_request();
while(1);
}
共4个步骤,其中第3步与定时器相关:
第一步 初始化串口;
第二步 中断相关初始化;
第三步 设置timer,函数timer_request()的定义位于timer.c中;
第四步 死循环,等待timer中断的发生;
2. timer.c
void timer_request(void)
{
printf(" #############Timer test############ ");
// 禁止所有timer
pwm_stopall();
// 设置timer0中断的中断处理函数
intc_setvectaddr(NUM_TIMER0,irs_timer);
// 使能timer0中断
intc_enable(NUM_TIMER0);
// 设置timer0
timer_init(0,65,4,62500,0);
}
共3个步骤:
第一步 禁止所有timer,往寄存器TCON写0即可;
第二步 设置VIC,先设置timer0中断的中断处理函数为irs_timer(),然后使能timer0中断;
第三步 设置timer0,调用了函数timer_init(),其核心工作是:
1) 设置分频
首先设置分频系数,相关寄存器是TCFG0,如下:

image
然后设置为16分频,相关寄存器是TCFG1,如下:

image

经过上面的设置之后,就能确定timer的输入时钟了,计算方式如下:
Timer Input Clock Frequency = PCLK / ( {prescaler value + 1} ) / {divider value} = 66MHz/(65+1)/16=62500hz
2) 设置计数
设置寄存器TCNTB0=62500和TCMPB0=0,启动timer0后,TCNTB0会逐渐-1,直到等于TCMPB0时就产生一次中断,即1秒产生一次timer0中断。

image
3) 启动timer0
设置寄存器TCON,先设置手动更新位,然后清除手动更新位,使用自动装载,最后启动timer0。
4) 使能timer0中断
设置寄存器TINT_CSTAT,使能timer0中断。

image

最后再来分析timer0中断处理函数irs_timer(),共3个步骤:
第一步 清timer0的中断状态寄存器TINT_CSTAT;
第二步 打印timer0中断发生的次数,每产生一次timer0中断就打印一次。
第三步 VIC相关的中断清除,调用函数intc_clearvectaddr();
第三节 实验现象
终端会不断的打印数字1、2、3、4...,频率为每秒打印1次。

详细代码下载链接:http://download.csdn.net/detail/klcf0220/5741631

原文地址:https://www.cnblogs.com/klcf0220/p/3185917.html