PL按键中断实验

PL按键中断实验#

实验VIvado工程为“ps_axi_key”。

前面的定时器中断实验的中断属于PS内部的中断,本实验中断来自PL,PS最大可以接收16个来自PL的中断信号,都是上升沿或高电平触发。本实验用按键中断来控制LED。

../_images/image138.png

Vivado工程建立#

  1. 本实验所用的Vivado工程只需要在“ps_axi_led”这个工程上添加用于按键输入的AXI

    GPIO就可以,点击菜单“File -> Save Project As…”

../_images/image225.png
  1. 新的工程名为“ps_axi_key”

../_images/image318.png
  1. 添加一个AXI GPIO

../_images/image413.png
  1. 配置GPIO参数,都为输入,宽度为1,使能中断

../_images/image512.png
  1. 使用自动连接

../_images/image610.png
  1. 再把端口名称改为keys

../_images/image710.png
  1. 配置ZYNQ处理器的中断,勾选IRQ_F2P

../_images/image810.png
  1. 连接ip2intc_irpt到IRQ_F2Q

../_images/image910.png
  1. 修改xdc约束文件

set_property IOSTANDARD LVCMOS15 [get_ports {leds_tri_o[0]}]
set_property IOSTANDARD LVCMOS15 [get_ports {leds_tri_o[1]}]
set_property IOSTANDARD LVCMOS15 [get_ports {leds_tri_o[2]}]
set_property IOSTANDARD LVCMOS15 [get_ports {leds_tri_o[3]}]
set_property PACKAGE_PIN F5 [get_ports {leds_tri_o[0]}]
set_property PACKAGE_PIN E5 [get_ports {leds_tri_o[1]}]
set_property PACKAGE_PIN G5 [get_ports {leds_tri_o[2]}]
set_property PACKAGE_PIN G6 [get_ports {leds_tri_o[3]}]
set_property IOSTANDARD LVCMOS15 [get_ports {keys_tri_i[0]}]
set_property PACKAGE_PIN H6 [get_ports {keys_tri_i[0]}]
  1. 保存设计,编译生成bit文件

下载调试#

  1. 点击FileLaunch Vitis进入Vitis

../_images/image1010.png
  1. 新建platform工程过程不再赘述,参考“PS点亮PL的LED灯” 一章

../_images/image1115.png
  1. 和前面的教程一样,在不熟悉Vitis程序编写的情况下,我们尽量使用Vitis自带例程来修改

../_images/image1211.png
  1. 选择“xgpio_intr_tapp_example”

../_images/image139.png
  1. 导入例程以后有未定义的错误,我们需要修改部分代码

../_images/image148.png
  1. 按下图修改GPIO和中断号的宏定义

../_images/image157.png
  1. 修改测试延时时间,让我们有足够的时间去按按键

../_images/image166.png
  1. 打开串口终端,运行程序

../_images/image176.png
  1. 如果一直不按按键,串口显示“No button pressed.”,如果按下“PL_KEY”显示“Successfully ran Gpio Interrupt Tapp Example”。

../_images/image186.png

实验总结#

PL端可以给PS发送中断信号,这提高了PL和PS数据交互的效率,在需要大数量、低延时的应用中需要用到中断处理。