📄 xllp_gpio.c
字号:
*/
XLLP_UINT32_T XllpGpioGetFallingDetectEnable
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPin)
/**
* Read GFER:
* return 1=falling edge detect enable, 0=falling edge detect disable
*/
{
XLLP_UINT32_T aGpioPinMask;
aGpioPinMask = 0x1 << (aGpioPin & 0x1F);
if(aGpioPin > 95)
return (pGPIO->GFER3 & aGpioPinMask);
else if(aGpioPin > 63)
return (pGPIO->GFER2 & aGpioPinMask);
else if(aGpioPin > 31)
return (pGPIO->GFER1 & aGpioPinMask);
else return (pGPIO->GFER0 & aGpioPinMask);
}
/*
* aGpioPinArray[]=array of GPIO pins
* aGpioPinArray[0] = size of array
* Disable Falling Edge Detect
*/
void XllpGpioSetFallingEdgeDetectDisable
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
{
XLLP_UINT32_T LockID;
XLLP_UINT32_T aGpioPinMask;
XLLP_UINT32_T aSizeArray;
XLLP_UINT32_T aMask0, aMask1, aMask2, aMask3;
XLLP_BOOL_T aSet0, aSet1, aSet2, aSet3;
XLLP_UINT32_T i;
//determine size of array
aSizeArray = aGpioPinArray[0];
aMask0=aMask1=aMask2=aMask3=0;
aSet0=aSet1=aSet2=aSet3=XLLP_FALSE;
for(i=1; i<=aSizeArray; i++)
{
aGpioPinMask = 0x1u << (aGpioPinArray[i] & 0x1F);
if(aGpioPinArray[i] > 95)
{
aMask3 |= aGpioPinMask;
aSet3=XLLP_TRUE;
}
else if(aGpioPinArray[i] > 63)
{
aMask2 |= aGpioPinMask;
aSet2=XLLP_TRUE;
}
else if(aGpioPinArray[i] > 31)
{
aMask1 |= aGpioPinMask;
aSet1=XLLP_TRUE;
}
else
{
aMask0 |= aGpioPinMask;
aSet0=XLLP_TRUE;
}
}
if(aSet3)
{
LockID = XllpLock(GFER3);
pGPIO->GFER3=((pGPIO->GFER3&~aMask3)&~XLLP_GPIO_PIN_RESERVED_BITS);
XllpUnlock(LockID);
}
if(aSet2)
{
LockID = XllpLock(GFER2);
pGPIO->GFER2=((pGPIO->GFER2)&~aMask2);
XllpUnlock(LockID);
}
if(aSet1)
{
LockID = XllpLock(GFER1);
pGPIO->GFER1=((pGPIO->GFER1)&~aMask1);
XllpUnlock(LockID);
}
if(aSet0)
{
LockID = XllpLock(GFER0);
pGPIO->GFER0=((pGPIO->GFER0)&~aMask0);
XllpUnlock(LockID);
}
}
/*
* aGpioPinArray[]=array of GPIO pins
* aGpioPinArray[0] = size of array
* Enable Falling Edge Detect
*/
void XllpGpioSetFallingEdgeDetectEnable
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
{
XLLP_UINT32_T LockID;
XLLP_UINT32_T aGpioPinMask;
XLLP_UINT32_T aSizeArray;
XLLP_UINT32_T aMask0, aMask1, aMask2, aMask3;
XLLP_BOOL_T aSet0, aSet1, aSet2, aSet3;
XLLP_UINT32_T i;
//determine size of array
aSizeArray = aGpioPinArray[0];
aMask0=aMask1=aMask2=aMask3=0;
aSet0=aSet1=aSet2=aSet3=XLLP_FALSE;
for(i=1; i<=aSizeArray; i++)
{
aGpioPinMask = 0x1u << (aGpioPinArray[i] & 0x1F);
if(aGpioPinArray[i] > 95)
{
aMask3 |= aGpioPinMask;
aSet3=XLLP_TRUE;
}
else if(aGpioPinArray[i] > 63)
{
aMask2 |= aGpioPinMask;
aSet2=XLLP_TRUE;
}
else if(aGpioPinArray[i] > 31)
{
aMask1 |= aGpioPinMask;
aSet1=XLLP_TRUE;
}
else
{
aMask0 |= aGpioPinMask;
aSet0=XLLP_TRUE;
}
}
if(aSet3)
{
LockID = XllpLock(GFER3);
pGPIO->GFER3=((pGPIO->GFER3|aMask3)&~XLLP_GPIO_PIN_RESERVED_BITS);
XllpUnlock(LockID);
}
if(aSet2)
{
LockID = XllpLock(GFER2);
pGPIO->GFER2=((pGPIO->GFER2)|aMask2);
XllpUnlock(LockID);
}
if(aSet1)
{
LockID = XllpLock(GFER1);
pGPIO->GFER1=((pGPIO->GFER1)|aMask1);
XllpUnlock(LockID);
}
if(aSet0)
{
LockID = XllpLock(GFER0);
pGPIO->GFER0=((pGPIO->GFER0)|aMask0);
XllpUnlock(LockID);
}
}
/*
* Get the edge-detect status of a Gpio pin.
*/
XLLP_UINT32_T XllpGpioGetEdgeDetectStatus
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPin)
/**
* Read edge-detect status (GEDR):
* return 1=edge occured, 0=no edge occur
*/
{
XLLP_UINT32_T aGpioPinMask;
aGpioPinMask = 0x1 << (aGpioPin & 0x1F);
if(aGpioPin > 95)
return (pGPIO->GEDR3& aGpioPinMask);
else if(aGpioPin > 63)
return (pGPIO->GEDR2 & aGpioPinMask);
else if(aGpioPin > 31)
return (pGPIO->GEDR1 & aGpioPinMask);
else return (pGPIO->GEDR0 & aGpioPinMask);
}
/*
* aGpioPinArray[]=array of GPIO pins
* aGpioPinArray[0] = size of array
* clear edge-detect status bits specified bu aGpioPinArray[]
*/
void XllpGpioClearEdgeDetectStatus
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
{
XLLP_UINT32_T aGpioPinMask;
XLLP_UINT32_T aSizeArray;
XLLP_UINT32_T aMask0, aMask1, aMask2, aMask3;
XLLP_BOOL_T aSet0, aSet1, aSet2, aSet3;
XLLP_UINT32_T i;
//determine size of array
aSizeArray = aGpioPinArray[0];
aMask0=aMask1=aMask2=aMask3=0;
aSet0=aSet1=aSet2=aSet3=XLLP_FALSE;
for(i=1; i<=aSizeArray; i++)
{
aGpioPinMask = 0x1u << (aGpioPinArray[i] & 0x1F);
if(aGpioPinArray[i] > 95)
{
aMask3 |= aGpioPinMask;
aSet3=XLLP_TRUE;
}
else if(aGpioPinArray[i] > 63)
{
aMask2 |= aGpioPinMask;
aSet2=XLLP_TRUE;
}
else if(aGpioPinArray[i] > 31)
{
aMask1 |= aGpioPinMask;
aSet1=XLLP_TRUE;
}
else
{
aMask0 |= aGpioPinMask;
aSet0=XLLP_TRUE;
}
}
if(aSet3)
pGPIO->GEDR3= aMask3;
if(aSet2)
pGPIO->GEDR2= aMask2;
if(aSet1)
pGPIO->GEDR1= aMask1;
if(aSet0)
pGPIO->GEDR0= aMask0;
}
/**
* Alternative functions
*/
/**
* Read alternate function value for Gpio pin specified by aGpioPin
* aGpioPin=0 to 120
*/
XLLP_UINT32_T XllpGpioGetAlternateFn
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPin)
{
XLLP_UINT32_T aGpioPinAFMask;
aGpioPinAFMask = 0x3u << ((aGpioPin & 0xF)*2);
if (aGpioPin>111)
return (pGPIO->GAFR3_U & aGpioPinAFMask);
else if (aGpioPin>95)
return (pGPIO->GAFR3_L & aGpioPinAFMask);
else if (aGpioPin>79)
return (pGPIO->GAFR2_U & aGpioPinAFMask);
else if (aGpioPin>63)
return (pGPIO->GAFR2_L & aGpioPinAFMask);
else if (aGpioPin>47)
return (pGPIO->GAFR1_U & aGpioPinAFMask);
else if (aGpioPin>31)
return (pGPIO->GAFR1_L & aGpioPinAFMask);
else if (aGpioPin>15)
return (pGPIO->GAFR0_U & aGpioPinAFMask);
else return (pGPIO->GAFR0_L & aGpioPinAFMask);
}
/*
* aGpioPinArray[]=array of GPIO pins
* aGpioPinArray[0] = size of array
*
* aAfValueArray[]=array of GPIO pins alternate function values
* aAfValueArray[0] = size of array
*
* Set GPIO pins alternate function values
*
* IMPORTANT:THE ORDER OF aAfValueArray[] HAS TO MATCH THE ORDER OF aGpioPinArray[]
*/
void XllpGpioSetAlternateFn
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[], XLLP_UINT32_T aAfValueArray[])
{
XLLP_UINT32_T LockID;
XLLP_UINT32_T aGpioPinAFMask;
XLLP_UINT32_T aGpioPinAFValue;
XLLP_UINT32_T aSizeArray;
XLLP_UINT32_T aMask0_U, aMask0_L, aMask1_U, aMask1_L;
XLLP_UINT32_T aMask2_U, aMask2_L, aMask3_U, aMask3_L;
XLLP_UINT32_T aAFnV0_U, aAFnV0_L, aAFnV1_U, aAFnV1_L;
XLLP_UINT32_T aAFnV2_U, aAFnV2_L, aAFnV3_U, aAFnV3_L;
XLLP_BOOL_T aSet0_U, aSet0_L, aSet1_U, aSet1_L;
XLLP_BOOL_T aSet2_U, aSet2_L, aSet3_U, aSet3_L;
XLLP_UINT32_T i;
//determine size of array
aSizeArray = aGpioPinArray[0];
aMask0_U=aMask0_L=aMask1_U=aMask1_L=0;
aMask2_U=aMask2_L=aMask3_U=aMask3_L=0;
aAFnV0_U=aAFnV0_L=aAFnV1_U=aAFnV1_L=0;
aAFnV2_U=aAFnV2_L=aAFnV3_U=aAFnV3_L=0;
aSet0_U=aSet0_L=aSet1_U=aSet1_L=XLLP_FALSE;
aSet2_U=aSet2_L=aSet3_U=aSet3_L=XLLP_FALSE;
for(i=1; i<=aSizeArray; i++)
{
aGpioPinAFMask = 0x3u << ((aGpioPinArray[i] & 0xF)*2);
aGpioPinAFValue = aAfValueArray[i] << ((aGpioPinArray[i] & 0xF)*2);
if (aGpioPinArray[i]>111)
{
aAFnV3_U |= aGpioPinAFValue;
aMask3_U |= aGpioPinAFMask;
aSet3_U=XLLP_TRUE;
}
else if (aGpioPinArray[i]>95)
{
aAFnV3_L |= aGpioPinAFValue;
aMask3_L |= aGpioPinAFMask;
aSet3_L=XLLP_TRUE;
}
else if (aGpioPinArray[i]>79)
{
aAFnV2_U |= aGpioPinAFValue;
aMask2_U |= aGpioPinAFMask;
aSet2_U=XLLP_TRUE;
}
else if (aGpioPinArray[i]>63)
{
aAFnV2_L |= aGpioPinAFValue;
aMask2_L |= aGpioPinAFMask;
aSet2_L=XLLP_TRUE;
}
else if (aGpioPinArray[i]>47)
{
aAFnV1_U |= aGpioPinAFValue;
aMask1_U |= aGpioPinAFMask;
aSet1_U=XLLP_TRUE;
}
else if (aGpioPinArray[i]>31)
{
aAFnV1_L |= aGpioPinAFValue;
aMask1_L |= aGpioPinAFMask;
aSet1_L=XLLP_TRUE;
}
else if (aGpioPinArray[i]>15)
{
aAFnV0_U |= aGpioPinAFValue;
aMask0_U |= aGpioPinAFMask;
aSet0_U=XLLP_TRUE;
}
else
{
aAFnV0_L |= aGpioPinAFValue;
aMask0_L |= aGpioPinAFMask;
aSet0_L=XLLP_TRUE;
}
}
if(aSet3_U)
{
LockID = XllpLock(GAFR3_U);
pGPIO->GAFR3_U=(((pGPIO->GAFR3_U&~aMask3_U)|aAFnV3_U)&~XLLP_GPIO_ALT_RESERVED_BITS);
XllpUnlock(LockID);
}
if(aSet3_L)
{
LockID = XllpLock(GAFR3_L);
pGPIO->GAFR3_L=((pGPIO->GAFR3_L&~aMask3_L)|aAFnV3_L);
XllpUnlock(LockID);
}
if(aSet2_U)
{
LockID = XllpLock(GAFR2_U);
pGPIO->GAFR2_U=((pGPIO->GAFR2_U&~aMask2_U)|aAFnV2_U);
XllpUnlock(LockID);
}
if(aSet2_L)
{
LockID = XllpLock(GAFR2_L);
pGPIO->GAFR2_L=((pGPIO->GAFR2_L&~aMask2_L)|aAFnV2_L);
XllpUnlock(LockID);
}
if(aSet1_U)
{
LockID = XllpLock(GAFR1_U);
pGPIO->GAFR1_U=((pGPIO->GAFR1_U&~aMask1_U)|aAFnV1_U);
XllpUnlock(LockID);
}
if(aSet1_L)
{
LockID = XllpLock(GAFR1_L);
pGPIO->GAFR1_L=((pGPIO->GAFR1_L&~aMask1_L)|aAFnV1_L);
XllpUnlock(LockID);
}
if(aSet0_U)
{
LockID = XllpLock(GAFR0_U);
pGPIO->GAFR0_U=((pGPIO->GAFR0_U&~aMask0_U)|aAFnV0_U);
XllpUnlock(LockID);
}
if(aSet0_L)
{
LockID = XllpLock(GAFR0_L);
pGPIO->GAFR0_L=((pGPIO->GAFR0_L&~aMask0_L)|aAFnV0_L);
XllpUnlock(LockID);
}
}
/*
* aGpioPinArray[]=array of GPIO pins
* aGpioPinArray[0] = size of array
*
* Clear GPIO pin alternate function value
*/
void XllpGpioClearAlternateFn
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
{
XLLP_UINT32_T LockID;
XLLP_UINT32_T aGpioPinAFMask;
XLLP_UINT32_T aSizeArray;
XLLP_UINT32_T aMask0_U, aMask0_L, aMask1_U, aMask1_L;
XLLP_UINT32_T aMask2_U, aMask2_L, aMask3_U, aMask3_L;
XLLP_BOOL_T aSet0_U, aSet0_L, aSet1_U, aSet1_L;
XLLP_BOOL_T aSet2_U, aSet2_L, aSet3_U, aSet3_L;
XLLP_UINT32_T i;
//determine size of array
aSizeArray = aGpioPinArray[0];
aMask0_U=aMask0_L=aMask1_U=aMask1_L=0;
aMask2_U=aMask2_L=aMask3_U=aMask3_L=0;
aSet0_U=aSet0_L=aSet1_U=aSet1_L=XLLP_FALSE;
aSet2_U=aSet2_L=aSet3_U=aSet3_L=XLLP_FALSE;
for(i=1; i<=aSizeArray; i++)
{
aGpioPinAFMask = 0x3u << ((aGpioPinArray[i] & 0xF)*2);
if (aGpioPinArray[i]>111)
{
aMask3_U |= aGpioPinAFMask;
aSet3_U=XLLP_TRUE;
}
else if (aGpioPinArray[i]>95)
{
aMask3_L |= aGpioPinAFMask;
aSet3_L=XLLP_TRUE;
}
else if (aGpioPinArray[i]>79)
{
aMask2_U |= aGpioPinAFMask;
aSet2_U=XLLP_TRUE;
}
else if (aGpioPinArray[i]>63)
{
aMask2_L |= aGpioPinAFMask;
aSet2_L=XLLP_TRUE;
}
else if (aGpioPinArray[i]>47)
{
aMask1_U |= aGpioPinAFMask;
aSet1_U=XLLP_TRUE;
}
else if (aGpioPinArray[i]>31)
{
aMask1_L |= aGpioPinAFMask;
aSet1_L=XLLP_TRUE;
}
else if (aGpioPinArray[i]>15)
{
aMask0_U |= aGpioPinAFMask;
aSet0_U=XLLP_TRUE;
}
else
{
aMask0_L |= aGpioPinAFMask;
aSet0_L=XLLP_TRUE;
}
}
if(aSet3_U)
{
LockID = XllpLock(GAFR3_U);
pGPIO->GAFR3_U=((pGPIO->GAFR3_U&~aMask3_U)&~XLLP_GPIO_ALT_RESERVED_BITS);
XllpUnlock(LockID);
}
if(aSet3_L)
{
LockID = XllpLock(GAFR3_L);
pGPIO->GAFR3_L=(pGPIO->GAFR3_L&~aMask3_L);
XllpUnlock(LockID);
}
if(aSet2_U)
{
LockID = XllpLock(GAFR2_U);
pGPIO->GAFR2_U=(pGPIO->GAFR2_U&~aMask2_U);
XllpUnlock(LockID);
}
if(aSet2_L)
{
LockID = XllpLock(GAFR2_L);
pGPIO->GAFR2_L=(pGPIO->GAFR2_L&~aMask2_L);
XllpUnlock(LockID);
}
if(aSet1_U)
{
LockID = XllpLock(GAFR1_U);
pGPIO->GAFR1_U=(pGPIO->GAFR1_U&~aMask1_U);
XllpUnlock(LockID);
}
if(aSet1_L)
{
LockID = XllpLock(GAFR1_L);
pGPIO->GAFR1_L=(pGPIO->GAFR1_L&~aMask1_L);
XllpUnlock(LockID);
}
if(aSet0_U)
{
LockID = XllpLock(GAFR0_U);
pGPIO->GAFR0_U=(pGPIO->GAFR0_U&~aMask0_U);
XllpUnlock(LockID);
}
if(aSet0_L)
{
LockID = XllpLock(GAFR0_L);
pGPIO->GAFR0_L=(pGPIO->GAFR0_L&~aMask0_L);
XllpUnlock(LockID);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -