Zynq PS端外设之GPIO
1. GPIO(通用输入/输出)
GPIO外设有4个Bank,Bank0/1通过MIO连接到PS的引脚上;Bank2/3通过EMIO连接到PL的引脚上。
注意:Bank1的电平要改成LVCOMS 1.8
-
GPIO寄存器
寄存器: DATA_RO: 读取GPIO的输入 DATA: 设置GPIO的输出值 MASK_DATA_LSW/MASK_DATA_MSW: 数据掩码寄存器,MASK_DATA_LSW 控制Bank的低16位,MASK_DATA_MSW控制高16位 DIRM: 方向模式寄存器,控制I/O引脚是输入还是输出 OEN: 使能输出寄存器,控制是否启用输出
2.GPIO的使用
2.1 MIO
MIO不需要添加引脚约束,Zynq勾选MIO,SDK即可直接使用GPIO。
-
Vivado开发
-
SDK开发
#include "xparameters.h" //器件参数信息
#include "xstatus.h" //包含XST_FAILURE和XST_SUCCESS的宏定义
#include "xil_printf.h" //包含print()函数
#include "xgpiops.h" //包含PS GPIO的函数
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define MIOLED0 0 //连接到MIO0
int main()
{
// 1.初始化GPIO
int Status;
XGpioPs Gpio;
XGpioPs_Config *ConfigPtr;
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS){
return XST_FAILURE;
}
// 2.设置指定引脚的方向:0输入,1输出
XGpioPs_SetDirectionPin(&Gpio, MIOLED0, 1);
// 3.使能指定引脚输出:0禁止输出使能,1使能输出
XGpioPs_SetOutputEnablePin(&Gpio, MIOLED0, 1);
// 4.向指定引脚写入数据:0或1
XGpioPs_WritePin(&Gpio, MIOLED0, 0x0);
while (1);
return XST_SUCCESS;
}
2.2 EMIO
EMIO(Extended MIO,扩展的MIO)
-
Vivado开发
- 勾选EMIO
- 引出管脚并添加管脚约束
- 勾选EMIO
-
SDK开发
#include "stdio.h" #include "xparameters.h" #include "xgpiops.h" #define GPIOPS_ID XPAR_XGPIOPS_0_DEVICE_ID //PS端 GPIO器件 ID #define EMIO_KEY 54 //PL_KEY0 连接到EMIO0 int main() { // 1.初始化GPIO XGpioPs gpiops_inst; XGpioPs_Config *gpiops_cfg_ptr; gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIOPS_ID); XGpioPs_CfgInitialize(&gpiops_inst, gpiops_cfg_ptr, gpiops_cfg_ptr->BaseAddr); // 2.设置指定引脚的方向:0输入,1输出 XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_KEY, 0); // 3.读取GPIO的值 char key_value = 0; XGpioPs_ReadPin(&gpiops_inst, EMIO_KEY); while(1){} return 0; }
注意:BANK2的EMIO0编号为 54 (从0 开始编号)