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.

[参考译文] 编译器/MSP430FR2676:MSP430FR2676锁定开关输入中断。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/962797/compiler-msp430fr2676-msp430fr2676-locking-up-on-a-switch-input-interrupt

器件型号:MSP430FR2676

工具/软件:TI C/C++编译器

我在开发套件上使用了 MSP430FR2676处理器、这让我有一些奇怪的行为。
我有一个开关输入设置、用于在高电平到低电平转换时触发中断。 我有代码将使用 GPIO_getInterruptStatus() API 来检查中断状态,并通过 GPIO_clearInterrupt() API 调用来清除中断状态。
以上所有内容都和我设计的一样工作、没有问题。
然后、我在项目中引入了 UART、以打印简单的调试串行消息(我将3.3V 电压连接到 RS232仓体并将仓体连接到 tera Term 以查看这些消息)。
我使用 UART_openPort() API 打开端口,使用 UART_transmitBuffer()打印消息。
这也按设计工作、没有问题。
当我按下一个按钮来触发中断、程序锁定并跳转到"ISR_TRAP"时、就会出现问题。

通过各种编辑,我删除了每个 UART_transmitBuffer(),除了在主循环之前出现的语句(因此整个程序中不会出现其他 UART 打印语句)。
即使在程序开始时只调用了一个 UART_transmitBuffer(),我仍然会得到锁定。
在此项目中是否有未正确配置的内容?
这是已知问题吗?
任何帮助都是非常值得的!
提前感谢!!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    进入 ISR_TRAP 意味着您有一个没有 ISR 的中断。 执行此操作的一种方法是在 vector= name 中进行拼写错误;这将得到警告、但您可能不会注意到。

    您能否发布或附加您的代码?

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

    感谢您的回应!!

    当您提到:"一种方法是在 vector= name 中进行拼写错误;这将得到警告、但您可能不会注意到。"
    我将其确切地添加到哪里?

    此外、这里是我的代码、如果你看到一些突出的东西(或者、如果你需要从函数中看到更多代码)、请告诉我-谢谢!!!

    ===========================
    main.c:
    ===========================

    void main (void)

       /*设置看门狗计时器*/
       WDTCTL = WDTPW | WDTHOLD;

       /*初始化 MCU:
       bsp_configureMCU()设置器件 IO 和计时
       全局中断使能被设置为允许外设
       来唤醒 MCU。 *
       bsp_configureMCU();

       /*打开端口进行通信*/
       UART_openPort (&UARTPort);

       /*设置 LED 引脚*/
       GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN7);
       GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN6);
       GPIO_setAsOutputPin (GPIO_PORT_P5、GPIO_PIN7);

       /* LED 初始设置*/
       GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN7);
       GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN6);
       GPIO_setOutputLowOnPin (GPIO_PORT_P5、GPIO_PIN7);

       /*配置按钮*/
       buttonConfigure();

       静态 uint32_t delayCounter = 0;
       静态 uint16_t loopCounter = 0;

       /*当它进入时,崩溃!! *
       静态 uint8_t msg[]={"程序启动"};
       UART_transmitBuffer (msg、sizeof (msg));

       /* 主循环*/
       while (1)
       {
           /*处理按钮*/
           buttonProcess();

           IF (delayCounter++> MAX_COUNTER)
           {
               delayCounter = 0;
               GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN6);

               loopCounter++;
           }
       }


    ===========================
    button.c
    ===========================

    void buttonConfigure( void )

       GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P5、GPIO_PIN3);

       /*设置边线*/
       GPIO_selectInterruptEdge (GPIO_PORT_P5、GPIO_PIN3、GPIO_HIGH_TO_LOW_TRANSITION);

       /*为此端口/引脚启用中断*/
       GPIO_enableInterrupt (GPIO_PORT_P5、GPIO_PIN3);

       /*清除中断*/
       GPIO_clearInterrupt (GPIO_PORT_P5、GPIO_PIN3);

    void buttonProcess (void)

       /*清除位图*/
       buttonInterruptStatusVal = 0x0000;

       buttonInterruptStatusVal = GPIO_getInterruptStatus (GPIO_PORT_P5、GPIO_PIN3);

       /*检查是否按下了按钮*/
       if (buttonInterruptStatusVal)
       {
           GPIO_clearInterrupt (GPIO_PORT_P5、GPIO_PIN3);

           /*切换 LED */
           GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN7);
       }


    ===========================
    UART 设置的结构:
    ===========================

    //设置 UART 传输的所有参数
    CONST tUARTPort UARTPort =

        //不接收消息,因此不需要回调
       .pbReceiveCallback =空、

       //不接收消息,因此不需要回调
       .pbErrorCallback = 0、

       //选择时钟源
       .peripheralParameters.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK、

       //时钟预分频器为 UCBRx = int (N / 16)、其中 N = clock_frequency / baud _rate
       // N = 2000000 / 115200 = 17.36111
       //int (N / 16)= int (17.36111 / 16)= int (1.0850694)= 1;
       peripheralParameters.clockPrescalar = SMCLK_FREQ_MHz * 1000000 / 115200 / 16、

       //控制过采样模式的 UCBRF 位
       //UCBRF = int ((((N/16)- int (N/16))* 16)= int ((((17.36111/16)- int (17.36111/16))* 16)= int (1.36111)= 1
       peripheralParameters.firstModReg = 1、

       //请参阅用户指南中的表22-4以查找与 UCBRF 编号对应的寄存器值
       // N 的小数部分= 0.36111
       //在表中,0.36111 <--> 0x4A 或0x52
       .peripheralParameters.secondModReg = 0x4A、


       //控制奇偶校验位-请注意 eZ-FET 不支持奇偶校验位
       peripheralParameters.parity = EUSCI_A_UART_NO_parity、

       //最低或最高有效位优先
       peripheralParameters.msborLsbFirst = EUSCI_A_UART_LSB_FIRST、

       //选择一个或两个停止位
       .peripheralParameters.numberofStopBits = EUSCI_A_UART_On_Stop_bit、

       //选择是否使用多处理器/自动波特模式
       peripheralParameters.uartMode = EUSCI_A_UART_MODE、

       //选择过采样与低频率波特率模式
       peripheralParameters.oversing= EUSCI_A_UART_oversing_BAUDRATE_generation

    };

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

    要回答您的问题:您可以使用"#pragma vector=定义 ISR (中断服务例程) vector"和_interrupt 关键字。

    但我认为您不想这么做。 此代码(buttonProcess)正在轮询中断标志(IFG)。 没关系、但在这种情况下、您不应启用这些中断(IE)。 IFG 位的置位独立于它们相应的 IE 位。 (查看为您不关心的事件设置的 IFG 位是例程。)

    摘要:删除此行:

    >  GPIO_enableInterrupt (GPIO_PORT_P5、GPIO_PIN3);

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

    感谢您的回答!

    我移除了 GPIO_enableinterrupt 行、一切都运行得更好。

    谢谢!!