目录
1.Generic Timer初识
2.R52+的Generic Timer
3.如何配置Timer中断
4.小结
1.Generic Timer初识
Arm Cortex-R52+内部实现了Generic Timer(通用计时器),它可以基于递增计数来产生中断和事件流。
事实上,该计时器和Armv8-R AArch32中的定义完全一致,故所有细节需要查看如下文档:
- 《_Arm__®_ _Architecture Reference Manual _Supplement Armv8, for the Armv8-R AArch32 architecture profile__》
- 《_Arm__® _Architecture Reference Manual Armv8, for Armv8-A architecture profile__》
那么什么是通用计时器呢?
根据Arm文档描述,Generic Timer主要给Arm内核提供了基础的计时器框架,该模块包含了1个System Counter、每个PE一组Timer,整体结构如下:
一般来说,System Counter不由CPU实现,而是从Always-Powered域实现,如下图:
System Counter只是单调递增,并不能反映真实世界的时间。它将计数值通过System Timer Bus分发给每个PE的Timer中,当这个Timer配置比较值到达后,会触发相应的系统事件,发送给到GIC(Interrupt Controller),由GIC产生FIQ\IRQ给到内核进行响应。如下图所示:
2.R52+的Generic Timer
R52+每个核都有一组计时器,分为是:
- 一个EL1物理计时器
- 一个EL2物理计时器
- 一个虚拟计时器
每个计时器都有一个PPI(Private Peripheral Interrupts)提供给Core,这也是我们用这个计时器做滴答最方便快捷的原因。
计时器有三类寄存器,分别为:
- CTL:控制寄存器,Control register
- CVAL:比较值寄存器,Comparator value register
- TVAL:计时器寄存器,Timer Value register
上述三类寄存器根据不同计时器有不同的前缀,分别为:
- CNTP:Counter-timer Physical Timer
- CNTV:Counter-timer Virtual Timer
- CNTHP:Counter-timer Hyp Physical Timer
所以这个表就很明确了,CNTP_CTL表示EL1等级下的物理计时器的控制寄存器,后面以此类推。
3.如何配置Timer中断
首先要配置计时器让它产生事件,然后通过配置产生中断。
配置计时器有两种方式:
- 使用CVAL寄存器:通过写入某些值到比较寄存器,一旦System Counter大于等于该值,就会产生对应事件,如下:
- 使用TVAL寄存器:通过写入某些值到TVAL寄存器,CVAL = TVAL+System Counter,一旦大于等于,就会产生对应事件,如下:
如何产生中断?
通过设置CTL寄存器, 位域如下:
- ENABLE - 使能计时器
- IMASK - 中断掩码. 使能或者抑制中断产生
- ISTATUS - 计时器事件是否满足(CVAL <= System Count),需配合ENABLE =1使用
因此要产生中断就很容易了,ENABLE = 1,IMASK = 0。
那我们就只需要在GIC注册中断函数,即可实现Generic Timer的中断。
需要特别注意的是,当处理完该中断时,需要软件去清一下GIC对应中断标记,否则又会产生相同中断。
4.小结
没有总结,感觉没用的知识又增加了,哈哈哈。
作者:快乐的肌肉
来源:汽车MCU软件设计
推荐阅读:
更多汽车电子干货请关注汽车电子与软件专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。)