HPET 模块的设计和“基于HPET 模块实现中断周期触发“实践

1. 硬件 HPET 模块的设计,硬件中断设计 软件设计,

        设计一个 HPET 模块,要求可以设置定时时间、周期触发模式,并设计定时器中断。 我们可以将 HPET 模块作为一个 APB 外设,挂在 APB 总线上。那么就需要设计一个 APB 接口来对寄存器进行读写操作。我们需要对每个 APB 接口分配一个地址,这样 才能通过译码电路区分开来不同的 APB 。在 config.h 文件中定了 9 路 APB 地址, 默认 GPIO 模块使用了 APB0 ,PWM 模块使用了 APB1 ,现在我们为 HPET 模块分 配 APB2 ,对应地址为 0xbfed0000 ,如下所示,

        定义四个寄存器:配置寄存器、计数值寄存器、比较值寄存器,步进值寄存器,分别 对应地址 0xbfed0000 0xbfed0004 0xbfed00008 0xbfed000c 。 配置寄存器 配置寄存器需要包括:中断状态/清中断位(int_r)、周期触发位(periodic)、中断 使能位(int_en)、计数使能位(int_en)。 这四位都是可读可写,所以需要设计 APB 接口对这四位进行读写操作,如下所示:

        向中断状态/清中断位位写1,也就是 pwdata[8] = 1 , int_r 被置 0 。 当 count = compare , int_r 被置 1 ,表示中断被触发了。

        计数值寄存器

        计数值寄存器位宽 32 位,可读可写。要求只有在未计数时(start = 0)才能修改。计数使能后一直计数,触发中断时不会停止计数,计数失能后计数值为0。

        比较值寄存器

        比较值寄存器位宽 32 位,可读可写。要求只有在未计数时(start = 0)才能修 改。在周期触发模式下,当计数值寄存器 count 和比较值寄存器 compare 相等 时(int_trig = 1), compare 自增一个步进值 step 。

        步进值寄存器

        步进值寄存器位宽 32 位,可读可写。要求只有在未计数时(start = 0)才能修 改。

        中断

        此外,只有当定时器中断触发并且定时器中断使能这两个条件同时满足,才表示 真正意义上的中断触发,如下所示,

int_o 是 HPET 模块输出的,表示定时器中断是否触发。

接下来需要把 int_o 给到软核,这里先不详细阐述过程,实现过程体现在代码 中,在后面中断学习的章节会重点介绍。

在顶层文件 godson_mcu_top.v 中例化我们设计的 HPET 模块,如下所示,

HPET 模块没有需要连接到顶层的信号,也就不用添加新的约束。

2. 软件设计,基于 HPET 模块实现定时器中断周期触发

既然已经设计好了硬件电路,我们就可以进行软件程序的编写了。在硬件 HPET 模块 设计过程中我们为 APB 分配的地址是 0xbfed0000 ,并且 HPET 相关寄存器的偏移 地址是 0x00 0x04 0x08 0x0c ,所以软件上需要对应好。一个不错的方法是用结构体 指针来访问寄存器,比如下面的 g_timer ,

编写了2个函数,分别是 HPET 配置函数, HPET 中断服务函数,如下所示,

基于上述2个函数,我们可以很方便地使用定时器中断。 我们可以在 main.c 中做如下操作来启用定时器中断,

在 timer_interrupt() 函数中修改 g_timer->step 的值就可以改变触发中断的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值