完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1)实验平台:正点原子领航者ZYNQ开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/FPGA/zdyz_linhanz.html 4)对正点原子FPGA感兴趣的同学可以加群讨论:876744900 5)关注正点原子公众号,获取最新资料 第四章GPIO之MIO按键中断实验 中断是一种当满足要求的突发事件发生时通知处理器进行处理的信号。中断可以由硬件处理单元和外部设备产生,也可以由软件本身产生。对硬件来说,中断信号是一个由某个处理单元产生的异步信号,用来引起处理器的注意。对软件来说,中断还是一种异步事件,用来通知处理器需要改变代码的执行,不过,轮询所产生的中断的过程是同步的。 本章我们将学习GPIO中MIO(包括EMIO)接口中断信号的使用。本章包括以下几个部分: 11.1简介 1.2实验任务 1.3硬件设计 1.4软件设计 1.5下载验证 简介 当处理器收到中断,它会停下当前正在做的任务,然后跳转到需要处理的地方去。这和轮询的方式是相反的,轮询是由软件同步获取设备的状态。在中断方式中,不需要由处理器不断地轮询设备的I/O端口来查看是否需要处理,设备本身会中断处理器。中断(主要是硬件中断)可以进一步被分类为以下几种类型: • 可屏蔽中断(Maskable Interrupts,IRQ)—可通过在中断屏蔽寄存器中设定位掩码来关闭。触发可屏蔽中断的事件源不总是重要的。程序设计人员需要决定该事件是否应该导致程序跳到所需处理的地方去。使用可屏蔽中断的设备包括定时器、比较器和ADC。 • 不可屏蔽中断(Non-Maskable Interrupts,NMI)—无法通过在中断屏蔽寄存器中设定位掩码来关闭。这些是不可忽视的中断。NMI的事件包括上电、外部重启(用实际的按钮)和严重的设备失效。 • 处理器间中断(Inter-Processor Interrupts,IPI)—在多处理器系统中,一个处理器可能需要中断另一个处理器的操作。在这种情况下,就会产生一个IPI,以便于处理器间通信或同步。 Zynq芯片的PS部分是基于使用双核Cortex-A9处理器和GIC pl390中断控制器的ARM架构。中断结构与CPU紧密链接,并接受来自I/O外设(IOP)和可编程逻辑(PL)的中断。中断控制器架构如下图所示: 图 4.1.1 中断控制器架构图 从图中可以看到,CPU接收的中断来源有三种,分别是私有外设中断(private peripheral interrupts,PPI)、软件生成的中断(software generated interrupts,SGI)和共享外设中断(shared peripheral interrupts、SPI)。 每个CPU都有一组私有外设中断,使用存储寄存器进行私有访问。PPI包括全局定时器、专用看门狗定时器(AWDT)、专用定时器和来自PL的FIQ/IRQ。软件生成的中断通过SGI分配(派)器分配给一个或两个CPU。共享外设中断由PS和PL中的各种I/O和存储控制器生成。它们被路由到任一个或两个CPU,来自PS外设的SPI中断也可以路由到PL。下面我们从下图的系统级中断环境来进一步了解中断。 图 4.1.2 系统级中断环境 首先我们来看通用中断控制器。通用中断控制器是一个用于集中管理从PS和PL发送到CPU的中断,启用、禁用、屏蔽和优先化中断源的处理中心,将具有最高优先级的中断源分配给各个CPU之前集中所有中断源,并在CPU接口接受下一个中断时以编程方式将它们发送到选定的CPU。此外,控制器还支持用于实现安全感知系统的安全扩展。该控制器基于非矢量化的ARM通用中断控制器架构版本1.0(GIC v1)。GIC寄存器通过CPU私有总线访问寄存器,以避免临时阻塞或互连中的瓶颈,从而实现快速读/写响应。GIC确保针对多个CPU的中断一次只能由一个CPU占用。所有中断源都由唯一的中断ID号标识,对应有它自己的可配置优先级和目标CPU列表。 接下来我们依次来看软件生成中断、CPU私有外设中断和共享外设中断。 每个CPU都可以使用软件生成的中断中断自身、另一个CPU或同时中断两个CPU。有16个软件生成中断,具体见表 4.1.1。向软件产生的中断寄存器(Software Generated Interrupts Register,ICDSGIR)写入SGI中断编号并指定目标CPU(或两个CPU),就产生了一个SGI。该写操作通过CPU自己的专用(私有)总线进行。每个CPU都有自己的一组SGI寄存器,用于生成16个软件生成的中断中的一个或多个。中断的清除是通过读取中断确认寄存器(Interrupt Acknowledge Register,ICCIAR)或向中断挂起清除寄存器(Interrupt Clear-Pending Register,ICDICPR)对应的位写入“1”来实现的。 所有的SGI都是边缘触发的,且其敏感性类型是固定的,不能修改。只读的ICDICFR0寄存器指定了所有16个SGI的灵敏度类型。 表 4.1.1 软件生成中断 每个CPU核连接到了一个有五个外设中断的私有组上,这五个外设中断见表 4.1.2。PPI的敏感类型是固定的,不能改变。需要注意的是:来自PL的快速中断(FIQ)信号和中断(IRQ)信号在发送给中断控制器之前,会在传输给 PS 的时候被反转。因此,这些信号因此在PL内低电平有效,在PS-PL接口处高电平有效。 表 4.1.2 私有外设中断 (PPI) 来自各种模块的大约60个中断的组可以被路由到PL或CPU中的一个或两个,这60个中断见表 4.1.3。那些目标为CPU的中断的优先级和中断的接收情况是由中断控制器管理的。除IRQ#61至#68和#84至#91外,所有中断灵敏度类型均由请求源固定,无法更改。必须对GIC进行编程以适应这种情况。Boot ROM不编程这些寄存器。因此,SDK设备驱动程序必须对GIC进行编程以适应这些敏感类型。 对于电平敏感类型的中断,请求源必须为中断处理程序提供一种机制,以便在确认中断后清除中断。此要求适用于具有高电平敏感类型的任何IRQF2P [n](来自PL)。对于上升沿敏感的中断,请求源必须提供足够宽的脉冲以便GIC捕获。这通常至少为2个CPU_2x3x周期。此要求适用于具有上升沿灵敏度类型的任何IRQF2P [n](来自PL)。 表 4.1.3 PS和PL共享外设中断(SPI) 了解了软件生成中断SGI、CPU私有外设中断PPI和共享外设中断SPI后,我们来看下中断优先级定序。 所有的中断请求,无论是PPI、SGI还是SPI,都分配了一个唯一的ID编号,以用于中断控制器的仲裁。中断分派(配)器保存每个CPU的中断挂起列表,并从中选择优先级最高的中断,然后把它发送到CPU接口。如果具有相同优先级的两个中断同时到达,具有最低中断 ID的会首先被发送。 每个 CPU 都存在着优先级定序逻辑,所以对最高优先级中断的选择是每个CPU各自进行的。中断分配器具有中断、处理器和活跃信息的中央列表,并负责触发CPU的软件中断。为了给每个处理器提供单独的副本,SGI和PPI分派器寄存器是分组的。硬件确保针对多个CPU的中断同一时间只能被一个CPU获取。 在发送挂起的最高优先级的中断给CPU接口后,中断分配器会从该CPU收到中断已被确认的消息,这样它就可以改变对应的中断的状态。只有确认中断的CPU才能结束该中断。 以上我们大概了解了ZYNQ的中断。下面我们来看作为GPIO的MIO的中断。上章我们介绍了图 4.1.3 下半部分,现在我们来看其上半部分,也就是关于中断的部分。 图 4.1.3 GPIO通道 左边有7个寄存器,说明如下: INT_MASK:这个寄存器是只读的,显示哪些位当前被屏蔽,哪些位未被屏蔽/启用。 INT_EN:向该寄存器的任何位写入1,可以启用/解除中断信号的掩码。从该寄存器读取将返回一个不可预测的值。 INT_DIS:向该寄存器的任何位写入1都会屏蔽该中断信号。从该寄存器读取会返回不可预测的值。 INT_STAT:该寄存器显示是否发生了中断事件。将1写入该寄存器中的某个位可清除该位的中断状态。将0写入该寄存器中的某个位将被忽略。 INT_TYPE:该寄存器控制中断是边沿敏感还是电平敏感。 INT_POLARITY:该寄存器控制中断是低电平有效还是高电平有效(或下降沿敏感或上升沿敏感)。 INT _ANY:如果INT_TYPE设置为边沿敏感,则该寄存器在上升沿和下降沿都会启用中断事件。如果INT_TYPE设置为电平敏感,则忽略该寄存器。 从INT_TYPE、INT_POLARITY和INT _ANY寄存器我们可以看到中断触发方式可以是上升沿,下降沿,边沿,低电平或高电平。 从图 4.1.3中我们可以看到,INT_TYPE、INT_POLARITY和INT _ANY控制监视GPIO输入信号的中断检测逻辑。如果检测到中断,中断检测逻辑将GPIO的INT_STAT状态设置为真。如果中断未屏蔽,则中断传输到一个或电路(图中未画出)。该或电路将四个BANK中所有GPIO的所有中断组合成一个输出(IRQ ID#52)到中断控制器。如果中断被禁止(屏蔽),则INT_STAT状态将保持直到被清除,但它不会传输到中断控制器,除非稍后写入INT_EN以禁用屏蔽。由于所有GPIO共享相同的中断,因此软件必须同时考虑INT_MASK和INT_STAT以确定哪个GPIO导致中断。 通过向INT_EN和INT_DIS寄存器写入1来控制中断屏蔽状态。向INT_EN寄存器写入1将禁用屏蔽,允许活动中断传输到中断控制器。将1写入INT_DIS寄存器可启用屏蔽。可以使用INT_MASK寄存器读取中断屏蔽的状态。 如果GPIO中断是边沿触发的,则INT状态由检测逻辑锁存。通过向INT_STAT寄存器写入1来清除INT锁存器。对于电平触发的中断,必须清零GPIO中断输入源,以清除中断信号。或者,软件可以使用INT_DIS寄存器屏蔽该输入。 可以通过读取INT_STAT和INT_MASK寄存器来推断进入中断控制器的中断信号的状态。如果INT_STAT = 1且INT_MASK = 0,则该中断信号有效。 实验任务 本章的实验任务是使用PS的MIO按键中断控制LED的亮灭。 硬件设计 图 4.3.1 按键原理图 PS端的按键没有按下时,对应的IO端口为高电平;当按键按下时,对应的IO端口变为低电平。 根据实验任务我们可以画出本次实验的系统框图,如下图所示: 图 4.3.2 系统框图 从图我们可以看到,我们选用的是KEY按键是PS_KEY1,LED是核心板上的LED2。 本章的硬件设计部分与《第二章 MIO控制LED》实验完全相同。为了方便管理工程,我们不直接在原工程上开始实验,而是将其另存为gpio_mio_interrupt实验工程。 step1:创建Vivado工程 1-1 我们打开《第二章 MIO控制LED》实验的Vivado工程,打开后选择菜单栏的File-> Project->Save As...,如下图所示: 图 4.3.3 选择另存为 1-2 在弹出的另存为界面中可以输入新的工程名或更改保存位置,此处我们输入新的工程名“gpio_mio_interrupt”,工程位置保持默认,如下图所示: 图 4.3.4 工程另存为 然后点击“OK”按钮。 工程另存为之后,因硬件设计无需改变,所以以下的 step2:使用IP Integrator创建Processing System step3:生成顶层HDL 就不再需要了,直接进入step4。 step4:硬件设计导出到SDK 因为硬件设计未改动,所以就无需重新导出,直接启动SDK开发环境,如下图所示: 图 4.3.5 启动SDK开发环境 在弹出的下图所示界面中,直接点击“OK” 图 4.3.6 登录SDK开发环境 至此第四步完成,下面进入第五步,进入到SDK软件中开发,也就是软件设计部分。 软件设计 在硬件设计的最后,我们打开了SDK开发环境,可以看到Project Explorer窗口不仅保留着以前的工程还新增了system_wrapper_hw_platform_0,如下图所示。 图 4.4.1 SDK开发环境界面 虽然我们没有导出新的硬件,但是可能由于SDK软件本身设置的原因导致了在打开工程时检测到某些文件信息特别是hdf文件信息有更改而重新导入的情况。 一般而言,打开SDK软件后,展开的“system_wrapper_hw_platform_”为最新导入的,如本工程的system_wrapper_hw_platform_0,此处system_wrapper_hw_platform_0与system_wrapper_hw_platform_1内容是一样的,因为硬件设计并未改变。由于我们不需要先前保留的工程,所以将system_wrapper_hw_platform_1和gpio_mio以及gpio_mio_bsp删除,选中之后按键盘上的Delete键将其删除,在弹出的删除界面中,如下图,如果勾选2处的方框,则从磁盘上删除,如果不勾选,只是在SDK中删除,可以重新导入,因为此处我们不需要上一实验的结果,所以勾选,然后点击“OK”按钮。 图 4.4.2 删除不需要的工程 如果弹出下图所示界面,直接点击“Continue”按钮。 图 4.4.3 继续删除 下面我们开始第五步——创建应用工程。 step5:在SDK中创建应用工程 5-1 选择菜单File->New->Application Project, 新建一个空的SDK软件工程。 图 4.4.4 新建一个SDK软件工程 5-2 在弹出的图 2.4.4所示界面中,输入工程名“gpio_mio_interrupt”,注意2处的硬件平台,如果我们没有删除system_wrapper_hw_platform_1,该处可能是system_wrapper_hw_platform_0,所以要注意选择正确。其它选项保持默认即可,点击“Next >”按钮 5-3 选择工程模版Empty Application,然后点击“Finish”按钮。 图 4.4.5 配置工程 5-4 新建源文件。Finish之后SDK创建了一个gpio_mio_interrupt目录和gpio_mio_interrupt_bsp目录。首先我们在gpio_mio_interrupt/src目录上右键,选择New->Source File,如下图所示: 图 4.4.6 新建源文件 在下图所示的弹出的添加源文件界面中,Source file一栏我们输入文件名“main.c”,然后点击“Finish”按钮。 图 4.4.7 设置文件信息 5-10 新建源文件之后,在左侧gpio_mio_interrupt/src目录下可以看到main.c文件,同时在SDK主页面已经打开了该文件的文本编辑框。我们在新建的 main.c 文件中输入以下代码:
在代码的第17至18行,我们指定了PS端的按键和LED所连接的MIO引脚编号,这些编号可以从领航者ZYNQ核心板和底板的原理图中查到。 代码第58行我们调用了建立中断函数。代码98行至138行完成了按键中断的的建立。程序首先对中断控制器进行初始化,随后设置并打开中断异常处理的功能。接下来为按键中断设置中断处理函数,通过XScuGic_Connect 函数进行设置。XScuGic_Connect函数建立中断源ID与识别中断时要运行的关联处理程序之间的连接,这里设置的按键中断处理函数为intr_handler。XGpioPs_SetIntrTypePin函数用于设置单个PS GPIO引脚的中断类型。进入其函数定义处,我们可以看到如下类型: 图 4.4.8 GPIO中断类型 总共有五种中断类型,分别是上升沿、下降沿、双边沿、高电平和低电平。此处我们使用的下降沿中断。 设置完中断类型后,就使能按键KEY中断。 成功建立中断后,就等待中断触发,当CPU检测到KEY引脚下降沿时,触发中断。程序进入代码第82行的中断处理函数。该函数的主要作用是读取KEY按键引脚的中断状态,判断是否是按键发生中断,是则将key_press设置为TURE,并屏蔽按键KEY中断。 此时代码66行的if语句执行。先用usleep函数延时20ms进行消抖。延时完成后读取KEY按键的状态,如果为0代表按下,则反转LED的显示状态,然后清除按键KEY中断位并使能按键KEY中断。等待下次中断触发。 5-6 我们按快捷键Ctrl+S保存 main.c 文件,工具会自动进行编译,编译过程可以在SDK下方的控制台(Console)中看到。编译完成后 Console 中会出现提示信息“Build Finished”,同时在gpio_mio_interrupt的Binaries目录下可以看到生成的elf文件。 图 4.4.9 elf文件 下载验证 首先我们将下载器与领航者底板上的JTAG接口连接,下载器另外一端与电脑连接。然后使用Mini USB连接线将USB UART接口与电脑连接,用于串口通信。最后连接开发板的电源,并打开电源开关。 图 4.5.1领航者ZYNQ开发板实物图 step6:板级验证 6-1 在SDK软件下方的SDK Terminal窗口中点击右上角的加号连接串口,并在弹出的窗口中对串口进行设置。 需要注意的是,在设置端口(Port)时,在下拉列表中可能会看到多个可选端口。我们需要选择与领航者底板上的串口所连接的端口,具体的端口号可在计算机设备管理器中查看。因为底板上使用的USB转串口芯片型号为CH340,因此在设备管理器中找到USB-SERIALCH340 所对应的端口。在我这台电脑上该端口号为 COM7。串口的设置如下图所示: 图 4.5.2 设置UART 由于我们在硬件中设置UART的波特率为默认值115200,所以此处无需再设置,其它的保持默认即可,点击“OK”按钮。 6-2 下载程序。在应用工程 gpio_mio_interrupt上右击,选择“Run As”,然后选择第一项“1 Launch on Hardware (System Debugger)”。 软件程序下载完成后,在下方的 SDK Terminal 中可以看到应用程序打印的信息“Gpio interrupt test”,如下图所示: 图 4.5.3 串口终端中打印的信息 我们按下领航者底板上的PS端的用户按键PS_KEY1,可以看到核心板上对应的PS端的 LED灯在每次按键按下时亮灭的状态反转。说明我们通过MIO按键中断控制PS端LED的实验在领航者ZYNQ开发板上面下载验证成功。实验结果如下图所示: 图 4.5.4 按下KEY1时领航者开发板运行结果 |
|
相关推荐
|
|
1413 浏览 1 评论
1208 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1419 浏览 0 评论
913 浏览 0 评论
2223 浏览 0 评论
1425 浏览 34 评论
5610 浏览 113 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:37 , Processed in 0.592380 second(s), Total 62, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号