Re: LPC11u68 + LPCExpresso: GPIO - co dělám špatně?
Pavel Hudecek
edizon na seznam.cz
Pondělí Červen 20 12:19:42 CEST 2016
Tak i filtr už vyřešen.
Aby se dal použít, musí se nejen nastavit v pinmuxu, ale i pro něj nastavit
předdělič, protože v tom pinmuxu se nevybírá dělící poměr, ale jedna z
nastavených možností a ta se tedy musí před tím nastavit:
Chip_Clock_SetIOCONFiltClockDiv(0, 64);
ale ty přerušení od portu 2 stále nic...
Nevíte někdo?
Díky,
PH
-----Původní zpráva-----
From: Pavel Hudecek
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