本博客着眼于驱动 GPIO 连接的 LED(PS 端)。虽然使 LED 闪烁是一项非常简单的任务,但通过驱动使 LED 闪烁所需的步骤,我们可以进一步探索 Zynq SoC 的其他方面,例如其定时器和中断。我将在以后的博客中讨论这些主题。Zynq SoC 具有多个通用 I/O 引脚,它们组合起来创建一个 10 位宽的通用 I/O 端口,如下所示。此 GPIO 组以混合电压分布在两个 MIO 组中。在本例中,我们的 LED 将连接到 MIO 47。
Xilinx 提供了许多驱动程序来简化 Zynq SoC 的 GPIO 的使用。支持文档和示例的链接可以在开发板支持包中的 system.mss 文件中找到:驱动 GPIO 所需的代码非常简单。文件 xparameters.h 包含 GPIO 实例的数量、系统内的 GPIO 设备 id 以及上限和下限地址范围:驱动 IO 所需的宏和函数在文件 xgpiops.h 中定义,该文件位于BSP 文件包。该文件包含 Zynq SoC 的 GPIO 所需的配置和初始化函数,以及支持读取和写入 GPIO 的函数,这毕竟是我们最感兴趣的。要使 LED 闪烁,我们需要执行以下操作:
1. 在主应用程序代码中包含 xgpiops.h 文件
#include "xgpiops.h"
2. 定义我们想要切换的输出引脚。在这种情况下,它是 10 组中的引脚 8,MIO 47:
#define ledpin 47
3. 声明驱动程序实例:XGpioPs Gpio;
XGpioPs Gpio; /* The driver instance for GPIO Device. */
4. 配置 GPIO 并在希望使用的函数中定义初始化所需的状态和指针变量:
int Status;
XGpioPs_Config *GPIOConfigPtr;
5.初始化GPIO驱动:
//GPIO初始化
GPIOConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, GPIOConfigPtr, GPIOConfigPtr ->BaseAddr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
6. 设置GPIO管脚方向,使能输出:
XGpioPs_SetDirectionPin (&Gpio, ledpin, 1);
XGpioPs_SetOutputEnablePin(&Gpio, ledpin, 1);
7.将所需的输出值写入GPIO引脚:
XGpioPs_WritePin(&Gpio, ledpin, 0x0);
此写入功能可在循环中使用,以使 LED 以所需的速率闪烁,但是也可以使用此方法来驱动连接到 GPIO 引脚的任何东西。使用XGpioPs\_ReadPin(&Gpio,INPUT\_PIN)函数以类似的方式读取 GPIO 引脚。
PS端GPIO操作值得花一些时间阅读所提供的文档和示例,因为 Zynq SoC 的 GPIO 是一种非常灵活的资源。
❝
ug585-Zynq-7000-全可编程SOC技术参考手册
第十四章介绍了裸机程序GPIO操作。
原文:OpenFPGA
作者:碎碎思
相关文章推荐
更多FPGA技术干货请关注FPGA 的逻辑技术专栏。