REVIEW
zynq PS端 GPIO_zynq modem signal-CSDN博客 C基础与SDK调试方法_csdk-CSDN博客 AXI_GPIO_axigpio-CSDN博客 |
对于GPIO,前面只用了简单读写,今天搞一下中断 |
1. 今日摸鱼任务
了解中断原理,实现PS_GPIO中断。 MIIO: #define PS_KEY 47 #define PS_LED 7 配置PS_KEY的中断,按下按键后,LED闪烁三次 EMIO: #define PL_KEY (54+1) #define PL_LED (54+0) 配置PL_KEY的中断,按下按键后,LED闪烁三次 |
小梅哥视频: 13A_Zynq中断原理与应用-什么是中断_哔哩哔哩_bilibili 13B_Zynq中断处理控制器架构_哔哩哔哩_bilibili 小梅哥课程笔记: 【zynq课程笔记】【裸机】【第13课 】【中断概念与中断控制器】 - ACZ702开发板 - 芯路恒电子技术论坛 - Powered by Discuz! 小梅哥教材: 03_【裸机教程】基于C编程的Zynq裸机程序设计与应用教程v2.4.5.pdf 第五章 GPIO中断 //感觉有点云里雾里,就先自己尝试了简单的 |
2. ZYNQ中断
ZYNQ-7000 系列的系统级中断架构图中,只包含以下三种中断: 软件生成中断(Software Generated Interrupts,SGI) 私有外设中断(Private Peripheral Interrupts,PPI) 共享外设中断(Shared Peripheral Interrupts,SPI) 每种中断都各自包含特定的中断源: PPI 包括全局定时器 (global timer)、私有看门狗定时器 (private timer) 、私有定时器 (private timer)、 PL 中的 FIQ 。 SGI通过写入通用中断控制器( Generic Interrupt Controller , GIC)中的寄存器生成。 SPI 由 PS 和 PL 中的各种 I/O 和内存控制器生成。 |
zynq的 PS是 双核 Cortex-A9 处理器系统,包含一级缓存 L1,二级缓存L2。缓存能够提升 CPU 读写总线数据的性能。但是使用不当,也会造成 CPU 读写数据实时性的下降,甚至因为缓存一致性的问题,把一些已经由其他外设更新但是缓存中还是旧值的数据取用,从而产生错误。 由于中断的实时性和重要性, 中断控制器的相关寄存器的读写不能因为缓存的存在而被延误,所以 CPU 并不通过 L2 来访问 GIC 中的寄存器,而是通过窥探控制单元( Snoop Control Unit , SCU )采用私有总线访问 GIC 的寄存器,以此来提升中断 的处理效率。如下图: |
共享的外设中断由各种子系统生成,这些子系统包括PS中的I/O外设和PL中的逻辑。 中断控制器的结构框图如下图: |
所有中断源都有唯一的中断标识号标识以及自己可配置的优先级和目标CPU列表。 中断处理顺序: 优先级高(值小) 同优先级:中断标识号小 注意:触发类型 GPIO 中断与AXI_GPIO中断属于SPI中断。SPI中断的各种中断源所要求的中断触发方式如下表: |
GPIO中断号为#52 ,触发类型为高电平。 AXI GPIO 由 PL 逻辑构成, 属于 PL 中断,中断号为 #[91:84] 和 #[68:61] ,触发类型为高电平或上升沿。 该中断在使用时需要在 ZYNQ 核中使能对应中断端口。 |
3. GPIO中断寄存器
INT_MASK 显示哪些位当前被屏蔽,哪些位未被屏蔽/启用。 zynq PS端 GPIO_zynq ps gpio-CSDN博客 |
IDL 中断检测逻辑 用于监控 GPIO 输入信号。 INT_STAT=1 且 INT_MASK=0,则该中断信号有效。 |
4. PS_GPIO
PS_GPIO.c |
/** #include "PS_GPIO.h" XGpioPs GpioPs; //GPIO实例对象
//为 gpio中断设置处理程序
//使能Bank的GPIO Pin中断 /** /** /** |
PS_GPIO.h |
#ifndef __PS_GPIO_H__ #include "xgpiops.h"
void PS_GPIO_Init(); #endif |
5. SCU_GIC
SCU_GIC.c |
/** XScuGic ScuGic; //通用中断控制器对象 /** Xil_ExceptionInit(); /** |
SCU_GIC.h |
#ifndef ACZ702_LIB_SCU_GIC_H_ #include "xscugic.h" XScuGic ScuGic; //通用中断控制器 void ScuGic_Init(); #endif /* ACZ702_LIB_SCU_GIC_H_ */ |
6. MIO中断
6.1 Block Design
只需勾选MIO
6.2 main.c
#include <stdio.h> #include "PS_GPIO.h" #define INPUT 1 #define PS_KEY 47 void PS_MIO_IRQ_Handler(void *CallBackRef, u32 Bank, u32 Status); int main(void) }
|
7. EMIO中断
7.1 Block Design
只需勾选EMIO,本次只是用两个引脚
7.2 main.c
#include <stdio.h> #include "PS_GPIO.h" #define INPUT 1 #define PL_KEY (54+1) void PS_EMIO_IRQ_Handler(void *CallBackRef, u32 Bank, u32 Status); int main(void) }
|
8. 触发方式
按键电路: |
由图可知,对应按键引脚值,在未按下时,都为高电平 因此,不能选择高电平触发 |
共五种触发类型,经测试, 除高电平触发(硬件电路决定滴),其他四种方式都可以实现摸鱼任务 |
但是,没有经过按键消抖(这个在PL做过),还是会有误判现象存在 后边再学一下~ |
PS_GPIO_INT摸鱼结束 下次摸AXI_GPIO_INT |