卢骏 · 2020年07月09日

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

第十三章 定时器

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

1、210定时器

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

1.png

用的管脚是GPD0的0-3管脚。
2.png

使用的时钟是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输出高。
3.png

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

寄存器列表(804页):

5.png

2、寄存器
2.1、TCFG0

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

6.png

2.2、TCFG1

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

2.3、CON

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

8.png

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

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

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

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

2.4、TCNTB和TCMPB

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

2.5、TINT_CSTAT

中断使能及中断状态:
11.png

3、WDT

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

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

4、RTC
4.1、rtc

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

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

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

RTC框图:
12.png

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

寄存器列表:

13.png

4.2、寄存器
4.2.1、INTP

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

4.2.2、RTCCON

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

4.2.3、TICNT

tick设置的时间值:
17.png

4.2.4、RTCALM

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

19.png

4.2.5、ALMSEC

闹钟的秒:
20.png

4.2.6、ALMMIN

闹钟的分:
21.png

4.2.7、ALMHOUR

闹钟的时:
22.png

4.2.8、ALMDAY

闹钟的日:

23.png

4.2.9、ALMMON

闹钟的月:
24.png

4.2.10、ALMYEAR

闹钟的年:
25.png

4.2.11、BCDSEC

秒:
26.png

4.2.12、BCDMIN

分:
27.png

4.2.13、BCDHOUR

时:

28.png

4.2.14、BCDDAY

日:
29.png

4.2.15、BCDDAYWEEK

星期:
30.png

4.2.16、BCDMON

月:
31.png

4.2.17、BCDYEAR

年:
32.png

4.2.18、CURTICCNT

tick的当前计数值:

33.png

RTC结构体

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

34.png

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

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

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

系列其他篇

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。
推荐阅读
关注数
23565
内容数
1018
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息