从S5PV210学习最基础的定时器处理(PWM篇)

注:下文都以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的值需要手动加载。

发布了45 篇原创文章 · 获赞 2 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章