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.
我将应用从 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 不执行。
执行变为奇数位置通常是通过未初始化的矢量执行的。 使用 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 的支持。