基于ZYNQ-7000开发板的调试系列(4)

本文介绍基于ZYNQ-7000开发板的程序中断,特别是PS中断的使用。内容涵盖创建Block、配置ZYNQ Processing System与AXI GPIO、建立管脚约束文件,以及编写PS程序来实现内部定时器中断控制的流水灯。通过中断控制器管理软件中断、私有外设中断和共享外设中断,详细阐述了中断的配置和操作流程。
摘要由CSDN通过智能技术生成

程序中断(1)

这一部分用的都是基于PS的中断。
该部分中断分为两部分,

  1. 基于PL外设的中断,以方便之后PS与PL之后的同步使用。
  2. 基于PS内部的中断,比如定时器触发中断等等。

基于三种触发方式的流水灯

该部分最后会基于之前流水灯的实验继续展开:

  1. 利用PS内部的定时器触发中断完成流水灯流水的过程。
  2. 利用PL的按钮触发中断完成流水灯功能的开关。
  3. 利用PS的按钮触发中断完成流水灯方向的调整。

需要使用的GPIO口有以下4组:

  1. PL端LED: A5、A6、A7、B8、T16
  2. PS端LED:C19、G17
  3. PL端KEY:AB12
  4. PS端KEY:B19

和上一次的实验一样:由A5、A6、A7、B8、C19组成一组流水灯;由T16、G17组成另外一组。
并且C19 对应的是MIO9、G17对应的是MIO0、B19对应的是MIO11。

这里主要是先完成第一部分,即完成一个计时器控制一组流水灯。

1. 创建Block

1. 创建一个ZYNQ Processing System

这里需要修改的设置如下:

  1. Peripheral I/O Pins 使能GPIO MIO。Peripheral I/O Pins
  2. DDR Configuration 此处按照板卡的类型选择自己DDR的型号。DDR Configuration
  3. Interrupts 使能中断。
    Interrupts
    这里针对中断还需要一点说明,具体提供的中断如下图所示。System-Level Block Diagram
    主要分为3类:
    1 Software Interrupts(软件中断)。
    2 Private Peripheral Interrupts(私有外设中断)。PPI
    3 Shared Peripheral Interrupts(共享外设中断)。SPI

该3类中断均由Generic Interrupt Controller(中断控制器)进行控制,
[参考ZYNQ7000 TRM (Page.255-256)]
[参考Zynq中 PS接收PL中断]

2. 创建一个AXI GPIO

这里主要由两个部分需要修改:

  1. 使能6个引脚(A5、A6、A7、B8、T16、AB12)。
  2. 使能中断。
    实际上没有必要,但是这部分我还是打算按照两个通道去使能GPIO口。AXI GPIO
    自动连接后,生成HDL Wrapper 文件,具体大概是这个样子。这里把GPIO口命名了一下,否则有点小乱。
    Diagram

2. 建立管脚约束文件

这一部分需要6个GPIO口。
具体文件如下:

set_property IOSTANDARD LVCMOS33 [get_ports {leds_tri_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_tri_o[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_tri_o[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_tri_o[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports key_tri_i]

set_property PACKAGE_PIN A5 [get_ports {leds_tri_o[0]}]
set_property PACKAGE_PIN A7 [get_ports {leds_tri_o[1]}]
set_property PACKAGE_PIN A6 [get_ports {leds_tri_o[2]}]
set_property PACKAGE_PIN B8 [get_ports {leds_tri_o[3]}]
set_property PACKAGE_PIN T16 [get_ports {leds_tri_o[4]}]
set_property PACKAGE_PIN AB12 [get_ports key_tri_i]

之后生成Bitstream文件后,导出硬件平台信息,开始编写ps程序。
Export Hardware

3. PS程序编写

这里首先还是应该先叙述一下中断需要使用的资源与具体的流程,主要有:

  1. 初始化Xilinx中断
  2. 配置中断控制器
  3. 配置中断触发信号
  4. 配置中断操作函数
  5. 连接中断函数与触发信号

首先先引用一下必须引入的模块

#include "xparameters.h" // 常数模块
#include "xgpio.h" // PL GPIO模块
#include "xgpiops.h" // PS GPIO模块
#include "xscutimer.h" // 计时器模块
#include "xscugic.h" // 中断控制器模块
#include "xil_exception.h" // 中断模块
1. 内部定时器中断(1组)

由于有两组流水灯,这一部分需要两个定时器,两组中断。所以这里没有办法使用单独的29号中断,因为需要不止一个中断信号。这里仅仅是略微修改一下下xscutimer_intr_example的例程,首先完成一组流水灯。
PPI
[参考ZYNQ7000 TRM (Page.229)]
具体需要用的函数比较多,一股脑列出来会比较乱,这里分一下类:

  1. 与GPIO相关的:
    初始化相关:
// PL GPIO口初始化
XGpio_Config *XGpio_LookupConfig(
	u16 DeviceId
); 
int XGpio_CfgInitialize(
	XGpio * InstancePtr, 
	XGpio_Config * Config,
	UINTPTR EffectiveAddr
);

//PS GPIO口初始化
XGpioPs_Config *XGpioPs_LookupConfig(
	u16 DeviceId
);
s32 XGpioPs_CfgInitialize(
	XGpioPs *InstancePtr, 
	XGpioPs_Config *ConfigPtr,
	u32 EffectiveAddr
);

GPIO口配置

//PL GPIO口配置
void XGpio_SetDataDirection(
	XGpio *InstancePtr, 
	unsigned Channel,
	u32 DirectionMask
);

//PS GPIO口配置
void XGpioPs_SetDirection(
	XGpioPs *InstancePtr, 
	u8 Bank, 
	u32 Direction
);
void XGpioPs_SetOutputEnable(
	XGpioPs *InstancePtr, 
	u8 Bank, 
	u32 OpEnable
);

GPIO口写入

// PL GPIO写入
void XGpio_DiscreteWrite(
	XGpio *InstancePtr, 
	unsigned Channel, 
	u32 Mask
);

// PS GPIO口写入
void XGpioPs_WritePin(
	XGpioPs *InstancePtr, 
	u32 Pin
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值