zynq7000 中断原理分析及IO中断解析

article/2025/9/24 18:53:47

Zynq 7000 中断分析

文章目录

  • Zynq 7000 中断分析
    • GIC及中断机理
      • Crotex-A9常用汇编指令
      • Zynq中断控制
    • GPIO
      • 中断控制
        • 单IP双通道
        • 单IP多位
        • 双IP中断源

GIC及中断机理

Crotex-A9常用汇编指令

类型指令描述备注
内部数据传输指令MOV R0 R1R1 2 R0#0xFF:立即数:MOV R0, #0xFF
内部数据传输指令MRS R0,SRSR 2 R0读特殊寄存器: MRS R0, CRSR
内部数据传输指令MSR SR R0RO 2 SR写特殊寄存器: MSR CRSR,R0
存储器访问指令LDR Rd,[Rn ,#offset]从存储器Rn+offset处读取数据写至Rd存储加载数据到寄存器中,数据为立即数时: LDR R0,=0xFFFF,从0Xffff地址取数; LDR R1,[R0]
存储器访问指令STR Rd,[Rn,#offset]将Rd中的数据写入到Rn+offset的位置中LDR R0,=0xFFFFR0保存地址; LDR R1,=0x1234 R1保存数据; STR R1,[R0]将R1中的值写入R0中的地址
堆栈指令PUSH <reg list>将寄存器列表存入栈中保护现场,即为将R0~R15寄存器值进行压栈; PUSH{R0~R3,R13} @将 R0~R3 和 R12 压栈
堆栈指令TMFD SP!, {reg list}将寄存器列表存入栈中 同PushSTMFD SP!,{R0~R3, R12} @R0~R3,R12 入栈
堆栈指令POP <reg list>从栈中恢复寄存器列表恢复现场,即为弹栈,从栈中回复寄存器列表 POP{LR}注意堆栈模型
堆栈指令LDMFD SP!,{reg lsit}从栈中恢复寄存器列表同上
跳转指令B <label>跳转到lable如果跳转范围超过2KB可以制定B.W<lable>指令以获取更大范围; B main跳转至C函数main
跳转指令BX <Rm>间接跳转跳转到Rm存放的地址处,并切换指令集
跳转指令BL <label>跳转到lable并将返回地址保存在LR中在跳转之前会在寄存器LR(R14)中保存PC寄存器值,意味着可以将PC值重新加载跳转至之前程序,中断的切换
跳转指令BLX <Rm>跳转到Rm指定的地址,并将返回地址保存至LR示例如下
 push {r0, r1} @保存 r0,r1cps #0x13 @进入 SVC 模式,允许其他中断再次进去bl system_irqhandler @加载 C 语言中断处理函数到 r2 寄存器中cps #0x12 @进入 IRQ 模式pop {r0, r1}str r0, [r1, #0X10] @中断执行完成,写 EOIR

Zynq中断控制

在这里插入图片描述

INT_MASK,INT_DIS,INT_EN为一组,表示对对应位是否使能。

INT_TYPE ,INT_POLARITY,INT_ANY为一组,表示触发的方式,是电平还是边缘以及是否双边缘。

INT_STAT 读之可以知道对应位是否发生了中断,对应位写1表示清除中断(实际应用中要以注意中断撤掉或者被屏蔽)

三级跳转,以IRQ中断为例

  1. 接收到中断信号,进入中断向量表,判断中断类型为IRQ, 执行 15-IRQHandler:保存完现场后执行33- bl IRQInterrupt跳转至IRQ中断处理函数
 .globl _vector_table.section .vectors_vector_table:B   _bootB   UndefinedB   SVCHandlerB   PrefetchAbortHandlerB   DataAbortHandlerNOP /* Placeholder for address exception vector*/B   IRQHandlerB   FIQHandlerIRQHandler:                 /* IRQ vector handler */stmdb   sp!,{r0-r3,r12,lr}      /* state save from compiled code*/#if FPU_HARD_FLOAT_ABI_ENABLEDvpush {d0-d7}vpush {d16-d31}vmrs r1, FPSCRpush {r1}vmrs r1, FPEXCpush {r1}#endif#ifdef PROFILINGldr r2, =prof_pcsubs    r3, lr, #0str r3, [r2]#endifbl  IRQInterrupt            /* IRQ vector */#if FPU_HARD_FLOAT_ABI_ENABLEDpop     {r1}vmsr    FPEXC, r1pop     {r1}vmsr    FPSCR, r1vpop    {d16-d31}vpop    {d0-d7}#endifldmia   sp!,{r0-r3,r12,lr}      /* state restore from compiled code */subs    pc, lr, #4          /* adjust return */
  1. 进入IRQ中断处理函数,此函数不是自定义的中断处理函数,而是GIC(中断控制器)提前注册的响应中断类型的函数,作用在于判断哪个中断号发生了IRQ中断,用以找到相应的用户处理函数
  2. 跳转至用户处理函数执行之
 void XScuGic_InterruptHandler(XScuGic *InstancePtr){u32 InterruptID;u32 IntIDFull;XScuGic_VectorTableEntry *TablePtr;IntIDFull = XScuGic_CPUReadReg(InstancePtr, XSCUGIC_INT_ACK_OFFSET);InterruptID = IntIDFull & XSCUGIC_ACK_INTID_MASK;if (XSCUGIC_MAX_NUM_INTR_INPUTS <= InterruptID) {goto IntrExit;}TablePtr = &(InstancePtr->Config->HandlerTable[InterruptID]);if (TablePtr != NULL) {TablePtr->Handler(TablePtr->CallBackRef);}IntrExit:XScuGic_CPUWriteReg(InstancePtr, XSCUGIC_EOI_OFFSET, IntIDFull);}

GPIO

中断控制

单IP双通道

采用单个AXI GPIO IP核双通道, PL逻辑提供两路同步逻辑翻转输入

在这里插入图片描述

在这里插入图片描述

通道结论
双通道双通道 IP仅产生一次中断,中断状态寄存器两通道状态位都置1,在中断处理中读取之来判断通道

单IP多位

在这里插入图片描述

在这里插入图片描述

通道结论
单通道产生一次中断,中断状态寄存器置位响应通道,在中断处理中读取IO值判断

双IP中断源

采用两组AXI GPIO IP核, PL逻辑提供两路同步中断源

在这里插入图片描述

在这里插入图片描述

优先级结论延迟描述
GPIO1 > GPIO2ARM均可进行响应时间不定(10us左右视具体情况而定)ARM对同时来到的中断源均可响应但存在延迟,优先响应高优先级
GPIO1 = GPIO2ARM均可进行响应时间不定(10us左右视具体情况而定)ARM对同时来到的中断源均可响应但存在延迟,存在固定顺序,影响因素未知

GPIO1 > GPIO2 | ARM均可进行响应 |时间不定(10us左右视具体情况而定)|ARM对同时来到的中断源均可响应但存在延迟,优先响应高优先级|
|GPIO1 = GPIO2|ARM均可进行响应|时间不定(10us左右视具体情况而定)|ARM对同时来到的中断源均可响应但存在延迟,存在固定顺序,影响因素未知|


http://chatgpt.dhexx.cn/article/8MJ5vSES.shtml

相关文章

ZYNQ之FPGA 片内RAM读写测试实验

文章目录 前言一、添加RAM IP核二、编写测试程序三、添加ILA四、分配管脚五、Simulator仿真六、硬件调试总结 前言 本实验的主要内容是介绍如何使用 FPGA内部的RAM以及程序对该RAM数据的读写操作。Vivado软件中提供了RAM的IP核 , 我们只需通过IP核例化一个RAM&#xff0c;根据…

ZYNQ-XADC使用

学习内容 本文首先介绍了ZYNQ的XADC的相关内容&#xff0c;并学习使用ZYNQ芯片中的XADC测量芯片内部的温度电压等参数&#xff0c;然后进行串口打印输出。 开发环境 vivado 18.3&SDK&#xff0c;PYNQ-Z2开发板。 XADC介绍 简介 Xilinx模拟信号转换模块&#xff0c;称…

ZYNQ SDK开发调试踩坑指南

关注星标公众号&#xff0c;及时获取更多技术分享~ 作者 | 冰茶奥利奥 微信公众号 | 嵌入式电子创客街 目录 坑1&#xff1a;裸机Ps串口收数问题 坑2&#xff1a;多个中断不能同时使用问题 坑3&#xff1a;block design中DDR3的选择 坑4&#xff1a;新板子能够检测到芯片&…

万变不离其宗之ZYNQ启动介绍

1、概述 ZYNQ 的详细介绍参考 XILINX 官方文档 UG585&#xff0c;在了解了 ZYNQ 的基本架构组成和丰富的资源后&#xff0c;下一步便是分析他的启动流程&#xff0c;以便更好的认识 ZYNQ 并开始开发工作&#xff1b; 关于 ZYNQ 启动方面的描述&#xff0c;这里我觉得涉及到几个…

ZYNQ入门

目录 一、ZYNQ简介 二、vivado工程 ①创建工程 ②添加设计文件 ③生产顶层HDL模块 ④生成 Bitstream 文件并导 三、vitis工程 ①启动vitis ②创建工程 ③编译与下载 一、ZYNQ简介 ZYNQ 是赛灵思公司&#xff08;Xilinx&#xff09;推出的新一代全可编程片上系统&#x…

ZYNQ架构

ZYNQ 首先&#xff0c;我们来了解传统的SOC架构&#xff0c;一般使用 ARM 作为主控&#xff0c;通过 ARM 的外设并行 RAM 类总线外挂 FPGA &#xff0c;使用 FPGA 来做高速的数据采集或者运算&#xff0c;因为FPGA 有灵活性好&#xff0c;资源丰富&#xff0c;可反复编程&#…

zynqmp soc 移植vxWorks 7

1.使用worksbench4创建vsb工程&#xff1b; 2.使用worksbench4创建vip工程&#xff1b; 3.修改设备树文件&#xff0c;根据硬件电路选择对应的UART&#xff1b; 4.tftp引导启动&#xff1b;

ZYNQ开发系列——ZYNQ系统的搭建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列——ZYNQ系统的搭建 DDR设置FLASH设置UART设置网口设置当我们有一个要用ZYNQ做的项目时,首先当然是把其最小系统搭建起来。这个最小系统可以交付给开发PS的同事开发裸机程序/RTOS实时操作系统/…

ZYNQ之高速AD/DA验证实验

文章目录 前言一、ADDA模块介绍二、添加ROM IP核三、添加ILA IP核四、编写测试程序五、管脚分配六、连接开发板测试总结 前言 本实验是高速AD/DA验证实验&#xff0c;将使用高速DA芯片实现数模转换&#xff0c;产生正弦波模拟电压信号&#xff0c;并通过高速AD芯片将模拟信号转…

ZYNQ - 嵌入式Linux开发 -10- ZYNQ启动流程分析

FSBL启动准备工作 在静态情况下&#xff0c;Boot.BIN启动文件存放在SD卡或QSPI等存储介质中&#xff0c;然后Boot.BIN文件中已经包含了FSBL代码&#xff0c;也就是说FSBL代码已经集成在了Boot.BIN文件中&#xff0c;所以FSBL代码也是存放在Boot .BIN文件中。 如果要启动FSBL代…

初识ZYNQ结构

本文介绍了zynq的结构&#xff0c;简述了PS中的APU。 处理器系统 所有的 Zynq 芯片都有相同的基本架构。作为处理器系统的基础&#xff0c;所有的芯片都包含了一颗双核 ARM Cortex-A9 处理器。这是一颗 “ 硬 ” 处理器 —— 它是芯片上专用而且优化过的硅片元件。 作为比较…

zynq中断

在zynq中选择中断信号后&#xff1a; 只能看到一个[0:0]的向量&#xff0c;完全无法对应中断号&#xff1a; 且属性栏目没有配置选项&#xff0c;一般可以看到有些连接图如下&#xff1a; 如果看成最低位的话就是61,那么其它中断号怎么使用呢&#xff1a;查到的资料如下&#x…

ZYNQ基础知识

1.ZYNQ介绍 全称为Zynq-7000 All Programmable Soc 1.Zynq是赛灵思&#xff08;Xilinx&#xff09;推出的新一代全可编程片上系统&#xff0c;将处理器的软件可编程性和FPGA的硬件可编程性完美结合。具有较强的系统性能、灵活性与可扩展性。 2.旨在为视频监控、汽车驾驶员辅助…

一、ZYNQ简介

1 ZYNQ简介 &#xff08;1&#xff09;ZYNQ简介 ​ ZYNQ全称Zynq-7000 All Programmable SoC&#xff0c;是赛灵思公司&#xff08;Xilinx&#xff09;推出的新一代全可编程片上系统&#xff08;&#xff08;APSoC&#xff09;&#xff08;全可编程指的是硬件和软件都可以编程…

ZYNQ简介

目录 1.ZYNQ简介 2.片上系统&#xff0c;板上系统&#xff0c;可编程片上系统&#xff0c;全可编程上系统 &#xff08;1&#xff09;板上系统 &#xff08;2&#xff09;片上系统&#xff08;SOC&#xff09; &#xff08;3&#xff09;可编程片上系统&#xff08;SOPC&a…

【ZYNQ】从入门到秃头01 初识ZYNQ(PS和PL之间连接)

文章目录 从嵌入式Linux到ZYNQZYNQ简介PL简介常用的可编程逻辑器件&#xff1a;PL结构 PS简介AXIAXI4 StreamAXI4 ZYNQ芯片开发流程的简介学习ZYNQ要具备哪些技能 从嵌入式Linux到ZYNQ 之前的学习领域一直是ARM&#xff0c;从STM32到NXP iMX6&#xff0c; 从裸机开发到Linux操…

css-输入框和文本域样式调整

输入框去掉选中后的边框变化效果 选中后边框变化&#xff1a; 去掉变化效果方法&#xff1a;添加css属性- - - outline: none; 文本域去掉右下角拖拽图样 默认文本域右下角有个拖拽的图样&#xff0c;将鼠标移动到右下角可以进行拖拽实现放大缩小&#xff1a; 代码示例&#x…

HTML5-列表框、文本域和文件域

<!--下拉框&#xff0c;列表框selected 默认选择--><p>国家&#xff1a;<select name"列表名称" ><option value"china">中国</option><option value"us">美国</option><option value"eth&qu…

【多行文本输入框--文本域】(html,css)

<style>textarea{width: 300px;height: 300px;resize: none;/* resize:重新设置大小&#xff0c;vertical,horizontal,both,none */} </style> <body><div>多行文本输入框--文本域</div><div><!-- placeholder--提示文字 --><!--…

JTextArea:文本域组件

文本域与文本框的最大区别就是文本域允许用户输入多行文本信息。在 Swing 中使用 JTextArea 类实现一个文本域&#xff0c;其常用构造方法如下。 JTextArea()&#xff1a;创建一个默认的文本域。JTextArea(int rows,int columns)&#xff1a;创建一个具有指定行数和列数的文本…