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.

[参考译文] CCS/MSP430FR5994:执行中断例程的速度非常慢

Guru**** 2577385 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/899287/ccs-msp430fr5994-interrupt-routine-performed-very-slowly

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

大家好

我刚刚开始使用 MSP430FR5994 Launchpad。

我也是 C 编程的新手、但是、我遵循了一些代码示例、并成功运行了一些代码、打开和关闭或闪烁一些 LED 等等。

此外、我还配置了其中一个 GPIO 引脚、以使用下面显示的代码触发中断、从而打开和关闭其中一个 LED。

但是、我意识到中断服务例程与 GPIO 触发一起执行的速度非常慢。 打开和关闭按钮后、LED 需要1秒以上的时间才能打开和关闭。

这非常不方便。 CPU 延迟为 I/O 外设提供服务。

因此,我决定将这个问题提交论坛,看看其他人以前是否遇到过类似的情况。

有人可以为我提供一些帮助吗? 可能是代码中的一个配置我丢失了...!

#include

void main (void)

WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
PM5CTL0 &=~LOCKLPM5;//禁用 GPIO 上电默认高阻抗模式以激活先前配置的端口设置

P1DIR |= 0x01;//将 P1.0设置为输出方向
P1IE |= 0x10;// P1.4中断被启用
P1IES |= 0x10;// P1.4高/低边沿
P1IFG &=~0x10;// P1.4 IFG 被清零
_BIS_SR (LPM4_BITS + GIE);//输入 LPM4并进行中断

//端口1中断服务例程
#pragma vector=Port1_vector
_interrupt void Port_1 (void)

P1OUT ^= 0x01;// P1.0 =切换
P1IFG &=~0x10;// P1.4 IFG 被清零

感谢大家花时间阅读这篇文章、

LONI

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

    是否确定没有看到开关抖动? 您可能会在每次开关按下时获得多个中断。

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

    也许可以在 P1.4上启用内部上拉电阻作为设置代码的一部分?  否则、引脚1.4保持高阻抗输入。

    其逻辑电平将主要为低电平、但会不时跳转到 HI、然后再返回低电平、从而触发中断。   低/高/低转换可能来自您手指在按钮开关上引入的杂散信号。

    但是、我不熟悉5994 Launchpad 按钮开关布局。

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

    您好 Keith。

    感谢你的答复。

    我刚才取出了开关。

    然后、我从板引脚1 J1获得3.3V 电源、并使用一根导线触碰 GPIO (配置为输入)一次。

    但情况是一样的。

    我不确定 CPU 是否以其最大速度运行?

    我是否需要对代码进行任何配置以提高时钟速度?

    对此不确定。

    Yljon

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

    您使任何反弹问题变得更糟。

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

    您好 Otto.c

    感谢你的答复。

    我刚刚更改了代码并启用了触发中断的 GPIO 的电阻器、此外还将其配置为上拉电阻器。

    请参阅以下代码。 2条红线是包含的新红线。

    但是,使用此扩展,程序不会进入其 ISR..... ? 不确定原因。

    void main (void)

    WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
    PM5CTL0 &=~LOCKLPM5;//禁用 GPIO 上电默认高阻抗模式以激活先前配置的端口设置

    P1DIR |= 0xEF;//将 P1.0设置为输出方向(将除 P1.4之外的所有端口设置为输出)
    P1REN |= 0x10;// P1.4电阻器被启用
    P1OUT |= 0x10;// P1.4电阻作为上拉电阻
    P1IE |= 0x10;// P1.4中断被启用
    P1IES |=0x10;// P1.4高/低边沿
    P1IFG &=~0x10;// P1.4 IFG 被清零

    _BIS_SR (LPM4_BITS + GIE);//输入 LPM4并进行中断

    //端口1中断服务例程
    #pragma vector=Port1_vector
    _interrupt void Port_1 (void)


    P1OUT ^= 0x01;// P1.0 =切换
    P1IFG &=~0x10;// P1.4 IFG 被清零

    问题可能出在哪?

    Yljon



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include 
    
    #define RED_LED BIT0
    
    void main (void){
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    //在5994 Launchpad 上配置 GPIO、S1、左下方
    P5OUT = BIT6; P5.6上的//上拉电阻器
    P5REN = BIT6; //选择上拉模式
    P5DIR = 0xFF ^ BIT6; //将 P5.6以外的所有参数设置为输出方向
    P5IES = BIT6; // P5.6高/低边沿
    P5IE = BIT6; // P5.6中断被启用
    
    //在 P1.0上启用 Launchpad 红色 LED
    P1OUT = 0; // BIT0 = 0 LED 关闭
    P1DIR = RED_LED;
    
    //在未使用的引脚上设置确定的逻辑电平的一般良好做法
    P2OUT = 0;
    P2DIR = 0xFF;
    
    P3OUT = 0;
    P3DIR = 0xFF;
    
    P4OUT = 0;
    P4DIR = 0xFF;
    
    // P5OUT = 0;
    // P5DIR = 0xFF;
    
    P6OUT = 0;
    P6DIR = 0xFF;
    
    P7OUT = 0;
    P7DIR = 0xFF;
    
    P8OUT = 0;
    P8DIR = 0xFF;
    
    PJOUT = 0;
    PJDIR = 0xFFFF;
    
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    //清除 P5中断,然后启用全局 INT
    P5IFG = 0; //清除所有 P5中断标志
    _enable_interrupt ();
    
    
    //忙循环
    while (1)
    {
    __no_operation(); //对于调试器
    }
    }
    
    //端口5中断服务例程
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector=PORT5_vector
    __interrupt void port5_ISR_handler (void)
    #elif defined (__GNU__)#void
    __attribute__(interrupt (PORT5) void
    
    (PORT5) porthandler (void)#vector!#vector!#vector!
    #endif
    {
    __no_operation();
    P5IFG &=~BIT6; //清除 P5.6 int 位
    __no_operation();
    P1OUT ^= BIT0; // P1.0 =切换
    _delay_cycles (10000); //去抖-切勿在现实生活中执行此操作
    !}
    

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

    您好 Keith。

    我认为现在我的程序可以正常工作。

    我更改了代码、而不是使用按钮或使用3.3V 手动触碰 GPIO 输入引脚(启用中断)、而是添加了用于环路的。

    回路开关打开和关闭 GPIO 输出引脚、我已将其连接到另一个 GPIO 引脚 (启用中断)。

    这似乎已经解决了抖动问题、ISR 现在的工作速度更快。

    感谢您的有用和有用建议。

    祝你一切顺利

    LONI

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

    您提到了 FR5994 Launchpad、对吧?

    Launchpad 的两个按钮实际上连接到 P5.6 (左) 和 P5.5 (右)。   

    您在代码中将 P1.4用作按钮:您已经连接了自己的按钮、或者您使用了代码作为另一个 Launchpad。

    附加的代码应该起作用。  

    -我现在剥离了低功耗模式,因为 CCS 调试器在 LPM 中的工作方式不同。  只有一个"while 忙循环"。

    基思是关于反弹的,我在国际处理程序中做了一个粗略的去抖。 这是一个周期等待、在实数代码中执行此操作非常糟糕。

    -代码类似于   TI 5994软件示例 slac710e 中的 msp430fr599x_p1_03.c       但是-该代码示例存在缺陷!

    祝您好运!

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

    您好 Otto。

    这看起来也是一个非常好的代码。

    感谢你的帮助。

    问题现已解决。 正是开关抖动问题导致了我遇到的延迟。

    祝您度过美好的夜晚、祝您一切顺利、

    LONI

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

    谢谢你、奥托。

    是的、抖动是问题所在。

    我经常使用 LabVIEW 和 Matlab、但对于 C 语言、我是一名新的编程人员(执行我的第一步)、这些 MCU 无法使用 LabVIEW 或 Matlab 进行编程。

    感谢这个社区。

    晚上好!

    LONI