嵌入式Linux裸机开发(九)——S5PV210定时器

S5PV210内部一共有四类定时器。

一、PWM定时器

1PWM定时简介

wKioL1dY_PSxUDUgAAGN4BlNNLI595.png

    S5PV210内部共有5个32bit的PWM定时器。PWM定时器可以生成内部中断。PWM定时器0、1、2、3具有PWM功能,可以驱动外部I/O信号。PWM定时器4是一个无外部引脚的内部定时器。PWM 定时器使用 PCLK_PSYS 作为时钟源

    每个定时器有一个由定时器时钟驱动的32位递减计数器。递减计数器的初始值是由TCNTBn自动装载而获得的。如果递减计数器减到 0 时,定时器发出中断请求通知CPU定时器操作已经完成,当定时器递减计数器到达 0,相应的 TCNTBn的值也会自动的装载到递减计数器中以继续下一次循环操作。 在定时器正在运行模式下通过对TCON的定时器使能位清零,则TCNTBn的值不会自动装载到计数器中。TCMPBn 寄存器的值用于脉宽调制功能(PWM)。当递减计数器的值和定时器控制逻辑单元中的比较寄存器的值匹配时,定时器控制单元会改变输出电平。因此,比较寄存器的值决定了PWM的占空比。当定时器使能,定时器计数存寄存器(TCNTBn得到一个被装载到递减计数器中的初始值。定时器比较缓存寄存器(TCMPBn)有一个被装载到比较寄存器中用来和递减计数器的值作比较的初始值。 TCNTBn和TCMPBn双缓存特点使得当频率和负荷发生改变时,定时器生成一个稳定的输出。

主要控制寄存器:

    TCFG0:预分频器参数设置,范围为0-255,定时器0和1,用Prescaler 0,定时器2,3,4用Prescaler 1,预分频系数为1-256

    TCFG1:分频器参数设置,MUX开关,1/1,1/2,1/4,1/8,1/16

    TCON:定时器的设置

    TCNTBn:定时计数寄存器

    TCMPBn:占空比计数寄存器

    TCNTOn:观察寄存器

 

    PWM:PWM是一个周期性波形,每个周期内由一个高电平和一个低电平组成,PWM的参数有周期T和占空比duty。TCNTBn和TCMPBn决定了PWM的周期和占空比,占空比等于TCMPBn/TCNTBn,周期等于TCNTBn/时钟频率。PWM可以用于对基波进行载波调制,通过对LED调制电流进行调光,驱动蜂鸣器buzzer。

    输出电平翻转器:TCNT>TCMPB时为高电平,TCNT<TCMPB时为低电平。电平翻转器可以将低电平变为高电平,高电平变为低电平。TCON寄存器有可以设置相应定时器的电平翻转位为1。

2、PWM定时器驱动蜂鸣器

A、查阅底板电路原理图有关buzzer部分

wKiom1dY_A2x8C96AAArVWqNqT0405.png

    蜂鸣器buzzer的引脚为XpwmTOUT0,使用timer0

B、查阅核心板电路原理图有关PWM timer部分

    XpwmTOUT0对应的GPIO引脚为GPD0_0

wKioL1dY_TmiFTFOAACoqzFgQdI984.png


C、相关寄存器设置

//GPIO相关功能选择,GPD0_0PWM模式TOUT_110

    GPD0CON &= ~(0xF<<0);

    GPD0CON |= (0x2<<0);


    //设置预分频器参数为65,则预分频系数为661MHZ

    TCFG0 &= ~(0xFF<<0);

    TCFG0 |= (65<<0);


    //设置分频器参数为1,分频系数为1/2,500KHZ

    TCFG1 &= ~(0xFF<<0);

    TCFG1 |= (0x1<<0);


    //设置自动重载

    TCON |= (1<<3);

    //设置TCNTB

    TCNTB0 = 300;

    //设置TCMPB

    TCMPB0 = 150;


    //手动刷新TCNTB0,TCMPB0

    TCON |= (1<<1);

    //关闭刷新

    TCON &= ~(1<<1);

    //打开timer0

    TCON |= (1<<0);

 

    工程源码见附件,编译后烧录到smart210可以正常听到蜂鸣器的声音。

一、看门狗定时器

1、看门狗定时简介

    看门狗定时器相当于一个普通的 16bit 的定时器,看门狗定时器可以产生 reset信号

wKiom1dY_FSA1sI5AACw1vZRAho608.png

相关寄存器:

    WTCON:选择中断、复位模式,时钟,如果使用看门狗提供定时器功能,打开中断,关闭复位

    WTDAT:看门狗递减计数器的重载值,初始化时不能自动重载

    WTCNT:看门狗递减计数器的初始值,初始化时不能从WTDAT自动加载

    WTCLRINT:写任意值,清除中断

2、看门狗定时器编程

A、中断方式

    工程实现采用按键中断工程为模本,主要修改了中断源部分,看门狗中断属于内部中断,无需设置外设GPIO引脚、外部中断控制寄存器,只需设置中断向量控制寄存器。修改部分如下:

//看门狗寄存器初始化

void wdt_interrupt_init(void)

{

//设置预分频

WTCON &= ~(0xFF<<8);

WTCON |= (65<<8);//1M

//设置分频

WTCON &= ~(3<<3);

WTCON |= (3<<3);//1/128


//禁止RESET

WTCON &= ~(1<<0);

//打开中断

WTCON |= (1<<2);


//设置定时时间

WTDAT = 10000;

WTCNT = 10000;


//最后打开看门狗

WTCON |= (1<<5);

}

//中断服务程序

static int i = 0;

void isr_wdt(void)

{

printf("interrupt %d\r\n", i++);

interrupt_clear_vicaddr();

WTCLRINT = 0;

}

    Makefile和中断源等其它修改见附件。工程编译后正常在smart210运行,运行结果:每隔一定时间打印出中断信息。

B、复位方式

    工程实现以UART串口移植printf工程为模本,修改部分主要是寄存器控制部分。

void wdt_reset_init(void)

{

//设置预分频

WTCON &= ~(0xFF<<8);

WTCON |= (65<<8);//1M

//设置分频

WTCON &= ~(3<<3);

WTCON |= (3<<3);//1/128


//禁止中断

WTCON &= ~(1<<2);

//打开reset

WTCON |= (1<<0);


//设置定时时间

WTDAT = 10000;

WTCNT = 10000;


//最后打开看门狗

WTCON |= (1<<5);

}

    工程编译后正常在smart210运行,运行结果:每隔一定时间复位,打印出中断信息。

一、实时时钟RTC

1、实时时钟RTC

    实时时钟在系统电源关闭后使用备份电源。实时时钟使用32.768 kHz的外部晶体振荡器工作,具备闹钟功能。

wKioL1dY_YGyFwVlAAC0f9I7SUU047.png


S5PV210的RTC的特性如下:

支持BCD编码

支持闰年生成器

支持闹钟功能,能从低功耗模式闹钟中断、唤醒

支持Tick计数器,

支持毫秒级tick time

 

RTC产生ALARM_INTALARM_WK信号,在正常模式下,ALARM_INT是激活的,在电源关闭模式下,ALARM_INTALARM_WK是激活的。RTC的闹钟寄存器RTCALM决定了闹钟的打开/关闭状态和闹钟的时间设置条件。

主要控制寄存器:

    INTP:中断挂起寄存器

    RTCON:RTC控制寄存器

    RTCALM:闹钟控制寄存器

    ALMXXX:闹钟时间设置寄存器

    BCDXXX:BCD时间设置寄存器

2、实时时钟RTC的闹钟编程

默认情况下RTC的读写操作时禁止的,需要更改RTC时间时先打开RTC读写开关,操作完后关闭RTC开关。

    工程项目以按键中断工程为模本,主要修改了中断源部分,看门狗中断属于内部中断,无需设置外设GPIO引脚、外部中断控制寄存器,只需设置中断向量控制寄存器。另外添加了时间的显示和BCD编码的相关功能。

    工程源代码见附件,编译后可以正常在smart210烧录运行,打印初始信息后每分钟的第N秒产生闹钟中断,打印信息。

四、系统定时器

    系统定时器可以提供毫秒级别的定时功能,并且可以在不停止系统时钟Tick的情况下可以改变中断间隔。