当前位置:   article > 正文

ZYNQ的中断系统_zynq 外部中断

zynq 外部中断

        ZYNQ和STM32等嵌入式的操作系统非常相似,但由于PL端的硬件可以自己编程,所以在中断信号的触发方面会有些区别。这篇文件将介绍一个最简单但完整的中断相应过程。

     ZYNQ的中断系统

PL-PS Interrupt Ports (来自PL到PS的中断)

PL-PS Interrupt Ports是指从Zynq的可编程逻辑(PL)发出并被处理系统(PS)接收的中断信号。这些中断使得PL可以通知PS某些事件已经发生或者需要注意的情况。

  • IRQ_F2P (Interrupt Request from Fabric to Processor)
    • 这个端口是可编程逻辑(PL)向处理器发送中断请求的信号。
    • 这些信号被映射到GIC的SPI(Shared Peripheral Interrupts)中断输入中。
    • 开发者需要在PS端对应的GIC配置中中断号并编写中断服务程序。

在Vivado设计工具中,开发者可以连接不同的硬件模块产生的中断到这些port上,并且配置信号到PS端的映射。

PS-PL Interrupt Ports (来自PS到PL的中断)

PS-PL Interrupt Ports是由处理系统(PS)发出并由可编程逻辑(PL)部分接收的中断信号。这些中断可以用于PS通知PL执行特定操作或触发某些事件。

  • IRQ_P2F (Interrupt Request from Processor to Fabric)
    • 这个端口允许PS向PL发出中断请求。
    • 在PL内,需要相应的逻辑来检测这一信号并作出响应,比如状态机的转换或触发数据处理流程。
  • Core_nFIQ:
    •  ​​FIQ​ 是 "Fast Interrupt Request" 的缩写,是一种用于高优先级中断的信号。
    • 每个处理器核心(Core_n,其中n代表核心编号)都有一个独立的 FIQ 输入,用来接收快速中断。
    • 这些 FIQ 通常由实时性要求很高的中断源驱动,因为它们会被处理器以极高的优先级处理。

在Vivado中配置PS到PL的中断意味着你在PS端生成中断信号,并设置合适的逻辑路径以便迅速地导向PL端需要处理中断的逻辑单元。

配置这些Ports时,开发者需要确保PL和PS的中断系统逻辑正确连接,并在系统中耦合相关的软件和硬件部分。例如,在PS端写对应的驱动程序和中断服务例程来响应PL发出的中断,以及在PL端对PS发出的中断信号编写适当的硬件逻辑。

如何使用中断

 PL端的配置

        首先需要在ZYNQ的IP核配置中断,比如这里选择了PL-PS的IRQ_P2F。

        这里一个重要的信息是ID号,之后在PS端编程的时候要用。        我这里用两个信号线连接上了其中的两个端口[1:0],对应的ID号也就是62和61。

PS端的配置

  然后我们看看PS端是怎么操作和这个联系起来的。

  • PS端首先要对中断进行初始化,这个很好理解,不管使用什么资源,第一步一般都是初始化。
  • 注册特定异常的处理程序,这是为了能够在发生中断或异常时,正确、有效地响应这些事件。
  • 连接中断和中断处理函数,这里要把中断ID,和具体的中断处理函数连接起来,比如我这里的SW1线连接到了IRQ_F2P[0],当它触发中断响应信号的时候,哪个函数响应。
  • 中断的配置,比如优先级,两个中断信号同时到达的是先响哪个,响应信号类型,是响应高电平或者上升沿等。
  • 中断使能,使能以后才能使用,也可以用此来关闭中断。

        下面是一个具体配置中断的代码,调用的都是自动生成的函数,这里不懂的可以去看看ZYNQ从入门到不放弃

  1. int IntcInitFunction(u16 DeviceId)
  2. {
  3. XScuGic_Config *IntcConfig;
  4. int status;
  5. // 这一步是对中断的初始化,首先通过设备ID去看看我们生成的硬件里面有没有中断
  6. IntcConfig = XScuGic_LookupConfig(DeviceId);
  7. status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);
  8. if(status != XST_SUCCESS) return XST_FAILURE;
  9. // 这一步是注册特定异常的处理程序,前两个输入的参数是自动生成的,最后一个是我们使用的中断实例的地址
  10. Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  11. (Xil_ExceptionHandler)XScuGic_InterruptHandler,
  12. &INTCInst);
  13. Xil_ExceptionEnable();
  14. //这一步把中断号和中断函数连接起来,这里的中断号SW1_INT_ID设置为61,SW2_INT_ID为62,连接的函数为SW_intr_Handler。
  15. status = XScuGic_Connect(&INTCInst,
  16. SW1_INT_ID,
  17. (Xil_ExceptionHandler)SW_intr_Handler,
  18. (void *)1);
  19. if(status != XST_SUCCESS) return XST_FAILURE;
  20. status = XScuGic_Connect(&INTCInst,
  21. SW2_INT_ID,
  22. (Xil_ExceptionHandler)SW_intr_Handler,
  23. (void *)2);
  24. if(status != XST_SUCCESS) return XST_FAILURE;
  25. // 这里对中断的响应类型进行设置,上升沿触发信号
  26. IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);
  27. IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);
  28. // 对中断进行使能
  29. XScuGic_Enable(&INTCInst, SW1_INT_ID);
  30. XScuGic_Enable(&INTCInst, SW2_INT_ID);
  31. return XST_SUCCESS;
  32. }

写在最后

        当时学的时候,只知道一会配置这个函数一会配置那个函数,非常的迷惑,特别是PL端的信号线怎么和最后的响应函数联系起来的。所以写这篇文章梳理一下,希望帮助到和我有一样问题的小伙伴。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/892914
推荐阅读
相关标签
  

闽ICP备14008679号