ECLIC单元

编写mcause时使用了一个代码,指示导致陷阱的原因。CSR mcause的格式和功能与RISC-V标准基本相同,更多详细信息请参阅RISC-V规范特权体系结构规范。但在核处理器核心的CLIC模式中,添加了一些额外的字段来支持CLIC模式中断处理。

mcause寄存器的格式如下表所示:
•ECLIC中断目标

•ECLIC中断源

•ECLIC中断源ID

•ECLIC寄存器

•ECLIC中断使能位

•ECLIC中断挂起位

•ECLIC中断级别或边缘触发属性

•ECLIC中断级别和优先级

•ECLIC中断矢量化或非矢量化处理模式

•ECLIC中断阈值电平

•ECLIC中断仲裁机制

•ECLIC中断响应、抢占、尾链机制
ECLIC中断目标

ECLIC单元通过如图中所示的线路将中断源仲裁到处理器核心(作为中断目标)。
在这里插入图片描述ECLIC中断源

如ECLIC连接(启用ECLIC时)(第53页)所示,ECLIC单元最多可支持4096次中断

来源。ECLIC单元为每个中断源定义了以下概念:

•ID

•IE

•IP

•电平或边缘触发

•级别和优先级

•向量或非向量模式

ECLIC Interrupt Source ID
ECLIC单元为每个中断源分配了一个唯一的ID。例如,如果ECLIC单元的硬件实现真的被配置为支持4096个中断,那么ID应该是0到4095。注:

•在Nuclei处理器内核中,为内核指定的内部中断保留范围从0到18的中断ID。3和7在所有Nuclei处理器内核中都针对软件中断和定时器中断进行了修复。

•用户可以使用大于18的中断源ID来连接外部中断源。

在这里插入图片描述ECLIC Registers
ECLIC是一个内存映射单元。

•ECLIC单元的基本地址,请参阅Nuclei处理器核心的具体数据表。

•寄存器和ECLIC单元中的相应偏移量如ECLIC单元寄存器的地址偏移量所示

在这里插入图片描述注:

•上面的“i”表示中断ID,一个中断i有自己相应的clicintip[i]、clicintie[i]、Clicinttattr[i]和clicinctl[i]寄存器。

•ECLIC寄存器仅支持字节、半字或字大小的对齐访问。

•上面的“R”表示只读,对该只读寄存器的任何写入都将被忽略,而不会产生总线错误。

•ECLIC单元可能未配置为支持4096个中断源。如果索引i不存在于硬件中,则相应的clicintip[i]、clicintie[i]和clicintctl[i]内存位置显示为硬连线为零。

•ECLIC寄存器的地址空间范围为0x0000到0xFFFF。上表中列出的地址以外的地址中的值为常量0。

cliccfg

这个cliccfg寄存器是一个全局配置寄存器。软件可以通过写入此寄存器来设置全局配置。

cliccfg位字段描述了该寄存器的位字段
在这里插入图片描述clicinfo

clicinfo寄存器是一个全局信息寄存器。软件可以通过读取该寄存器来查询全局参数。

clicinfo位字段描述了该寄存器的位字段。
在这里插入图片描述mth

第m个寄存器用于设置目标中断阈值电平。软件可以通过写入该寄存器来设置目标中断阈值级别。第m个位字段描述了该寄存器的位字段。

在这里插入图片描述clicintip[i]
clicintip[i]寄存器是中断源的挂起标志寄存器。clicintip[i]位字段描述了该寄存器的位字段。
在这里插入图片描述
clicintie[i]
clicintie[i]寄存器是中断源的启用位寄存器。clicintie[i]位字段描述了这个寄存器的位字段。

在这里插入图片描述clicintrattr[i]
clicintrattr[i]寄存器用于指示中断源的属性。软件可以通过写入此寄存器来设置中断源的属性ref:table clicintrattr[i]_bit_fields描述了这个寄存器的位字段。
在这里插入图片描述

clicintctl[i]

clicinctl[i]寄存器是中断源的控制寄存器。软件可以通过以下方式设置级别和优先级

写入此寄存器。级别和优先级字段是根据cliccfg.nlbits的值动态分配的。

ECLIC中断使能位(IE)

如ECLIC单元的逻辑结构(第52页)所示,ECLIC单元为每个中断源分配了一个中断使能位(IE),即字段clicintie[i]。IE的功能如下:

•每个中断源的clicintie[i]寄存器是可读取和可写入的内存映射寄存器。因此,软件可以对其进行编程。

•如果clicintie[i]寄存器编程为0,则表示该中断源被屏蔽。

•如果clicintie[i]寄存器编程为1,则表示该中断已启用。

ECLIC中断挂起位(IP)

如ECLIC单元的逻辑结构(第52页)所示,ECLIC单元为每个中断源分配了一个中断挂起位(IP),即字段clicintip[i].IP,其功能如下:

•如果一个中断源的IP位为1,则表示该中断被触发。中断源的触发条件取决于该中断是电平触发还是边缘触发,如ECLIC中断源电平或边缘触发属性所述。

•中断源的IP位是可读写的。软件写入IP位的行为取决于中断源是电平触发还是边缘触发。

•对于边缘触发的中断源,IP位可以由硬件本身清除。
ECLIC中断源电平或边缘触发属性

如ECLIC单元的逻辑结构(第52页)所示,通过设置clicintrattr[i].trig的值,可以将每个ECLIC中断源设置为电平触发或边缘触发。关键点如下:

•当clicintrattr[i].trig[0]==0时,该中断源被设置为级别触发中断。

–如果中断源设置为电平触发,则中断源的IP位将实时反映中断源的电平。

–如果中断源设置为级别触发,则IP位实时反映中断的级别,因此软件对该IP位的写入被忽略,即软件无法通过写入操作设置或清除IP位。如果软件需要清除中断挂起位,则只能通过清除中断的原始源来完成。

•当clicinttr[i].trig[0]==1且clicinttr[i].trig[1]==0时,此中断源设置为上升沿触发中断:

–如果中断源设置为上升沿触发,当ECLIC检测到中断源的上升沿时,中断源在ECLIC中被触发,并且中断源的IP位被断言。

–如果中断源设置为上升沿触发,则软件的IP位是可写的,这意味着软件可以通过写入操作设置或清除IP位。

–注意:对于上升沿触发的中断,为了提高中断处理的效率,当中断被占用并且核心跳到ISR(中断服务例程)时,ECLIC的硬件会自动清除IP位,而软件不需要清除ISR中的IP位。

•当包含attr[i].trig[0]==1和clicinttattr[i].trig[1]==1时,此中断源将成为触发中断的原因:

–如果中断源被设置为下降沿触发,当ECLIC检测到中断源的下降沿时,中断源在ECLIC中被触发,并且中断源的IP位被断言。

–如果中断源配置为下降沿触发,则IP位可写入软件,这意味着软件可以通过写入操作设置或清除IP位

–注意:对于上升沿触发的中断,为了提高中断处理的效率,当中断被占用并且核心跳到ISR(中断服务例程)时,ECLIC的硬件会自动清除IP位,而软件不需要清除ISR中的IP位。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您说的很对,如果使用了上拉电阻,未连接 USB 设备时,PA9 引脚的电平状态也是高电平。此时,如果只是通过检测 PA9 引脚的电平状态,无法准确判断 USB 设备是否连接。 为了解决这个问题,可以通过使用 USB 中断来检测 USB 设备的插拔动作。在 GD32F305 中,可以使用 USB 中断来检测 USB 的连接状态。当 USB 设备插入或拔出时,会产生 USB 中断,通过中断处理函数来处理 USB 设备的连接状态。 以下是一个简单的示例代码,用于检测 USB 设备的插拔状态: ```c #include "gd32f30x.h" // USB 中断处理函数 void USB_IRQHandler(void) { if(usb_interrupt_flag_get(USB_INT_FLAG_USBFS, USB_INT_FLAG_RST)) { usb_interrupt_flag_clear(USB_INT_FLAG_USBFS, USB_INT_FLAG_RST); // USB 设备插入 // 处理 USB 设备插入事件 } if(usb_interrupt_flag_get(USB_INT_FLAG_USBFS, USB_INT_FLAG_SUSP)) { usb_interrupt_flag_clear(USB_INT_FLAG_USBFS, USB_INT_FLAG_SUSP); // USB 设备拔出 // 处理 USB 设备拔出事件 } } int main(void) { // 初始化 USB 设备 usb_rcu_config(); usb_gpio_config(); usb_interrupt_config(); // 启用 USB 中断 eclic_global_interrupt_enable(); eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); eclic_irq_enable(USBFS_IRQn, 1, 0); while(1) { // 主循环 } } ``` 在这个例子中,使用了 GD32F305 提供的 USB 库,通过 USB 中断来检测 USB 设备的插拔状态。当 USB 设备插入时,会触发 USB 中断,并在中断处理函数中处理 USB 设备插入事件。当 USB 设备拔出时,也会触发 USB 中断,并在中断处理函数中处理 USB 设备拔出事件。通过这种方式,可以准确地检测 USB 设备的插拔状态,而不需要依赖 PA9 引脚的电平状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值