⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_gpio.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -