首页 > 代码库 > 【SDK】控制PS侧GPIO

【SDK】控制PS侧GPIO

 

技术分享

封装函数位于bsp文件下xgpiops.h

void XGpioPs_SetDirection(XGpioPs *InstancePtr, u8 Bank, u32 Direction);// 设置IO的in/out方向
void XGpioPs_SetOutputEnable(XGpioPs *InstancePtr, u8 Bank, u32 OpEnable);// 设置out使能
void XGpioPs_WritePin(XGpioPs *InstancePtr, u32 Pin, u32 Data);//管脚置0/1

选XGpioPs_WritePin()函数分析(\gpiops_v3_1\src\xgpiops.c)

void XGpioPs_WritePin(XGpioPs *InstancePtr, u32 Pin, u32 Data)
{
    u32 RegOffset;
    u32 Value;
    u8 Bank;
    u8 PinNumber;
    u32 DataVar = Data;

    Xil_AssertVoid(InstancePtr != NULL);
    Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
    Xil_AssertVoid(Pin < InstancePtr->MaxPinNum);

    /* Get the Bank number and Pin number within the bank. */
    XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber);

    if (PinNumber > 15U) {
        /* There are only 16 data bits in bit maskable register. */
        PinNumber -= (u8)16;
        RegOffset = XGPIOPS_DATA_MSW_OFFSET;
    } else {
        RegOffset = XGPIOPS_DATA_LSW_OFFSET;
    }

    /*
     * Get the 32 bit value to be written to the Mask/Data register where
     * the upper 16 bits is the mask and lower 16 bits is the data.
     */
    DataVar &= (u32)0x01;// 只取最后1bit
    Value = ~((u32)1 << (PinNumber + 16U)) & ((DataVar << PinNumber) | 0xFFFF0000U);// 修改设定的pin位 其他mask掉
    XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr,
              ((u32)(Bank) * XGPIOPS_DATA_MASK_OFFSET) +
              RegOffset, Value);// 最终写入 MASK_DATA_0_LSW 寄存器
}

 

选XGpioPs_WriteReg()分析(xgpiops_hw.h)

#define XGpioPs_WriteReg(BaseAddr, RegOffset, Data)    \
        Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data))// 带参宏把功能映射到底层函数上

 

分析Xil_Out32() (\standalone_v5_5\src\xil_io.c)

void Xil_Out32(UINTPTR Addr, u32 Value)
{
    volatile u32 *LocalAddr = (u32 *)Addr;// 强制类型转换 映射到地址
    *LocalAddr = Value;// 把数据写到该地址
}

 

--- 

【SDK】控制PS侧GPIO