“线程”中讨论的其它部件: Captivate - FR2676, Captivate - PGMR
您好,
对于一个项目,我们使用 MSP430FR2676微控制器。 该项目 使用 MSP430-GCC 编译器,由于与 TI 库的链接,因此需要启用大模型寻址。 通过在编译过程中提供-mlarge 编译器标志,可以启用大模型寻址。 这会将寻址从16位切换到20位,并使用 MSP430X 指令而不是默认的 MSP430指令集。
我们遇到了这个问题,因为在 Captivate 库中,调用__bis_SR_register()后,它在 Capt_blockOnFlag()方法上被阻止/卡住。 在缩小这个问题的规模时,我们发现这个问题也是在一个简单的例子中出现的,如下所述。
禁用-mlarge 标志时,它编译成功,代码能够成功运行。 该代码执行外围设备(如时钟,GPIO 等)的初始化,在初始化后,使用函数调用__bis_SR_register (LPM0_bits | GIE)将其置于低功耗模式。 系统现在正在等待按下端口5上的按钮,按下评估套件上的按钮时,系统将唤醒设备并成功执行中断服务例程中定义的操作。
当启用-mlarge 标志时,它成功编译并能运行代码。 但是,当 我们使用与前一个示例相同的代码时:初始化后使用函数调用__bis_SR_register (LPM0_bits | GIE)初始化并进入低功耗模式。 系统正在等待按下端口5上的按钮,按下该按钮后,它永远不会到达中断服务例程。 而是在调用调试器中的暂停按钮时,显示它卡在地址0x000004处。 当我们从函数调用中删除 LPM0_BITS 参数时 ,调用__bis_SR_register()函数后,它似乎立即被滞留在0x000004。
我们使用的是 MSP430-GCC 编译器的版本:“MSP430-EL-gcc (Mitto Systems Limited - MSP430-gcc 9.3.1.11) 9.3-1”。
为了使用这种大型编址模型,我们是否可能缺少一些编译标志? 或者我们还有什么不对的地方(可能看起来很奇怪,因为它似乎与小模型寻址有关)?
我们还查看了 MSP-GCC 用户指南中的“中断状态更改之间需要8.2 NOP 说明”,但这似乎没有任何效果。 我们还通过 应用标志-Wa,-mu 和-Wa,-mn 来查看“表4-3 MSP430 GCC 汇编器选项”,但这也没有任何影响。 请访问 https://www.ti.com/lit/ug/slau646f/slau646f.pdf
感谢你的帮助。