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.

[参考译文] 编译器/MSP430FR2111:将堆栈放入 FRAM

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/668680/compiler-msp430fr2111-placing-stack-into-fram

器件型号:MSP430FR2111

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

大家好、

是否可以在 MSP430FR 器件的 FRAM 中放置堆栈? 几年前发布了另一个主题(e2e.ti.com/support/microcontrollers/msp430/f/166/t/542727)、但从未真正解决过。 该主题中的最后一个帖子似乎暗示他们已成功使其正常工作、但我无法重新创建它。

我已经尝试了将链接器文件中的 RAM 设置更改为 FRAM 的明显解决方案(即 .stack:{}>FRAM),但这会导致程序卡在 _c_int00_noinit_noargs_noexit 函数中。  调用_system_pre_init、然后  在返回时立即再次输入_c_int00_noinit_noargs_noexit。

根据我的理解、似乎正在发生的情况是、尽管链接器发生更改、堆栈仍在0x2400处初始化到 RAM 中。 不过、堆栈指针设置为 FRAM 的顶部(FR2111为0xFF80 n)、但该地址处的值仅为0xFFFF、因此我假设代码在某个点读取堆栈指针处的地址、跳转到0xFFFF、 这正是复位矢量所在的位置、因此会跳回到_c_init00_noinit_noargs_noexit。 然后、这将重复、这将解释为什么代码没有到达 main。

(请注意、我几天前在 Reddit MSP430论坛上发布了此帖子、但这里的声音要安静一些、所以还没有答案)

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Brian、
    您能否向我们发送能够重现您的问题的代码?

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

    您好、现金、

    运行任何代码都可以实现它、但我可以做的最简单的示例是启动一个新的空项目、然后进入低功耗状态。  

    main.c

    #include 
    
    int main (void){
    WDTCTL = WDTPW | WDTHOLD;
    
    _bis_SR_register (LPM3_bits | GIE);
    
    返回0;
    }
    

    lnk_msp430fr2111.cmd 与生成的完全一样、以下行除外  

    .cio :{}> FRAM /* C I/O 缓冲器 */
    .sysmem :{}> FRAM /*动态内存分配区域*/
    .bss :{}> FRAM /*全局和静态变量 */
    .data :{}> FRAM /*全局和静态变量 */
    .TI.noinit:{}> FRAM /*用于#pragma noinit */
    .stack :{}> FRAM (高电平) /*软件系统堆栈 * 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、脑
    好的。 我将对其进行研究、让我们看看我可以为您提供哪些帮助。

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

    你(们)好,现金

    我有一个关于这个的更新、在经过其他一些 wok 之后回来了。

    答案确实很明显、需要关闭 FRAM 写保护。 默认情况下、写使能标志被置位、因此堆栈实际上无法写入 FRAM。 通过断入 c_int00例程并通过调试器手动设置寄存器、我能够正常运行程序。

    现在我的问题是如何在启动例程中禁用 FRAM 写入保护、因为我不能只编辑 boot_special .c 文件。 那么、我是否正确地认为我能够使用链接器定义自定义启动地址并创建我自己的 c_init00例程?

    编辑:因此我将_system_pre_init 重新定义为

      int _system_pre_init (void){
        SYSCFG0 = FRWPPW;

        返回1;
      }

    但是、这只有在我暂停并通过调试器恢复程序时才有效。 只运行程序永远不会到达 main、但在暂停和继续后、它将启动 main。 我想知道这是不是因为这之后需要延迟。 尝试了几次延迟、但仍未解决。



    谢谢

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

    进一步更新:

    我想我可能已经解决了这个问题。

    我更改了链接器文件以添加定制_c_int00_noinit_noargs_noexit 函数的段。

      FRAM:origin = 0xF100、length = 0x720
      custom_C_INT:origin = 0xF820,length = 0x020
      FRAM2:origin = 0xF840、length = 0x740

    然后在.stack:{}> FRAM (high)行之后添加

      .text:_isr:_c_int00_noinit_noargs_noexit:{}> custom_C_INT


    然后有一个名为 custom_c_int00.c 的文件、我在其中复制了 boot_special _c_int00_noinit_noargs_noexit 代码、并添加了 FRAM 写保护禁用和 LOCATION pragma


      #include "boot.h"
       
      #include "driverlib.h"
       
       
      extern int _system_pre_init (void);
       
       
      #pragma LOCATION = 0xF820
      pragma CLINK (_c_int00_noinit_noargs_noexit)
      CSTART_DECL _c_int00_noinit_noargs_noexit ()
      {
        SYSCFG0 = FRWPPW;
        stack_init();
        system_pre_init();
        MAIN (0);
        abort();
      }

    我的程序现在运行时堆栈看起来位于 FRAM 中。 我现在不打算将其标记为正确、因为我真的希望 TI 员工听到铃声、并确认这是将 FRAM 放入堆栈的有效方法。