CORTEX-A8裸机系列:第十三章 定时器

第十三章 定时器

这章代码,查看我的github地址:https://github.com/weiqi7777/…

1、210定时器

210有5个32位的定时器。其中0-3是可以输出到外部管脚的,可以当做PWM使用。4是不能的,只能当做普通定时器使用。

用的管脚是GPD0的0-3管脚。

使用的时钟是PCLK(一般是66M),0-1共享第一级的预分频器,然后各自有自己的第二级预分频(2,4,8,16),还可以选择时钟是SCLK_PWM。2-4共享第一级的预分频器,然后各自也有自己的预分频器(2,4,8,16)。

TCNTBx,是定时器的周期值,周期为TCNTBx * PCLK,TCMPx是PWM用来比较产生不同占空比。有两种,一种是当TCNTx大于TCMPx输出高,另一种是TCNTx小于TCMPx输出高。

210使用TCNTx大于TCMPx输出低,不过可以开启输出翻转,使TCNTx大于TCMPx输出高。

对于PWM0和PWM1可以使用死区生成器。死区的时间是可以通过寄存器配置的。

寄存器列表(804页):

2、寄存器
2.1、TCFG0

配置第一级两个预分频的预分频值,和PWM0,PWM1的死区时间。

2.2、TCFG1

用来选择第二级的时钟输入。

2.3、CON

timer的设置,开启或关闭定时,计数减为0自动载入或不载入,输出翻转是否使能,手动是否更新TCNTB,TCMPB,死区生成器开启和关闭。

对于manual update位。当值1后,会马上将TCNTBn ,TCMPBn 值载入到TCNTn ,TCMPn,实现了马上更改寄存器值。而如果值为0,那么会在TCNTn计数到0时,才会将TCNTBn ,TCMPBn 值载入到TCNTn ,TCMPn。

对于auto|reload位,置为1,定时器一直工作,置为0,定时器只工作1次。

在编程的时候,要注意,对于自动刷新,第一次的时候要打开,不过打开后,要关闭。不然定时器不能正常工作。在之后更改TCMPBn或者TCNTBn值后,定时器计数到0时,会自动的自动载入。

对于开启定时器位,应该在定时器的参数都设置好后,最后才开启。

2.4、TCNTB和TCMPB

设置定时器的计数时长和占空比大小。

2.5、TINT_CSTAT

中断使能及中断状态:

3、WDT

看门狗,使用比较简单。就配置几个寄存器。WDT可以产生中断,也可以产生复位信号,当产生复位信号,中断就没有用了。

在usb调试模式下,WDT产生复位后,程序再次启动会失败。猜测原因是:复位后,将内部的iram寄存器的值给复位了,所以造成程序启动失败。所以在USB模式下,使用WDT的复位是没有用的。

4、RTC
4.1、rtc

实时时钟使用外部晶振32.768KhZ,可以使用备用电池进行供电。RTC能存储秒,分,时,星期,日,月,年。还具有闹钟的功能。

RTC可以产生两个中断,一个闹钟中断,一个是tick中断。

Tick中断就是利用RTC来产生一个周期性的中断信号,该信号可以提供给操作系统使用,当做时间片切换进程。

RTC框图:

所有的寄存器都是BCD格式,如果要往这些寄存器写值,需要设置RTCCON寄存器的第0位。

寄存器列表:

4.2、寄存器
4.2.1、INTP

中断状态寄存器,为1表示有中断产生,在中断处理中,需要将之清除,写1清除。

4.2.2、RTCCON

RTC时钟控制寄存器,设置RTC时钟输出是否时能,是否时能tick timer,tick timer时钟源选择,RTC是否使能,RTC修改是否使能。

4.2.3、TICNT

tick设置的时间值:

4.2.4、RTCALM

控制闹钟的时钟域哪些使能:

4.2.5、ALMSEC

闹钟的秒:

4.2.6、ALMMIN

闹钟的分:

4.2.7、ALMHOUR

闹钟的时:

4.2.8、ALMDAY

闹钟的日:

4.2.9、ALMMON

闹钟的月:

4.2.10、ALMYEAR

闹钟的年:

4.2.11、BCDSEC

秒:

4.2.12、BCDMIN

分:

4.2.13、BCDHOUR

时:

4.2.14、BCDDAY

日:

4.2.15、BCDDAYWEEK

星期:

4.2.16、BCDMON

月:

4.2.17、BCDYEAR

年:

4.2.18、CURTICCNT

tick的当前计数值:

RTC结构体

对于RTC寄存器,可以定义一个结构体,因为寄存器有些不是连续的,需要使用reserved进行占位。

初始化该寄存器组,可以使用以下方法,定义一个初始化的结构体。然后依次对寄存器进行赋值。

这里,不能使用memcpy,进行两个结构体数值的赋值。因为memcpy针对的是char *,每次赋值按字节为单位进行赋值。对于外设的寄存器,是要以字为单位进行访问的。

对于使用闹钟中断和tick中断,只需要注册中断处理程序和开启中断即可。对于闹钟中断,还需要设置闹钟的寄存器,打开闹钟中断。

系列其他篇

  • CORTEX-A8裸机系列:第十二章 中断控制器与外部中断
  • CORTEX-A8裸机系列:第十一章 串口

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。

发表评论

邮箱地址不会被公开。 必填项已用*标注