ZYNQ——PS端之XGpioPs_SetOutputEnablePin()函数详解

 使能控制输出函数

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这个章节里面进行详细分析,后面的就不准备这么分析,方法都是类似的。

  今记于此,与君共勉!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值