查看: 2853|回复: 3

[LPC双核挑战赛] 【lpc54114学习笔记2】gpio组外部中断

[复制链接]
  • TA的每日心情
    无聊
    2021-12-29 19:06
  • 签到天数: 47 天

    [LV.5]常住居民I

    49

    主题

    188

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    1375
    最后登录
    2024-5-13
    发表于 2018-4-20 21:32:28 | 显示全部楼层 |阅读模式
    本帖最后由 day_day 于 2018-4-20 23:51 编辑

    这篇帖子是GPIO组中断,上一章是单个GPIO中断。
    区别可以看用户手册:
    pin_int和gpio_group_int.png

    (一)例程
    GPIO组中断例程
    1. periph_gint
    复制代码
    看完这个名字应该不能怪我半个星期都没发现这是外部中断的例程了吧原谅我真心看不懂gint是什么意思,现在才明白是group interrupt哦。


    例程:
    1. #include "board.h"

    2. /** @defgroup PERIPH_GINT_5411X Group Interrupt example
    3. * @ingroup EXAMPLES_PERIPH_5411X
    4. * @include "periph_gint\readme.txt"
    5. */

    6. /**
    7. * @}
    8. */

    9. /*****************************************************************************
    10. * Private types/enumerations/variables
    11. ****************************************************************************/

    12. #if defined(BOARD_NXP_LPCXPRESSO_54114)
    13. /* GPIO pin for GROUPED GPIO interrupt.
    14.      When both SW1-WAKE and SW2-ISP is pressed the group interrupt is triggered */
    15. #define BUTTON1_PIN         24        /* GPIO pin number for SW1 */
    16. #define BUTTON1_PORT        0        /* GPIO port number for SW1 */

    17. #define BUTTON2_PIN         31        /* GPIO pin number for SW2 */
    18. #define BUTTON2_PORT        0        /* GPIO port number for SW2 */

    19. #else
    20. #error "Grouped GPIO Interrupt not configured for this example"
    21. #endif /* defined(BOARD_NXP_LPCXPRESSO_54102) */

    22. /*****************************************************************************
    23. * Public types/enumerations/variables
    24. ****************************************************************************/

    25. /*****************************************************************************
    26. * Private functions
    27. ****************************************************************************/

    28. /*****************************************************************************
    29. * Public functions
    30. ****************************************************************************/

    31. /**
    32. * @brief        Handle Group GPIO 0 interrupt
    33. * @return        Nothing
    34. */
    35. void GINT0_IRQHandler(void)
    36. {
    37.         Chip_GPIOGP_ClearIntStatus(LPC_GINT, 0);
    38.         Board_LED_Toggle(0);
    39. }

    40. /**
    41. * @brief        Main program body
    42. * @return        Does not return
    43. */
    44. int main(void)
    45. {
    46.         int loop = 1;        /* Used to fix the unreachable statement warning */

    47.         /* Generic Initialization */
    48.         SystemCoreClockUpdate();
    49.         Board_Init();
    50.         Board_LED_Set(0, false);

    51.         /* Initialize GPIO grouped interrupt Block */
    52.         Chip_GPIOGP_Init(LPC_GINT);

    53.         /* Configure pins as GPIO */
    54.         Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON1_PORT, BUTTON1_PIN,
    55.                                                  (IOCON_FUNC0 | IOCON_DIGITAL_EN  | IOCON_GPIO_MODE));
    56.         Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON2_PORT, BUTTON2_PIN,
    57.                                                  (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));

    58.         /* Group GPIO interrupt 0 will be invoked when both SW1-WAKE and SW2-ISP buttons are pressed. */
    59.         Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON1_PORT, BUTTON1_PIN);
    60.         Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON2_PORT, BUTTON2_PIN);

    61.         /* Button 1 Setup for falling edge*/
    62.         Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);
    63.         Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);

    64.         /* Button 2 Setup for falling edge*/
    65.         Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);
    66.         Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);

    67.         /* Trigger interrupt when both buttons are pressed */
    68.         Chip_GPIOGP_SelectAndMode(LPC_GINT, 0);
    69.         Chip_GPIOGP_SelectEdgeMode(LPC_GINT, 0);

    70.         /* Enable Group GPIO interrupt 0 */
    71.         NVIC_EnableIRQ(GINT0_IRQn);

    72.         /* Spin in a loop here.  All the work is done in ISR. */
    73.         while (loop) {
    74.                 /* Sleep until button press */
    75.                 __WFI();
    76.         }
    77.         return 0;
    78. }
    复制代码


    (二)数据手册对应与数据手册第十三章:GPIO组引脚中断
    • pin interrupt input寄存器组:

    pin interrupt input.png
    CTRL:GPIO组中断控制寄存器
    POL:GPIO组优先级寄存器
    END:GPIO组使能寄存器


    • 其中ctrl寄存器:

    ctrl.png
    INT:中断标志位;
    COMS:中断组中断条件;0,or运算,任一中断源产生就产生中断;1,and运算,中断组里面所有中断源产生中断才能中断。中断应该就是体现在标志位置位+调用中断服务函数。
    TRIG:选择边沿中断或者电平中断


    (三)分析
    可以看到,例程中的外部中断配置分三个部分:
    1、引脚初始化:
    1. /* Initialize GPIO grouped interrupt Block */
    2. Chip_GPIOGP_Init(LPC_GINT);

    3. /* Configure pins as GPIO */
    4. Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON1_PORT, BUTTON1_PIN,
    5. (IOCON_FUNC0 | IOCON_DIGITAL_EN | IOCON_GPIO_MODE));
    6. Chip_IOCON_PinMuxSet(LPC_IOCON, BUTTON2_PORT, BUTTON2_PIN,
    7. (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));

    8. /* Group GPIO interrupt 0 will be invoked when both SW1-WAKE and SW2-ISP buttons are pressed. */
    9. Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON1_PORT, BUTTON1_PIN);
    10. Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON2_PORT, BUTTON2_PIN);
    复制代码
    首先初始化GPIO组的中断块;
    然后初始化引脚为GPIO功能;
    最后设置引脚方向。
    可以看到,这里把引脚和GPIO的概念区分了开来。


    2、中断模式设置
    1. /* Button 1 Setup for falling edge*/
    2. Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);
    3. Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON1_PORT, 1UL << BUTTON1_PIN);

    4. /* Button 2 Setup for falling edge*/
    5. Chip_GPIOGP_SelectLowLevel(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);
    6. Chip_GPIOGP_EnableGroupPins(LPC_GINT, 0, BUTTON2_PORT, 1UL << BUTTON2_PIN);

    7. /* Trigger interrupt when both buttons are pressed */
    8. Chip_GPIOGP_SelectAndMode(LPC_GINT, 0);
    9. 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、使能中断
    1. /* Enable Group GPIO interrupt 0 */
    2. NVIC_EnableIRQ(GINT0_IRQn);
    复制代码


    评分

    参与人数 1 +5 收起 理由
    doatello + 5 很给力!

    查看全部评分

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20242
    最后登录
    2024-5-14
    发表于 2018-4-23 09:48:55 | 显示全部楼层
    感谢楼主的资料分享!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-6-16 09:38
  • 签到天数: 589 天

    [LV.9]以坛为家II

    3

    主题

    1039

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2387
    最后登录
    2020-6-16
    发表于 2018-4-23 23:23:08 | 显示全部楼层
    能否共享下项目文件,copy程序无法通过编译呢
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2021-12-29 19:06
  • 签到天数: 47 天

    [LV.5]常住居民I

    49

    主题

    188

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    1375
    最后登录
    2024-5-13
     楼主| 发表于 2018-4-24 18:53:52 | 显示全部楼层
    eric_bestmyself 发表于 2018-4-23 23:23
    能否共享下项目文件,copy程序无法通过编译呢

    这个gpio组中断我没有改写过,是chip函数库里面的原版例程,编译不过可能你用的是另一个fsl函数库。而且这个是一个gpio组中断里面接受几个pin传来的中断,这也是我后来才发现的,如果是单个引脚中断请看我另一章帖子,那个例程是我改过的,如果你还需要的话可以再私聊或者回复。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-14 19:08 , Processed in 0.129168 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表