GPIO
General Purpose I/O ,网上能找到很多关于znyq gpio 的文章。
分类:EMIO 、MIO 、AXI_GPIO
硬件系统
MIO和EMIO是在zynq核中配置的,MIO是固定的,EMIO是可选的使用PL的引脚。
AXI_GPIO是在PL端使用的GPIO,挂在znyq核的M_AXI_GP接口下使用。
需要zynq核,AXI_GPIO的使用PL端的模块,如AXI_GPIO
软件部分
SDK的库封装是多层次的,
可以使用高层次的
- xgpio.h 使用AXI_GPIO需要
- xgpiops.h 使用MIO和EMIO需要
或者是底层的
- xgpio_l.h
- xil_io.h
在高层次中模块被封装成结构体实例,使用时调用实例,初始化读写。
而低层次中就是直接对地址进行读写,如下:
//write
XGpio_WriteReg(BaseAddress, RegOffset, Data)
XGpio_Out32((BaseAddress) + (RegOffset), (u32)(Data))
//read
XGpio_ReadReg(BaseAddress, RegOffset)
XGpio_In32((BaseAddress) + (RegOffset))
或更底层的。
我更喜欢高级的读写方式,因为更多信息都在函数中表现出来了,下面是读写方式。
流程都是相似的:
- 定义Gpio或GpioPs结构体。
- 初始化配置。
- 设置读写方向、使能。
- 读写。GpioPs有Pin和Bank两种方式。
code:
//GPIO #define GPIO0_ADDR XPAR_AXI_GPIO_0_BASEADDR
#define GPIO0_ID XPAR_AXI_GPIO_0_DEVICE_ID int main()
{
XGpio Gpio0;
XGpioPs_Config *ConfigPtr; int Status;
u32 value = 0xa;
/* Initialize the GPIO driver */
Status = XGpio_Initialize(&Gpio0, GPIO0_ID);
if (Status != XST_SUCCESS) {
xil_printf("Gpio Initialization Failed\r\n");
return XST_FAILURE;
}
Status = XGpioPs_CfgInitialize(GpioPsPtr,ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS)
{
xil_printf("Cfg init err\n");
return XST_FAILURE;
} /* Set the direction */
XGpio_SetDataDirection(&Gpio0, CHANNEL, 0x00000000);//output // XGpio_Out32((GPIO1_ADDR) + (0), (u32)(value));
// XGpio_WriteReg(GPIO_ADDR, 0, value);
XGpio_DiscreteWrite(&Gpio0, CHANNEL, value); return ;
} //GPIOPS
#define GpioPsDeviceId XPAR_PS7_GPIO_0_DEVICE_ID
#define pin 0
int main()
{
XGpioPs GpioPs;
XGpioPs_Config *ConfigPtr; int Status;
int value = ;
/* Initialize the Gpio driver. */
ConfigPtr = XGpioPs_LookupConfig(GpioPsDeviceId);
if (ConfigPtr == NULL) {
xil_printf("ERROR\n");
return XST_FAILURE;
}
Status = XGpioPs_CfgInitialize(GpioPsPtr,ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
xil_printf("Cfg init err\n");
return XST_FAILURE;
} //set pin direction
//value 0 -> input 1 -> output
XGpioPs_SetDirectionPin(GpioPsPtr, pin0, );
//value 0 -> disable 1 -> enable
XGpioPs_SetOutputEnablePin(GpioPsPtr, pin0, ); //write
XGpioPs_WritePin(&GpioPs, pin0, value); return ;
}
via :
ug585 CH14 General Purpose I/O
https://blog.csdn.net/husipeng86/article/details/52123465
https://blog.csdn.net/yc461515457/article/details/40954363
https://blog.csdn.net/xzyiverson/article/details/19934837
https://blog.csdn.net/luoqindong/article/details/43017773?utm_source=blogxgwz0