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 //连接到MIO0int main()
{// 1.初始化GPIOint 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或1XGpioPs_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 连接到EMIO0int main() {// 1.初始化GPIOXGpioPs 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 开始编号)