蜂鸟e203MCU的CPU定时器管理

  1. 前言

笔者最近需要封装一些时间戳相关的API,对于RISC-V架构的CPU定时器相关配置方式基本忘光光了,所以简单复习了一下相关内容。需要深入了解的话可以阅读RISC-V架构手册的卷二第三章。

因为蜂鸟e203MCU仅支持RISC-V架构的机器模式(Machine Mode),本文仅讨论机器模式下的CPU定时器管理。

2.RISC-V架构的CPU 定时器

首先看CPU定时器中断的开启与关闭。

对于机器模式下全局中断的开关,可以通过mstatus寄存器的MIE字段进行控制。

MIE字段对应机器模式下的全局中断开关控制,SIE字段对应的是监督模式下的全局中断开关控制。

RSIC-V架构将中断分为外部中断,定时器中断,软件中断和调试中断四种类型。机器模式下,每种类型的中断发生的时候mcause寄存器会填入对应类型中断的编号,其编号值为:

相应的,每种类型的中断其开关控制可以在CSR寄存器MIE中进行配置。

MIE寄存器的字段格式为:

相关字段可以解释为:

字段

功能

MEIE

机器模式下外部中断的中断使能控制

MTIE

机器模式下定时器中断的中断使能控制

MSIE

机器模式下软件中断的中断使能控制

如果我们要开启定时器中断,需要保证MTIE字段的置位。

然后看CPU定时器的配置。

机器模式下,CPU定时器的具体配置主要依靠两个内存地址映射的寄存器mtime和mtimecmp来进行。作为非CSR寄存器,其内容的读写通过地址访问进行,不同硬件系统的设计可能将这两个寄存器映射到完全不同的物理地址,但是其功能应保持一致。

mtime寄存器以恒定的频率进行计数增长,一旦大于等于mtimecmp寄存器中的值,即产生一个定时器中断。

3.蜂鸟E203MCU的相关软件实现

第二节提到的各种硬件设计,在E203的SDK中作为NMSIS的一部分被实现,其内容可以总结为:

编号

功能

文件

1

定时器使能控制

hbird-sdk/NMSIS/Core/Include/core_feature_base.h

2

定时器触发频率控制

hbird-sdk/NMSIS/Core/Include/core_feature_timer.h

首先看定时器的使能控制,对于全局使能控制,相关API可以归纳为:

编号

API

功能

1

__enable_irq

使能全局中断

2

__disable_irq

关闭全局中断

其实现方式第二节已经讨论过了,就是配置mstatus寄存器的MIE字段,比如:

配置定时器中断的使能状态,相关API可以归纳为:

编号

API

功能

1

__enable_timer_irq

使能定时器中断

2

__disable_timer_irq

关闭定时器中断

实现方式就是配置MIE寄存器的MTIE字段,比如:

然后我们看触发频率的配置。

core_feature_timer.h头文件中定义了mtime和mtimecmp寄存器的物理地址,并用一个结构体指针直接指向物理地址用于API实现中的字段配置:

相关API可以归纳为:

编号

API

功能

1

SysTimer_GetLoadValue

获取mtime寄存器值

2

SysTimer_SetLoadValue

配置mtime寄存器值

3

SysTimer_GetCompareValue

获取mtimecmp寄存器值

4

SysTimer_SetCompareValue

配置mtimecmp寄存器值

配置方式是直接使用前面定义的结构体指针SysTimer,比如:

4.蜂鸟e203的mtime增长频率是多少?

SDK中的delay_1ms函数的实现可以回答这个问题。该函数定义在hbird-sdk/SoC/hbirdv2/Common/Source/hbirdv2_common.c中。

其实现为:

可以看到SOC_TIMER_FREQ就是我们要找的数值,其定义为:

所以,答案是32768。

5.定时器Demo

下面以SDK中的demo_timer程序说明定时器的软件使用方式。

首先,注册中断handler并使能中断。

然后初始化mtime和mtimecmp的数值:

按照截图中的配置,半秒后会触发第一次定时器中断。

接下来定义好定时器中断handler函数:

可以看到,这里仅仅打印一下触发信息,然后继续配置下一次的触发时间,在半秒之后。

6.总结

蜂鸟e203MCU作为一款面向教学的开源MCU,其软硬件设计都非常容易理解,因此造就了很高得可玩性。同时,因为软硬件同时开源的特性,对于帮助开发者加深软硬件协同的理解或者说计算机底层机制的实现原理很有帮助。其定时器的设计与实现正是这一点的具体体现。

### 蜂鸟E203处理器定时器使用方法 蜂鸟E203是一款开源的RISC-V架构处理器,其SoC设计包含了多个外设模块,其中包括定时器。这些外设相关的Verilog代码位于`/rtl/e203/perips`目录下[^1]。 #### 定时器功能概述 蜂鸟E203 SoC配备了一个或多个硬件定时器,用于提供精确的时间间隔控制和计数功能。这类定时器通常可以配置为周期性触发中断,从而允许操作系统或其他应用程序执行时间敏感的任务。 #### 配置与初始化 为了使用定时器,开发者需要通过特定寄存器来设置初始值以及使能标志位。具体的配置过程可能涉及以下几个方面: - **加载计数值**:向指定地址写入期望的倒计时初值。 - **启动/停止操作**:通过设定相应的控制位开启或暂停定时器工作。 - **中断处理**:当达到预设条件(如计数归零)时产生中断信号,并编写对应的ISR(Interrupt Service Routine)函数来进行响应。 以下是简化版的定时器初始化伪代码示例: ```c // 假定存在如下宏定义代表各个寄存器偏移量 #define TIMER_LOAD_REG 0x00 #define TIMER_CONTROL_REG 0x04 #define TIMER_STATUS_REG 0x08 void init_timer(uint32_t load_value){ volatile uint32_t *timer_base = (uint32_t *)TIMER_BASE_ADDR; // 设置重装载值 timer_base[TIMER_LOAD_REG / sizeof(uint32_t)] = load_value; // 启动定时器并启用中断 timer_base[TIMER_CONTROL_REG / sizeof(uint32_t)] |= BIT_ENABLE | BIT_INTERRUPT_EN; } ``` 上述代码片段展示了如何在一个假设性的环境中初始化定时器资源;实际应用中应当参照官方提供的API手册获取确切细节[^2]。 #### 参考资料 除了查阅源码本身之外,《手把手教你设计CPURISC-V篇》一书中也有关于此类组件的具体讲解,能够帮助理解内部机制及其运作原理。此外,友晶科技开设的相关课程同样提供了丰富的学习材料和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值