Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
cortex-A
timer
armv7 generic timer使用笔记
5.00
发布于 2023-04-09 16:50:18 浏览:910
订阅该版
[tocm] ## generic timer介绍 armv7-A架构中每个CPU核心都包含自己的私有定时器,所有cpu的定时器共享一个`System counter`, `System counter`负责产生计数,传递到每个核心的私有定时器,架构如下图所示: ![gtimer_架构.png](https://oss-club.rt-thread.org/uploads/20230409/5076fba4effa354c0d459ac5cc91a960.png.webp) * 该定时器可以产生中断,作为系统心跳使用,类似于`cortex-M`的`systick`,详细的中断号在`DDI0471B_gic400_r0p1_trm.pdf`中有说明,下面PPI中断号的截图说明: ![gic400-ppi.png](https://oss-club.rt-thread.org/uploads/20230409/06b19c9ce5905925edf955ea16af687a.png) ## gtimer寄存器介绍 * armv7-A架构中`generic timer`寄存器如下图所示: ![gtimer_reg.png](https://oss-club.rt-thread.org/uploads/20230409/2ee56a77db310423fb6bdde45f8a9cf6.png.webp) * 在ARMv7-A中定义了不同的特权级别,分别是PL0, PL1, PL2,PL0是普通用户模式,在PL1、PL2模式下分别有对应的定时器。 下面介绍PL1模式下的定时器,也就是svc、FIQ模式下的定时器,rt-thread的宏内核版本运行在svc模式下,所以我们着重研究PL1物理定时器的使用。 ## 关键寄存器说明 1. `CNTFRQ`寄存器是定时器频率值,这个需要根据实际的硬件情况设置,在全志平台上是24M,这个必须设置, 操作寄存器的内联汇编代码: ```c __asm__ volatile("MCR p15, 0 , %0, c14, c0, 0" : : "r" (Rt) : "memory" ) ``` 2. `CNTPCT`是物理计数器寄存器,这个寄存器是64位的,寄存器值会一直累加,根据`CNTFRQ`寄存器中的频率进行累加,所以这个值可以作为时间tick来使用,在一些需要简短的延时场景可以借助这个计数器。获取计数器值的代码: ```c uint64_t get_arch_counter(void) { uint32_t low=0, high = 0; asm volatile("mrrc p15, 0, %0, %1, c14" : "=r" (low), "=r" (high) : : "memory"); return (((uint64_t)high)<<32 | low); } ``` 2. `CNTP_TVAL`寄存器, 这个寄存器一般在开启gtimer的中断时使用。写入`CNTP_TVAL`寄存器时,硬件会自动把该值加上`System Counter`的值,一并写入`CNTP_CVAL`寄存器中,作为下一次中断的时基。内联汇编伪代码如下: ```c __asm__ volatile("MCR p15, 0 , %0, c14, c2, 0" : : "r" (Rt) : "memory" ) ``` * 特别说明 `CNTP_CVAL = CNTP_TVAL + System Counter`。 3. `CNTP_CVAL`寄存器,该寄存器是比较寄存器,当`System Counter`的值大于等于`CNTP_CVAL`的值时产生中断,如果需要改写此寄存器的值可以,通过写入`CNTP_TVAL`来实现,避免读改写寄存器的繁琐操作。 4. `CNTP_CTL`是PL1物理定时器的控制寄存器, 操作的内联汇编代码如下: ```c __asm__ volatile("MCR p15, 0 , %0, c14, c2, 1" : : "r" (Rt) : "memory" ) ``` * `CNTP_CTL`寄存器控制位说明: ![gtimer_control.png](https://oss-club.rt-thread.org/uploads/20230409/01bedc51fa3885cbacf439d347aebe32.png.webp) * 其中bit0负责使能定时器,bit1是否打开中断信号。 PL1物理定时器的中断号,在全志平台是29,其他CPU平台待验证。 5. 详细gtimer操作代码可以参考rt-thread源码目录中libcpu->cortex-a中的gtimer.c文件。 ## 其他相关代码 1. 在linux上,关于gtimer的代码在arch_timer.c文件中。 2. rt-thread中在gtimer.c中。
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
小鳄鱼
rt-thread脑残粉
文章
8
回答
45
被采纳
7
关注TA
发私信
相关文章
1
不同的pwm能否使用同一个timer的不同channel?
2
硬件定时器的问题咨询
3
hard fault on thread: timer
4
NANO移植finsh会导致启动时卡死在rt_object_init
5
rt_timer_start 链表死循环
6
定时器 rt_timer_init 里超时时间无效
7
timer文件的源码分析
8
定时器API bug反馈
9
关于RT-Thread中的软定时器使用疑问请教
10
rt_timer_detach脱离定时器后,定时器还在执行
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部