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.

[参考译文] MSP430FR5994:端口 P8相邻引脚上的奇怪中断行为

Guru**** 2390755 points
Other Parts Discussed in Thread: MSP430FR5994, SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1047128/msp430fr5994-strange-interrupt-behavior-on-port-p8-adjacent-pins

器件型号:MSP430FR5994
Thread 中讨论的其他器件: SYSBIOS

您好!

我在 msp430fr5994的端口 P8上遇到一个奇怪的行为。

我已将 GPIO P8.2和 GPIO P8.1配置为中断源。 我在引脚上连接了两个带有外部上拉电阻器的按钮。

当我按下连接到 P8.2的按钮时、一切工作正常。

当我按下连接到 P8.1的按钮时、首先触发与 P8.1关联的中断、然后触发与 P8.2关联的中断(我调试了两个事件的精确振铃)。

我使用按下 P.8.2时应切换的绿色 LED 指示灯和 按下 P8.1时应切换的黄色 LED 指示灯

我看到、每次按下连接到 P8.2的按钮时、只有绿色 LED 会改变状态、但当我按下连接到 P8.1的按钮时、黄色 LED 会改变状态、随后是绿色 LED。

我正在使用 TI-RTOS 2.2.0、我刚刚创建了与两个回调相连的 Tow HWI、这两个回调会将事件发布到任务。

在 main.c 中

   GPIO_setCallback (button_power、gpioButtonPowerInt);// P8.2
   GPIO_setCallback (button_sample、gpioButtonSampleInt);// P8.1

   /*启用按钮中断*/
   GPIO_enableInt (button_power);
   GPIO_enableInt (button_sample);

   /*启动 BIOS */
   BIOS_start();

在 buttons.c (中断回调)中

void gpioButtonPowerInt (无符号 int 索引)

   if (index=button_power){
      GPIO_clearInt (button_power);
      EVENT_POST (btnEvent、Event_ButtonPower);
   }



void gpioButtonSampleInt (无符号 int 索引)

   if (index=button_sample){
      GPIO_clearInt (button_sample);
      EVENT_POST (btnEvent、Event_ButtonSample);
   }

在 LED.c (任务)中

void LED (void){
   UINT evt;
   int 键;
   while (1){
      evt = Event_pend (btnEvent、0、Event_ButtonPower |
            EVENT_ButtonSample | Event_Button0 | Event_Button1、BIOS_Wait_Forever);
      switch (evt){
      案例 Event_ButtonPower:
         GPIO_disableInt (button_power);
         GPIO_TOGGLE (LED_GREEN);
         Task_sleep (600);//去抖
         GPIO_enableInt (button_power);
      中断;
      案例 Event_ButtonSample:
         GPIO_disableInt (button_sample);
         GPIO_TOGGLE (LED_Yellow);
         Task_sleep (600);//去抖
         GPIO_enableInt (button_sample);
      中断;
      }
   }

在我的.cfg 中

var hwi0Params = new halHwi.Params();
hwi0Params.arg = 8;
hwi0Params.instance.name ="hwi0H";
hwi0Params.maskSetting = XDC.MODULE ("ti.sysbios.interfaces.IHwi").MaskingOption_ALL;
program.global.hwi0H = halHwi.create (19、"&GPIO_hwiIntFxn"、hwi0Params);

var hw1Params = new halHwi.Params();
hw1Params.arg = 5;
hw1Params.instance.name ="hw1H";
hw1Params.maskSetting = xdc.module ("ti.sysbios.interfaces.IHwi").MaskingOption_ALL;
program.global.hw1H = halHwi.create (27、"&GPIO_hwiIntFxn"、hw1Params);


var event0Params = new Event.Params();
event0Params.instance.name ="btnEvent";
program.global.btnEvent = Event.create (event0Params);

VAR task1Params = new Task.Params();
task1Params.instance.name ="ledTask";
program.global.ledTask = Task.create ("&LEDs"、task1Params);

halHwi.dotherAutoNestingSupport = false;

网址为 Board.h

#define LED_GREEN                    MSP_EXP430FR5994_LED_G
#define LED_YELLOW                 MSP_EXP430FR5994_LED_Y

#define button_power                 MSP_EXP430FR5994_button_P
#define button_sample              MSP_EXP430FR5994_button_S

这些已添加到 MSP_EXP430FR5994.h 中的枚举中

typedef enum MSP_EXP430FR5994_GPIOName{
   MSP_EXP430FR5994_S1 = 0、
   MSP_EXP430FR5994_S2、

   MSP_EXP430FR5994_button_P、
   MSP_EXP430FR5994_button_S、

   MSP_EXP430FR5994_LED1、
   MSP_EXP430FR5994_LED2、

   MSP_EXP430FR5994_LED_G、
   MSP_EXP430FR5994_LED_Y、

   MSP_EXP430FR5994_GPIOCOUNT
}MSP_EXP430FR5994_GPIOName;

并已在 MSP_EXP430FR5994.c 中触发

GPIO_PinConfig gpioPinConfigs[]={
   /*输入引脚*/
   /* MSP_EXP430FR5994_S1 *
   GPIOMSP430_P5_6 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING、
   /* MSP_EXP430FR5994_S2 *
   GPIOMSP430_P5_5 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING、
   
   /*添加的按钮*/
   GPIOMSP430_P8_2 | GPIO_CFG_IN_NOPULL | GPIO_CFG_IN_INT_FALLING、
   GPIOMSP430_P8_1 | GPIO_CFG_IN_NOPULL | GPIO_CFG_IN_INT_FALLING、
   //
   /*输出引脚*/
   /* MSP_EXP430FR5994_LED1 *
   GPIOMSP430_P1_0 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
   /* MSP_EXP430FR5994_LED2 *
   GPIOMSP430_P1_1 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
   
   /*添加了 LED */
   GPIOMSP430_P4_2 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
   GPIOMSP430_P4_1 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、

增编

我发现、通过按两次连接到 P8.1的按钮(双击)、可以防止绿色 LED 指示灯通勤。

我的代码中的某个位置可能是一个愚蠢的错误? 有人可以提供帮助吗?

谢谢

Damiano

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

    我对 TI-RTOS 不是很了解、但作为常规练习、我建议您插入

    GPIO_clearInt (button_mumble);

    进行任何操作  

    GPIO_enableInt (button_mumble);

    这可能会也可能不会解决您的问题、但可能会避免一些幻想。

    1) 1)不同按钮以不同方式抖动。

    2) 2)按钮在释放和按下时弹出。

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

    您好、Bruce、

    感谢您的帮助。

    尝试在 GPIO_enableInt 之前将 GPIO_clearInt 从 ISR 移至 te Task、但遗憾的是、这没有解决问题。

    忘记提到这种行为并非随机的、它总是发生。 在我发布的示例中、第二个中断似乎恰好在 Task_sleep 周期结束后、任务恢复。

    我将 CCS v6.2与 TI v15.12.7LTS 编译器搭配使用。 我知道它有点旧、但我在某个地方看到该新闻稿在为 MSP430编译 TI-RTOS 时遇到了问题。

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

    您是否相当确定这不是电气系统? 如果您有示波器、请尝试观察按钮导线。 (这也会让您了解预期的反弹量。) 如果不是:实际上是否调用了"其他"回调?

    外部上拉电阻有多强? 您也可以尝试使用内部上拉电阻(GPIO_CFG_IN_pu)。

    规范(基于中断)去抖动如下所示:

    1) 1)禁用中断。  

    2) 2)等待适当的时间段。

    3)检查引脚信号电平(假设到现在已稳定)并采取措施。

    4) 4)清除中断指示灯。

    5) 5)启用中断。

    项目(1)应在 ISR/回调中完成。 其余可在闲暇时间完成。