This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-MSPM0L1306:关于 GPIO 中断

Guru**** 2445440 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1279871/lp-mspm0l1306-about-gpio-interrupts

器件型号:LP-MSPM0L1306

当检测到一个被设定为 GPIO 的输入引脚时、如果进行了中断设置、一个名为"Group1_IRQHandler"的功能程序将被执行。
如果我想为 PA14和 PA18指定不同的中断目标(Group1_IRQHandler 除外)、我应该使用哪种设置、我应该编写哪种代码?

具体内容为
-如果 PA14是输入,执行"Group1_IRQHandler"
-如果 PA18是输入,我想设置和执行一个与"Group1_IRQHandler"不同的中断目标的程序。
最后、我想将中断目标程序分离为 PA14和 PA18。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Ryota、

    我们将所有 GPIO、COMP 和 TRING 中断组合到组1中:

    因此、您需要按照以下步骤来 分隔 PA14或 PA18 GPIO 中断:

    步骤1:检查是否从 GPIO (组 IIDX)中断源

    第2步:检查 GPIO IIDX

    示例:

    void GROUP1_IRQHandler(void)
    {
        /*
         * Get the pending interrupt for the GPIOA port and store for
         * comparisons later
         */
        uint32_t gpioA = DL_GPIO_getEnabledInterruptStatus(GPIOA,
            GPIO_SWITCHES_USER_SWITCH_1_PIN | GPIO_SWITCHES_USER_SWITCH_3_PIN);
    
        /*
         * Bitwise AND the pending interrupt with the pin you want to check,
         * then check if it is equal to the pins. Clear the interrupt status.
         */
        if ((gpioA & GPIO_SWITCHES_USER_SWITCH_1_PIN) ==
            GPIO_SWITCHES_USER_SWITCH_1_PIN) {
            DL_GPIO_togglePins(
                GPIO_LEDS_USER_LED_1_PORT, GPIO_LEDS_USER_LED_1_PIN);
            DL_GPIO_clearInterruptStatus(GPIOA, GPIO_SWITCHES_USER_SWITCH_1_PIN);
        }
    
        if ((gpioA & GPIO_SWITCHES_USER_SWITCH_3_PIN) ==
            GPIO_SWITCHES_USER_SWITCH_3_PIN) {
            DL_GPIO_togglePins(
                GPIO_LEDS_USER_LED_3_PORT, GPIO_LEDS_USER_LED_3_PIN);
            DL_GPIO_clearInterruptStatus(GPIOA, GPIO_SWITCHES_USER_SWITCH_3_PIN);
        }
    
        /* Repeat with GPIOB Port */
        uint32_t gpioB = DL_GPIO_getEnabledInterruptStatus(
            GPIOB, GPIO_SWITCHES_USER_SWITCH_2_PIN);
    
        if ((gpioB & GPIO_SWITCHES_USER_SWITCH_2_PIN) ==
            GPIO_SWITCHES_USER_SWITCH_2_PIN) {
            DL_GPIO_togglePins(
                GPIO_LEDS_USER_LED_2_PORT, GPIO_LEDS_USER_LED_2_PIN);
            DL_GPIO_clearInterruptStatus(GPIOB, GPIO_SWITCHES_USER_SWITCH_2_PIN);
        }
    }

    在本示例中、我们只启用两个 GPIO 中断、因此我们有时不会运行步骤1。

    您可以在我们的 SDK 中找到以下示例代码:

    谢谢!

    此致

    约翰逊

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它工作得很好。
    谢谢你。

    但是,由于我不是完全理解该计划的内容,我想请您具体解释以下部分。

    if ((gpioA & GPIO_SWITCHES_USER_SWITCH_1_PIN) ==
    GPIO_SWITCHES_USER_SWITCH_1_PIN)

    我不太明白这部分。

    为什么在检测到输入信号时
    (gpioA 和 GPIO_switch_user_switch_1_PIN)和(GPIO_switch_user_switch_1_PIN)相等?
    ​​系统中正在发生什么类型的移动和值变化? 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Ryota、

    否、GPIOA 应运行读取 GPIO 状态代码、 GPIO_switch_user_switch_1_PIN 应具有预定义。

    您可以尝试查看低级代码和 RTM 以了解此逻辑。

    谢谢!

    此致

    约翰逊

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该评论非常清楚:

    /*
        *按位和待处理的中断与您想要检查的引脚,
        *然后检查它是否等于引脚数。 清除中断状态。
        */

    gpiona 是可能导致中断的所有引脚的组合、因此您需要检查每个单独的位。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果在理解上有什么不同、请告诉我。
    例如
    GPIO PA0至 PA7存在
    当逐位监控此情况时、
    0位:PA0、1位:PA1、~7位:PA7
    GPIO_SWITCHES_USER_SWITCH_0_PIN = PA0GPIO_SWITCHS_USER_SWITCH_1_PIN =
    如果 GPIO_SWITCHES_USER_SWITCH_1_PIN = PA1、
    假设 PA0是输入、并且将下面代码的内容替换为位(gpioA 获取 GPIO 的挂起中断)
    ・、如果((gpioA 和 GPIO_SWITCHES_USER_SWITCH_1_PIN)
    == GPIO_SWITCHES_USER_SWITCH_1_PIN)
    →00000001和00000001 = 00000001
    →执行此操作是因为它为真。
    之后、如果 PA1被输入、而 PA0继续检测输入、(假定 DL_GPIO_clearInterruptStatus (GPIOA、GPIO_switches_user_switch_0_PIN)在 if 语句中执行)
    →00000010 & 00000001 = 00000001
    →此为假、将不会执行。
    我的理解是、这就是它的工作方式、这是正确的吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Ryota、

    是的、正确。

    谢谢!

    此致

    约翰逊