在线时间103 小时
UID3338547
注册时间2017-1-28
NXP金币73
TA的每日心情 | 无聊 2021-12-29 19:06 |
---|
签到天数: 47 天 [LV.5]常住居民I
金牌会员
- 积分
- 1375
- 最后登录
- 2024-5-13
|
本帖最后由 day_day 于 2018-4-20 23:51 编辑
这篇帖子是GPIO组中断,上一章是单个GPIO中断。
区别可以看用户手册:
(一)例程
GPIO组中断例程
看完这个名字应该不能怪我半个星期都没发现这是外部中断的例程了吧原谅我真心看不懂gint是什么意思,现在才明白是group interrupt哦。
例程:
- #include "board.h"
- /** @defgroup PERIPH_GINT_5411X Group Interrupt example
- * @ingroup EXAMPLES_PERIPH_5411X
- * @include "periph_gint\readme.txt"
- */
- /**
- * @}
- */
- /*****************************************************************************
- * Private types/enumerations/variables
- ****************************************************************************/
- #if defined(BOARD_NXP_LPCXPRESSO_54114)
- /* GPIO pin for GROUPED GPIO interrupt.
- When both SW1-WAKE and SW2-ISP is pressed the group interrupt is triggered */
- #define BUTTON1_PIN 24 /* GPIO pin number for SW1 */
- #define BUTTON1_PORT 0 /* GPIO port number for SW1 */
- #define BUTTON2_PIN 31 /* GPIO pin number for SW2 */
- #define BUTTON2_PORT 0 /* GPIO port number for SW2 */
- #else
- #error "Grouped GPIO Interrupt not configured for this example"
- #endif /* defined(BOARD_NXP_LPCXPRESSO_54102) */
- /*****************************************************************************
- * Public types/enumerations/variables
- ****************************************************************************/
- /*****************************************************************************
- * Private functions
- ****************************************************************************/
- /*****************************************************************************
- * Public functions
- ****************************************************************************/
- /**
- * @brief Handle Group GPIO 0 interrupt
- * @return Nothing
- */
- void GINT0_IRQHandler(void)
- {
- Chip_GPIOGP_ClearIntStatus(LPC_GINT, 0);
- Board_LED_Toggle(0);
- }
- /**
- * @brief Main program body
- * @return Does not return
- */
- int main(void)
- {
- int loop = 1; /* Used to fix the unreachable statement warning */
- /* Generic Initialization */
- SystemCoreClockUpdate();
- Board_Init();
- Board_LED_Set(0, false);
- /* Initialize GPIO grouped interrupt Block */
- Chip_GPIOGP_Init(LPC_GINT);
- /* Configure pins as GPIO */
- Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON1_PORT, BUTTON1_PIN,
- (IOCON_FUNC0 | IOCON_DIGITAL_EN | IOCON_GPIO_MODE));
- Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON2_PORT, BUTTON2_PIN,
- (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
- /* Group GPIO interrupt 0 will be invoked when both SW1-WAKE and SW2-ISP buttons are pressed. */
- Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON1_PORT, BUTTON1_PIN);
- Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON2_PORT, BUTTON2_PIN);
- /* Button 1 Setup for falling edge*/
- Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);
- Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);
- /* Button 2 Setup for falling edge*/
- Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);
- Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);
- /* Trigger interrupt when both buttons are pressed */
- Chip_GPIOGP_SelectAndMode(LPC_GINT, 0);
- Chip_GPIOGP_SelectEdgeMode(LPC_GINT, 0);
- /* Enable Group GPIO interrupt 0 */
- NVIC_EnableIRQ(GINT0_IRQn);
- /* Spin in a loop here. All the work is done in ISR. */
- while (loop) {
- /* Sleep until button press */
- __WFI();
- }
- return 0;
- }
复制代码
(二)数据手册对应与数据手册第十三章:GPIO组引脚中断
CTRL:GPIO组中断控制寄存器
POL:GPIO组优先级寄存器
END:GPIO组使能寄存器
INT:中断标志位;
COMS:中断组中断条件;0,or运算,任一中断源产生就产生中断;1,and运算,中断组里面所有中断源产生中断才能中断。中断应该就是体现在标志位置位+调用中断服务函数。
TRIG:选择边沿中断或者电平中断
(三)分析
可以看到,例程中的外部中断配置分三个部分:
1、引脚初始化:
- /* Initialize GPIO grouped interrupt Block */
- Chip_GPIOGP_Init(LPC_GINT);
- /* Configure pins as GPIO */
- Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON1_PORT, BUTTON1_PIN,
- (IOCON_FUNC0 | IOCON_DIGITAL_EN | IOCON_GPIO_MODE));
- Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON2_PORT, BUTTON2_PIN,
- (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
- /* Group GPIO interrupt 0 will be invoked when both SW1-WAKE and SW2-ISP buttons are pressed. */
- Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON1_PORT, BUTTON1_PIN);
- Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON2_PORT, BUTTON2_PIN);
复制代码 首先初始化GPIO组的中断块;
然后初始化引脚为GPIO功能;
最后设置引脚方向。
可以看到,这里把引脚和GPIO的概念区分了开来。
2、中断模式设置
- /* Button 1 Setup for falling edge*/
- Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);
- Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);
- /* Button 2 Setup for falling edge*/
- Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);
- Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);
- /* Trigger interrupt when both buttons are pressed */
- Chip_GPIOGP_SelectAndMode(LPC_GINT, 0);
- Chip_GPIOGP_SelectEdgeMode(LPC_GINT, 0);
复制代码 设置下降沿触发、势能引脚组。
Chip_GPIOGP_SelectLowLevel:设置POL寄存器
Chip_GPIOGP_EnableGroupPins:设置END寄存器
Chip_GPIOGP_SelectAndMode:清除DTRL寄存器的INT位、置位DTRL寄存器的COMS位
Chip_GPIOGP_SelectEdgeMode:清除DTRL寄存器的INT位、TRIG位
3、使能中断
- /* Enable Group GPIO interrupt 0 */
- NVIC_EnableIRQ(GINT0_IRQn);
复制代码 。
|
评分
-
查看全部评分
|