📄 hw_gpio.c
字号:
Group = GPIOPinNum / 8 ;
signal = GPIOPinNum % 8;
if (Group == 2)
{
GPIOPortCData = ReadReg32(GPIOGroup[Group]->GPIO_Data);
if (GPIOPortC_Pin5 == GPIOPinNum)
gGPIOPortState[eGPIOPortC_Pin5] = level;
if (gGPIOPortState[eGPIOPortC_Pin5])
GPIOPortCData |= GPIOPortC_Pin5_Bit;
if (level)
{
GPIOPortCData |= (1 << signal);
}
else
{
GPIOPortCData &= ~(1 << signal);
}
WriteReg32(GPIOGroup[Group]->GPIO_Data, GPIOPortCData);
}
else if (Group == 3)
{
GPIOPortDData = ReadReg32(GPIOGroup[Group]->GPIO_Data);
switch (GPIOPinNum)
{
case GPIOPortD_Pin0:
gGPIOPortState[eGPIOPortD_Pin0] = level;
break;
case GPIOPortD_Pin1:
gGPIOPortState[eGPIOPortD_Pin1] = level;
break;
case GPIOPortD_Pin2:
gGPIOPortState[eGPIOPortD_Pin2] = level;
break;
case GPIOPortD_Pin3:
gGPIOPortState[eGPIOPortD_Pin3] = level;
break;
case GPIOPortD_Pin5:
gGPIOPortState[eGPIOPortD_Pin5] = level;
break;
case GPIOPortD_Pin6:
gGPIOPortState[eGPIOPortD_Pin6] = level;
break;
}
for (i = eGPIOPortD_Pin0;i < eGPIOPortF_Pin0;i++)
{
if (gGPIOPortState[i])
GPIOPortDData |= gGPIOErrorPinState[i];
}
if (level)
{
GPIOPortDData |= (1 << signal);
}
else
{
GPIOPortDData &= ~(1 << signal);
}
WriteReg32(GPIOGroup[Group]->GPIO_Data, GPIOPortDData);
}
else if (Group == 5)
{
GPIOPortFData = ReadReg32(GPIOGroup[Group]->GPIO_Data);
if (GPIOPortF_Pin0 == GPIOPinNum)
gGPIOPortState[eGPIOPortF_Pin0] = level;
if (gGPIOPortState[eGPIOPortF_Pin0])
GPIOPortFData |= GPIOPortF_Pin0_Bit;
if (level)
{
GPIOPortFData |= (1 << signal);
}
else
{
GPIOPortFData &= ~(1 << signal);
}
WriteReg32(GPIOGroup[Group]->GPIO_Data, GPIOPortFData);
}
else
{
if (level)
{
SetRegBits32(GPIOGroup[Group]->GPIO_Data, (1 << signal));
}
else
{
ClrRegBits32(GPIOGroup[Group]->GPIO_Data, (1 << signal));
}
}
}
/**************************************************************************
* 函数描述: 得到GPIO特定pin的电平
* 入口参数: GPIOPinNum -- GPIO pin编号
* 出口参数: 无
* 返回值: 1 -- 高电平
* 0 -- 低电平
***************************************************************************/
UINT8 GPIO_GetPinLevel(eGPIOPinNum_t GPIOPinNum)
{
volatile UINT8 Group;
volatile UINT8 signal;
volatile UINT32 temp;
Group = GPIOPinNum / 8 ;
signal = GPIOPinNum % 8;
temp = ReadReg32(GPIOGroup[Group]->GPIO_Data);
return ((temp & (0x1 << signal)) >> signal);
}
/**************************************************************************
* 函数描述: 设置GPIO特定pin的方向
* 入口参数: GPIOPinNum -- GPIO pin编号
* direction -- 输入输出方向
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void GPIO_SetPinDirection(eGPIOPinNum_t GPIOPinNum, eGPIOPinDirection_t direction)
{
volatile UINT8 Group;
volatile UINT8 signal;
Group = GPIOPinNum / 8 ;
signal = GPIOPinNum % 8;
if (direction)
{
SetRegBits32(GPIOGroup[Group]->GPIO_Direction, (1 << signal));
}
else
{
ClrRegBits32(GPIOGroup[Group]->GPIO_Direction, (1 << signal));
}
}
/**************************************************************************
* 函数描述: 得到GPIO特定pin的方向
* 入口参数: GPIOPinNum -- GPIO pin编号
* 出口参数: 无
* 返回值: 1 -- 输出方向
* 0 -- 输入方向
***************************************************************************/
UINT8 GPIO_GetPinDirection(eGPIOPinNum_t GPIOPinNum)
{
volatile UINT8 Group;
volatile UINT8 signal;
volatile UINT32 temp;
Group = GPIOPinNum / 8 ;
signal = GPIOPinNum % 8;
temp = ReadReg32(GPIOGroup[Group]->GPIO_Direction);
return ((temp & (0x1 << signal)) >> signal);
}
/**************************************************************************
* 函数描述: 使能特定GPIO pin中断
* 入口参数: GPIOPinNum -- GPIO pin编号
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void GPIO_EnableIntr(eGPIOPinNum_t GPIOPinNum)
{
volatile UINT8 Group;
volatile UINT8 signal;
Group = GPIOPinNum / 8 ;
signal = GPIOPinNum % 8;
SetRegBits32(GPIOGroup[Group]->GPIO_IntMask, (1 << signal));
}
/**************************************************************************
* 函数描述: 禁止特定GPIO pin中断
* 入口参数: GPIOPinNum -- GPIO pin编号
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void GPIO_DisableIntr(eGPIOPinNum_t GPIOPinNum)
{
volatile UINT8 Group;
volatile UINT8 signal;
Group = GPIOPinNum / 8 ;
signal = GPIOPinNum % 8;
ClrRegBits32(GPIOGroup[Group]->GPIO_IntMask, (1 << signal));
}
/**************************************************************************
* 函数描述: 设置特定GPIO pin中断类型
* 入口参数: GPIOPinNum -- GPIO pin编号
* type -- 中断类型
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void GPIO_SetIntrType(eGPIOPinNum_t GPIOPinNum, GPIOIntrType_c type)
{
volatile UINT8 Group;
volatile UINT8 signal;
Group = GPIOPinNum / 8 ;
signal = GPIOPinNum % 8;
switch (type)
{
case IntrTypeRisingEdge:
ClrRegBits32(GPIOGroup[Group]->GPIO_IntSense, 0x1 << signal); // Edge on corresponding pin is detected.
ClrRegBits32(GPIOGroup[Group]->GPIO_IntBothEdge, 0x1 << signal); // Single edge
SetRegBits32(GPIOGroup[Group]->GPIO_IntEvent, 0x1 << signal); // Rising edges or high levels on corresponding pin trigger interrupts.
break;
case IntrTypeFallingEdge:
ClrRegBits32(GPIOGroup[Group]->GPIO_IntSense, 0x1 << signal); // Edge on corresponding pin is detected.
ClrRegBits32(GPIOGroup[Group]->GPIO_IntBothEdge, 0x1 << signal); // Single edge
ClrRegBits32(GPIOGroup[Group]->GPIO_IntEvent, 0x1 << signal); // Falling edges or low levels on corresponding pin trigger interrupts.
break;
case IntrTypeHighLevel:
SetRegBits32(GPIOGroup[Group]->GPIO_IntSense, 0x1 << signal); // Level on corresponding pin is detected.
SetRegBits32(GPIOGroup[Group]->GPIO_IntEvent, 0x1 << signal); // Rising edges or high levels on corresponding pin trigger interrupts.
break;
case IntrTypeLowLevel:
SetRegBits32(GPIOGroup[Group]->GPIO_IntSense, 0x1 << signal); // Level on corresponding pin is detected.
ClrRegBits32(GPIOGroup[Group]->GPIO_IntEvent, 0x1 << signal); // Falling edges or low levels on corresponding pin trigger interrupts.
break;
case IntrTypeBothEdge:
ClrRegBits32(GPIOGroup[Group]->GPIO_IntSense, 0x1 << signal); // Edge on corresponding pin is detected.
SetRegBits32(GPIOGroup[Group]->GPIO_IntBothEdge, 0x1 << signal); // Both edges on corresponding pin trigger an interrupt
break;
default:
break;
}
}
/**************************************************************************
* 函数描述: 得到当前GPIO中断由哪个pin产生
* 入口参数: 无
* 出口参数: 无
* 返回值: GPIOPinNum -- GPIO pin编号
***************************************************************************/
UINT32 GPIO_GetIntrState(void)
{
volatile UINT32 GPIOPinBit;
volatile UINT32 GPIOPinBitEx;
volatile UINT32 GPIOPinNum;
UINT8 i = 0;
UINT8 j = 0;
GPIOPinBit = ReadReg32(GPIOCommonReg.GPIO_ISR);
GPIOPinBitEx = ReadReg32(GPIOCommonRegEx.GPIO_ISR);
if (GPIOPinBit > 0)
{
while (GPIOPinBit > 0x80)
{
GPIOPinBit = GPIOPinBit >> 8;
i++;
}
while (GPIOPinBit > 0)
{
GPIOPinBit = GPIOPinBit >> 1;
j++;
}
GPIOPinNum = i * 8 + (j - 1); // GPIOPinNum 从 0 开始计数
return GPIOPinNum;
}
else if (GPIOPinBitEx > 0)
{
while (GPIOPinBitEx > 0x80)
{
GPIOPinBitEx = GPIOPinBitEx >> 8;
i++;
}
while (GPIOPinBitEx > 0)
{
GPIOPinBitEx = GPIOPinBitEx >> 1;
j++;
}
GPIOPinNum = i * 8 + (j - 1) + GPIOPortE_Pin0 ; // GPIOPinNum 从 GPIOPortE_Pin0 开始计数
return GPIOPinNum;
}
else
{
return 0;
}
}
/**************************************************************************
* 函数描述: 清除特定GPIO pin中断标志
* 入口参数: GPIOPinNum -- GPIO pin编号
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void GPIO_ClearIntr(eGPIOPinNum_t GPIOPinNum)
{
volatile UINT8 Group;
volatile UINT8 signal;
Group = GPIOPinNum / 8 ;
signal = GPIOPinNum % 8;
SetRegBits32(GPIOGroup[Group]->GPIO_IntClear, 0x1 << signal);
}
/**************************************************************************
* 函数描述: 特定GPIO pin内部上下拉控制
* 入口参数: GPIOPinNum -- GPIO pin编号
* GPIOPullUpDown -- 上拉或下拉电阻或内部不拉电阻
* 出口参数: 无
* 返回值: 无
* 说明: GPIO E/F口不可配置内部上下拉电阻
***************************************************************************/
void GPIO_PullUpDown(eGPIOPinNum_t GPIOPinNum, eGPIOPullType_t GPIOPullUpDown)
{
if (GPIOPinNum > GPIOPortD_Pin7)
return;
if (GPIOPullUpDown == GPIOPort_NoPull)
{
SetRegBits32(GPIOPullupReg, 1 << GPIOPinNum);
}
else
{
ClrRegBits32(GPIOPullupReg, 1 << GPIOPinNum);
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -