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:MSP-gcc 的 GPIO 中断问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1137346/msp430fr5994-gpio-interrupt-problem-with-msp-gcc

器件型号:MSP430FR5994
主题中讨论的其他器件: MSP-EXP430FR5994MSP430F5529

我将应用从 MSP430F5529移植到 MSP430FR5994、在设置 GPIO 中断时遇到问题。 我已经为 MSP-EXP430FR5994附加了一个最小(非)工作示例。 我将使用 MSP-gcc 提供的 MSP430FR5994的默认链接器脚本、自2021-02-09起。

该代码的编译方式为:

/opt/ti/msp430-gcc/bin/msp430-elf-gcc -O0 -g3 -I/opt/ti/msp430-gcc/include -I./include -Wall -mlarge -mcode-region=either -mdata-region=lower -mmcu=MSP430FR5994 -c src/main.c -o _build/main.o
CC src/main.c

并与之链接

/opt/ti/msp430-gcc/bin/msp430-elf-gcc -O0 -g3 -I/opt/ti/msp430-gcc/include -I./include -Wall -mlarge -mcode-region=either -mdata-region=lower -mmcu=MSP430FR5994 -L /opt/ti/msp430-gcc/include -Wl,-Map,_build/build.map,--gc-sections -Tlinker.ld _build/main.o -o _build/build.elf

预期行为:复位后、应切换引脚4.1。 当按下电路板上的按钮 S1 (引脚5.6)时、中断应该执行并且引脚4.2应该改变状态。 引脚4.1应继续切换。

观察到的行为:复位后、引脚4.1正在切换。 按下电路板上的按钮 S1时、CPU 跳转至某个高内存地址、引脚4.1或4.2不再切换。

这里出了什么问题? 我怀疑中断矢量表设置不正确、但链接器脚本的结构使我很难理解应该在哪里写入什么以及为什么 ISR 不执行。

e2e.ti.com/.../5700.main.ce2e.ti.com/.../7343.linker.txt

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

    执行变为奇数位置通常是通过未初始化的矢量执行的。 使用 MSP430-elf-objdump -S 检查您的.elf 文件。 验证矢量是否指向 ISR、以及矢量是否位于正确的位置。

    建议的序列是在清零 LOCKLPM5后与端口中断设置保持一致。

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

    感谢您的建议。 我的 ISR 的地址为0x1c00、检查0x0x0xc6处的存储器、它应该是端口5矢量条目。 看起来一切都很好。

    我还尝试将中断设置移动到 LOCKLPM5清除以下-问题仍然存在。

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

    0x1c00是 SRAM、这将是一个问题。 您可以从 SRAM 运行代码、但需要一些工作才能实现、我在代码中看不到这方面的提示。

    您似乎没有使用提供的链接器脚本、因此我怀疑问题与您使用的脚本有关。

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

    没错、这很奇怪。 我刚刚仔细检查、实际上我使用的是 MSP-gcc 分发提供的默认链接器脚本、而无需修改。 由于某种原因、表单不接受.ld 文件、因此我将以.txt 结尾的链接器脚本附加到了原始问题。

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

    您无需提供链接器脚本、因为已经有了:只要知道您使用的 MCU 及其位置、msp430fr5994.ld 和 gcc 就知道如何找到它。 (-i 和-mmcu 选项。)

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

    是的、我经常使用链接器脚本、这就是我将其保留在项目结构中的原因。 但无论采用哪种方式、它都是相同的链接器脚本。 无论如何、请务必将链接器标志更改为使用-tmsp430fr5994.ld、问题仍然存在。

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

    由于某种原因、编译器会将 ISR 放入 SRAM。 您可以尝试检查编译器的汇编器源代码输出、看看这是否提供线索。 (有一个选项可供选择。) 例如:

            .section        __interrupt_vector_45,"ax",@progbits
            .word   Timer_A
                    .section        .lowtext
            .type   Timer_A, @function
    Timer_A:
    .LFB2:
      

    这从 ISR 开始。 首先设置矢量。 请注意 、ISR 位于.lowtext 段中。 链接器脚本具有相应的规则。

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

    对最新 MSP-gcc 分布的更新解决了这个问题、ISR 现在被放置在 FRAM 中。 应该立即尝试一下。 我并不特别热衷于调试启动和链接。 感谢 David 的支持。