LPC1768新手问下关于官方固件库中IO函数中Port形参的含义
#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.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;
}
} Chip_GPIO和 Chip_GPIOINT,你觉得这是一样的吗?
weiwei4 发表于 2017-8-18 17:01
Chip_GPIO和 Chip_GPIOINT,你觉得这是一样的吗?
我知道不一样,就像知道这个 port定义,前面 GPIO0 、GPIO1、GPIO2都有宏定义了,只求点破 GPIO具有中断功能的PORT。
看看GPIO中断那部分。 看手册啊,里面的管脚配置表不是有port0和port2啥的吗?一般PIN都是0~31(数据位),然后分组成port Excellence 发表于 2017-8-18 17:08
GPIO具有中断功能的PORT。
看看GPIO中断那部分。
他那两个函数的形参定义的不同 一个是 uint8 ,一个 是enum,调用同一个实参猜测是巧合,如果不用中断,这个port到底是哪个,他的每个关于io口的函数都有形参port 你说的只是0 和 2,这部分是引脚中断的定义,你去看看Datasheet,是不是其它port没有中断功能 初音之恋 发表于 2017-8-18 17:13
他那两个函数的形参定义的不同 一个是 uint8 ,一个 是enum,调用同一个实参猜测是巧合,如果不用中断, ...
我看后面两个函数,实参不一样啊。 STATIC INLINE void Chip_GPIO_SetPinState(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin, bool setting)
{
if (setting) { /* Set Port */
pGPIO.SET |= 1UL << pin;
}
else { /* Clear Port */
pGPIO.CLR |= 1UL << pin;
}
}
STATIC INLINE bool Chip_GPIO_GetPinState(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin)
{
return (bool) ((pGPIO.PIN >> pin) & 1);
} 建议用个好点编辑器看代码。另外把问题好好描述一下,前后一致,方便别人给你解答。为啥不直接用寄存器操作,简单明了
页:
[1]