Zynq-7000系列GPIO排布如下图所示,著名手册ug585第14章,第一个图,这图很清晰的表明,一共54个MIO,64个EMIO,所有这些IO共分为4个bank,其中
Bank0 32bit —>> MIO[0:31]
Bank1 22bit —>> MIO[32:53]
Bank2 32bit —>> EMIO[0:31]
Bank3 32bit —>> EMIO[32:63]
看懂这个很重要。后面的驱动都是根据这个来设计的。
使用SDK控制GPIO
主要函数说明
初始化GPIO驱动
/* Initialize the GPIO driver. */
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
设置MIO/EMIO管脚输出,其中Output_Pin即为需要设置的MIO/EMIO编号,取值为0~117
0 - 31, Bank 0
32 - 53, Bank 1
54 - 85, Bank 2
86 - 117, Bank 3
/*
* Set the direction for the pin to be output and
* Enable the Output enable for the LED Pin.
*/
XGpioPs_SetDirectionPin(&Gpio, Output_Pin, 1);
XGpioPs_SetOutputEnablePin(&Gpio, Output_Pin, 1);
/* Set the GPIO output to be low. */
XGpioPs_WritePin(&Gpio, Output_Pin, 0x0);
设置MIO/EMIO管脚输出,其中Input_Pin即为需要设置的MIO/EMIO编号,取值为0~117
0 - 31, Bank 0
32 - 53, Bank 1
54 - 85, Bank 2
86 - 117, Bank 3
/* Set the direction for the specified pin to be input. */
XGpioPs_SetDirectionPin(&Gpio, Input_Pin, 0x0);
/* Read the state of the data so that it can be verified. */
*DataRead = XGpioPs_ReadPin(&Gpio, Input_Pin);
Zynq-7000中SDK针对MIO/EMIO的操作过程和操作函数是完全相同,只是PIN_NUM的不同,如下图所示,再xgpios.h文件中有清晰的管脚定义,其中定义的内容也是和本文开头所述的内容一样。XGPIOPS_DEVICE_MAX_PIN_NUM为最大pin的最大数量
下个章节记录一下,使用SDK中使用EMIO/MIO作为外部输入中断的例程