注:下文都以S5PV210为背景。
一.定时器概述
(1)定时器的作用
定时器可以让SoC在执行主程序的同时,可以(通过定时器)具有计时功能,
到了一定时间(计时结束)后,定时器会产生中断提醒CPU,CPU会去处理中断并
执行定时器中断的ISR。从而去执行预先设定好的事件。
(2)定时器的最重要组成
由于:定时时长 = 计数值×计数时间周期
所以定时器最重要的就是:
分频器 ——> 计数时间周期
TCNT ——> 计数值
二.S5PV210中的定时器
PWM定时器,特点能用于生成PWM波。
系统定时器,特点生成的定时(TCNT*时钟周期)是用来作为系统固定的时间间隔的,称systick。
看门狗定时器,特点能产生复位信号。
实时时钟RTC(real time clock),特点关注的是时间点(xx年x月x日x时x分x秒星期x)。
三.PWM定时器
1.210中PWM定时器的特点
(1)有5个PWM定时器,其中0,1,2,3有GPIO,可以用于生成PWM波,timer4只能用来产生
内部中断信号。
(2)clock是通过PCLK_PSYS经过两次分频产生。
2.重要寄存器
TCNT&TCMP、TCNTB&TCMPB、TCNTO
TCNT&TCMP是用来计数和生成占空比的,但不可读写。
程序员只能通过写其buffer寄存器,也就是TCNTB&TCMPB来写值,
通过TCNTO来读TCNT的值。
3. 自动重载和双缓冲(auto-reload and double buffering)
定时器的工作是单次的,当TCNT的值减到0,就会发出中断,并且定时结束,从前如果需要连续多
次定时,isr就需要重新设置TCNT,210中对此进行了改进,如果开启自动重加载,那么TCNT到0后
生成中断,并且TCNTB被自动加载进TCNT,开始下一次定时。
4.PWM波
占空比是通过TCNT和TCMP可到的,而PWM的周期也就是定时器的定时时间(TCNT*时间周期)。
5.电平翻转
由于PWM定时器可以规定:当TCNT>TCMPB时为高电平,当TCNT<TCMPB时为低电平。也可以
规定:当TCNT>TCMPB时为低电平,当TCNT<TCMPB时为高电平,所以如果当duty从30%变到70%时,我们TCMPB寄存器中的值就要改,但是电平翻转器开启后,输出电平一反转30%的duty就变成70%了
6.实践代码
// 初始化PWM timer2,使其输出PWM波形:频率是2KHz、duty为50%
void timer2_pwm_init(void)
{
// 设置GPD0_2引脚,将其配置为XpwmTOUT_2
rGPD0CON &= ~(0xf<<8);
rGPD0CON |= (2<<8);
// 设置PWM定时器的一干寄存器,使其工作
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= (65<<8); // prescaler1 = 65, 预分频后频率为1MHz
rTCFG1 &= ~(0x0f<<8);
rTCFG1 |= (1<<8); // MUX2设置为1/2,分频后时钟周期为500KHz
// 时钟设置好,我们的时钟频率是500KHz,对应的时钟周期是2us。也就是说每隔2us
// 计一次数。如果要定的时间是x,则TCNTB中应该写入x/2us
rCON |= (1<<15); // 使能auto-reload,反复定时才能发出PWM波形
//rTCNTB2 = 250; // 0.5ms/2us = 500us/2us = 250
//rTCMPB2 = 125; // duty = 50%
rTCNTB2 = 50;
rTCMPB2 = 25;
// 第一次需要手工将TCNTB中的值刷新到TCNT中去,以后就可以auto-reload了
rCON |= (1<<13); // 打开手动刷新功能
rCON &= ~(1<<13); // 关闭手动刷新功能
rCON |= (1<<12); // 开timer2定时器。要先把其他都设置好才能开定时器
}
总结:
对于PWM的基本编程,主要为三点:
(1)设置GPIO为TOUT.
(2)设置定时时长(TCNT*时钟周期),占空比(TCNT和TCMP)。
(3)一些功能的选择(如自动加载等),并启动时钟.
需要注意的是:
第一次加载buffer的值需要手动加载。