使能控制输出函数
void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, u32 Pin, u32 OpEnable)
参数1:XGpioPs 结构体指针
参数2:需要打开或者关闭使能的pin号码
参数3:写1 打开使能;写0 关闭使能
返回值:无
void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, u32 Pin, u32 OpEnable)
{
u8 Bank;
u8 PinNumber;
u32 OpEnableReg;
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid(Pin < InstancePtr->MaxPinNum);
Xil_AssertVoid(OpEnable <= (u32)1);
/* Get the Bank number and Pin number within the bank. */
XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber);
OpEnableReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr,
((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) +
XGPIOPS_OUTEN_OFFSET);
if (OpEnable != (u32)0) { /* Enable Output Enable */
OpEnableReg |= ((u32)1 << (u32)PinNumber);
} else { /* Disable Output Enable */
OpEnableReg &= ~ ((u32)1 << (u32)PinNumber);
}
XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr,
((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) +
XGPIOPS_OUTEN_OFFSET, OpEnableReg);
}
分析这段代码的方法跟前一章节分析初始化函数是一样的,熟悉单片机的人都知道操控底层寄存器,可能更喜欢直接对寄存器操作的这种方式,其实在zynq中你也可以直接操作相应的寄存器,只不过这需要你提前找到相应的寄存器地址。对于库函数其实也是对寄存器操作而已,官方在此基础上封装了一层函数,有利于大家直接调用即可,不在需要去看大量的datasheet,然后去操控每个bit。
假设我们需要打开pin_7 这个pin脚的EN。
如:XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 7,1);
XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr,
((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) +
XGPIOPS_OUTEN_OFFSET, OpEnableReg);
首先:
1:InstancePtr->GpioConfig.BaseAddr = 0xE000A000 ;这个就是gpio外设基地址
2:(Bank) * XGPIOPS_REG_MASK_OFFSET) = 0*0x00000040U = 0
XGPIOPS_REG_MASK_OFFSET为宏定义0x00000040U bank为什么为0,那是因为bank0这个范围【0-31】共有32个pin。pin7是在这个范围内的。
3:XGPIOPS_REG_MASK_OFFSET也是宏定义0x00000208U
所以最终的地址为:address=0xE000A000 +0+0x00000208 =0xE000A208
在数据手册中:找到
今后所有遇到的函数都可以按照这个方法去分析,有利于加深对函数的理解。
我们就按照这个函数流程进行分析,在datasheet找到相应的寄存器,查看寄存器说明,来对照这个函数是否实现的是这个功能。百分百就是一样的,因为官方写这些函数就是按照datasheet来写的。我就在gpio这个章节里面进行详细分析,后面的就不准备这么分析,方法都是类似的。
今记于此,与君共勉!