Re: LPC11u68 + LPCExpresso: GPIO - co dělám špatně?

Pavel Hudecek edizon na seznam.cz
Pondělí Červen 20 04:02:17 CEST 2016


Aha tak problém byl v IOCON_S_MODE(3)

Když se dá 0, tak to funguje. Jak se ale má používat ten filtr?


A pak ještě další problém, tentokrát s přerušením:

Nastavil jsem přerušení od těch pinů:
(IntInd jsou 0-4,
IntNvic jsou PIN_INT0_IRQn až PIN_INT3_IRQn)

/* Configure interrupt channel for the GPIO pin in SysCon block */
    n=KOL1_aIntInd;
    Chip_SYSCTL_SetPinInterrupt(n++, KOL1_aPort, KOL1_aPin);
    Chip_SYSCTL_SetPinInterrupt(n++, KOL1_bPort, KOL1_bPin);
    Chip_SYSCTL_SetPinInterrupt(n++, KOL2_aPort, KOL2_aPin);
    Chip_SYSCTL_SetPinInterrupt(n,   KOL2_bPort, KOL2_bPin);

    /* Configure channel interrupt as edge sensitive and falling edge 
interrupt */
    for(n=KOL1_aIntInd; n<=KOL2_bIntInd; n++) {
        Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH(n));
        Chip_PININT_SetPinModeEdge(LPC_PININT, PININTCH(n));
        Chip_PININT_EnableIntLow  (LPC_PININT, PININTCH(n));
    }

    /* Enable interrupt in the NVIC */
    NVIC_ClearPendingIRQ(KOL1_aIntNvic);
    NVIC_EnableIRQ      (KOL1_aIntNvic);
    NVIC_ClearPendingIRQ(KOL1_bIntNvic);
    NVIC_EnableIRQ      (KOL1_bIntNvic);
    NVIC_ClearPendingIRQ(KOL2_aIntNvic);
    NVIC_EnableIRQ      (KOL2_aIntNvic);
    NVIC_ClearPendingIRQ(KOL2_bIntNvic);
    NVIC_EnableIRQ      (KOL2_bIntNvic);


Obsluha těch přerušení provádí:
Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH(patřičný IntInd));
a bliká s LEDkou.

Obě přerušení od prvního kolečka fungují, od druhého obě ne.
První je na portu 0, piny 2 a 22.
Druhé na portu 2, piny 2 a 5.
U portu 2 je v DS omezení, že jde udělat PININT jen od pinů 0-7, ale to by u 
2 a 5 nemělo vadit, ne?

Díky,
PH

-----Původní zpráva----- 
From: Pavel Hudecek
hraju si tu s LPC11u68 v LPCExpresso. HW (kromě asi upečeného RTC krystalu)
zjevně chodí, ale nedaří se mi číst vstupy:

Provede se tato inicializace:

/* Initialize GPIO */
Chip_GPIO_Init(LPC_GPIO);

/* Enable and setup SysTick Timer at a periodic rate */
SysTick_Config(SystemCoreClock / 1000);

/* Configure GPIO pin as input */
Chip_GPIO_SetPinDIRInput(LPC_GPIO, KOL1_aPort, KOL1_aPin);
Chip_GPIO_SetPinDIRInput(LPC_GPIO, KOL1_bPort, KOL1_bPin);
Chip_GPIO_SetPinDIRInput(LPC_GPIO, KOL2_aPort, KOL2_aPin);
Chip_GPIO_SetPinDIRInput(LPC_GPIO, KOL2_bPort, KOL2_bPin);

Pak chci číst s pomocí:
Chip_GPIO_ReadPortBit(LPC_GPIO, port, pin)

Ale výsledek je pro všechny čtyři stále true, ať je na vstupu 1, nebo 0.

Co dělám špatně?

Předchází tyto definice:

#define KOL1_aPort            0
#define KOL1_bPort            0
#define KOL2_aPort            2
#define KOL2_bPort            2

#define KOL1_aPin            2
#define KOL1_bPin            20
#define KOL2_aPin            2
#define KOL2_bPin            5

/**
* @brief  GPIO port register block structure
*/
typedef struct {                /*!< GPIO_PORT Structure */
    __IO uint8_t B[128][32];    /*!< Offset 0x0000: Byte pin registers ports
0 to n; pins PIOn_0 to PIOn_31 */
    __IO uint32_t W[32][32];    /*!< Offset 0x1000: Word pin registers port
0 to n */
    __IO uint32_t DIR[32];        /*!< Offset 0x2000: Direction registers
port n */
    __IO uint32_t MASK[32];        /*!< Offset 0x2080: Mask register port n
*/
    __IO uint32_t PIN[32];        /*!< Offset 0x2100: Portpin register port
n */
    __IO uint32_t MPIN[32];        /*!< Offset 0x2180: Masked port register
port n */
    __IO uint32_t SET[32];        /*!< Offset 0x2200: Write: Set register
for port n Read: output bits for port n */
    __O  uint32_t CLR[32];        /*!< Offset 0x2280: Clear port n */
    __O  uint32_t NOT[32];        /*!< Offset 0x2300: Toggle port n */
} LPC_GPIO_T;
#define LPC_GPIO_PORT_BASE        0xA0000000
#define LPC_GPIO                  ((LPC_GPIO_T             *)
LPC_GPIO_PORT_BASE) 



Další informace o konferenci Hw-list