LPC17xx固件库中 STATIC INLINE void Chip_GPIO_SetPinDIRInput(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin) { pGPIO[port].DIR &= ~(1UL << pin); } 形参port代表的是什么?是GPIO0 GPIO1 GPIO2 么?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

LPC17xx固件库中 STATIC INLINE void Chip_GPIO_SetPinDIRInput(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin) { pGPIO[port].DIR &= ~(1UL << pin); } 形参port代表的是什么?是GPIO0 GPIO1 GPIO2 么?

617 Views
余骁鑫
Contributor I

#define LPC_GPIO0_BASE            0x2009C000
#define LPC_GPIO1_BASE            0x2009C020
#define LPC_GPIO2_BASE            0x2009C040
#define LPC_GPIO3_BASE            0x20098060
#define LPC_GPIO4_BASE            0x2009C080

typedef enum {
        GPIOINT_PORT0,             /*!< GPIO PORT 0 */
        GPIOINT_PORT2 = 2          /*!< GPIO PORT 2 */
}LPC_GPIOINT_PORT_T;

#define LPC_GPIO                  ((LPC_GPIO_T             *) LPC_GPIO0_BASE)
#define LPC_GPIOINT               ((LPC_GPIOINT_T          *) LPC_GPIOINT_BASE)

#define GPIO_INTERRUPT_PIN     17        /* GPIO pin number mapped to interrupt */
#define GPIO_INTERRUPT_PORT    GPIOINT_PORT0        /* GPIO port number mapped to interrupt */

int main(void)
{
        /* Generic Initialization */
        SystemCoreClockUpdate();

        /* Board_Init calls Chip_GPIO_Init and enables GPIO clock if needed,
           Chip_GPIO_Init is not called again */
        Board_Init();
        Board_LED_Set(0, false);

        /* Configure GPIO interrupt pin as input */
        Chip_GPIO_SetPinDIRInput(LPC_GPIO, GPIO_INTERRUPT_PORT, GPIO_INTERRUPT_PIN);

        /* Configure the GPIO interrupt */
        Chip_GPIOINT_SetIntFalling(LPC_GPIOINT, GPIO_INTERRUPT_PORT, 1 << GPIO_INTERRUPT_PIN);

        /* Enable interrupt in the NVIC */
        NVIC_ClearPendingIRQ(GPIO_INTERRUPT_NVIC_NAME);
        NVIC_EnableIRQ(GPIO_INTERRUPT_NVIC_NAME);

        /* Wait for interrupts - LED will toggle on each wakeup event */
        while (1) {
                __WFI();
        }

        return 0;
}

不太明白这个函数中 形参 port的具体定义,一开始以为是P0~P4,但是看到enum里面只有 0和2,,瞬间傻了,不知道这个Port是干嘛的,而且这个Port形参每个IO口程序里面都有
STATIC INLINE void Chip_GPIO_SetPinDIRInput(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin)
{
        pGPIO[port].DIR &= ~(1UL << pin);
}

STATIC INLINE void Chip_GPIOINT_SetIntFalling(LPC_GPIOINT_T *pGPIOINT, LPC_GPIOINT_PORT_T port, uint32_t pins)
{
        if (port == GPIOINT_PORT0) {
                pGPIOINT->IO0.ENF = pins;
        } else {
                pGPIOINT->IO2.ENF = pins;
        }
}

0 Kudos
1 Reply

463 Views
kerryzhou
NXP TechSupport
NXP TechSupport

楼主你好!

   你的理解其实没错,port就是PIN的port,比如PIO0_17,那么它的port就是0,。

/**
 * @brief    Set GPIO direction for a single GPIO pin to an input
 * @param    pGPIO    : The base of GPIO peripheral on the chip
 * @param    port    : GPIO Port number where pin is located
 * @param    pin        : GPIO pin to set direction on as input
 * @return    Nothing
 */

STATIC INLINE void Chip_GPIO_SetPinDIRInput(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin)
{
    pGPIO[port].DIR &= ~(1UL << pin);
}

还是以PIO0_17为例的调用:

Chip_GPIO_SetPinDIRInput(LPC_GPIO, 0 ,17);

你现在不明白的是这个定义

typedef enum {
    GPIOINT_PORT0,             /*!< GPIO PORT 0 */
    GPIOINT_PORT2 = 2          /*!< GPIO PORT 2 */
}LPC_GPIOINT_PORT_T;

但是,你没有注意这个定义是在哪里?gpioint_17xx_40xx.h.

这个是gpio中断,对于GPIO中断,你可以在user manual的GPIO章节也能看到相关内容。

pastedImage_1.png

只有 port0和port2支持中断,那么在中断的头文件中还有必要定义其他的port口吗?

我想这样解释你应该清楚多了。

希望能帮到你,如果还有问题,欢迎继续交流!


Have a great day,
Kerry

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos