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 放入 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 的支持。