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:写入不需要!

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1513283/msp430fr5994-writing-does-not-take

器件型号:MSP430FR5994

工具/软件:

我 在写入 FRAM2时遇到问题、没有错误或警告、但写入不会执行。
我将测试代码最小化到这个,读取工作,但写入没有任何作用。

请提供建议!

lnk_msp430fr5994.cmd:

...

  }> 0x4000

  .storage      :{}> FRAM2     /*存储,从文件的其他部分删除 FRAM2。 */

  .cinit       :{}> FRAM      /*初始化表       */
...

main.c:

pragma DATA_SECTION (帧2".storage")

unsigned char fram2[10]
void main (void)
  unsigned char aa、index;
  while (true)
  {
   For (索引=0;索引<10;索引++)
   {
     AA =__data20_read_char(无符号长整型)( fram2+index );
     AA =索引;
     __data20_write_char(无符号长整型)( fram2+index ), aa);//不执行任何操作
     AA =__data20_read_char(无符号长整型)( fram2+index );
     
     __ delay_cycles (100);
   }
  }
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    和源代码、大代码和 data_model 的函数。

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

    我看不到在哪里启用 FRAM。 对于您的用例(高 FRAM)、您可以使用 MPU 来实现此目的。

    一个快速的实验就是禁用 MPU (取消选中 Build Settings->General->MPU[tab]->Enable MPU)。 该写入操作启用所有 FRAM。

    如您所想、这种方法从长远来看并不是很好。 您可以使用 MPU[Tab](如上所示)更改 FRAM 区域的 RWX 设置。 数据表提供了存储器布局。

    您也可以使用"#pragma PERSISTENT ()"创建可写 FRAM。 对于此功能、编译器/链接器会为您执行 MPU 工作、 但.TI.persistent 段被置于低 FRAM 中、因此大小受到限制。 这在示例 msp430fr599x_framwrite.c 中进行了演示、此处为:

    https://dev.ti.com/tirex/explore/node?node=A__AAkb-Bq6Hd25qRBlFc08Zw__msp430ware__IOGqZri__LATEST

    [编辑:更正了拼写错误。]

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

    pragma
    persistent (帧2)
    #pragma location=0x10000
    unsigned char fram2[0x33F00]={0x55};

    void main (void)
      无符号字符 aa;
      INT 索引;
      WDTCTL = WDTPW | WDTHOLD;        //停止 WDT

      // MPU
      MPUCTL0 = MPUPW;//写入 PWD 以访问 MPU 寄存器
      //段1–只允许读取和写入
      //段2–允许只读
      //段3–允许读取和执行 ONL
      MPUSEGB1 = 0x0480// B1 = 0x4800;B2 = 0x10000
      MPUSEGB2 = 0x1000//边界被分配给段
      MPUSAM =(MPUSEG1RE | //允许在主存储器段1上读取
            允许对主存储器段1进行 MPUSEG1WE |//写入
            允许在主存储器段1上执行 MPUSEG1XE |//
           MPUSEG2RE | //允许在主存储器段2上读取
            允许对主存储器段2进行 MPUSEG2WE |//写入
            允许在主存储器段2上执行 MPUSEG2XE |//
           MPUSEG3RE | //允许在主存储器段3上读取
            允许对主存储器段3进行 MPUSEG3WE |//写入
           MPUSEG3XE); //允许在主存储器段3上执行代码
      MPUCTL0 = MPUPW | MPUENA | MPUSEGIE;//启用 MPU 保护
      // MPU 寄存器被锁定、直到 BOR

      while (true)
      {
       for (index=0;index<0x33F00;index++)
       {
         AA =__data20_read_char(无符号长整型)( fram2+index );
         AA =索引;
         __data20_write_char(无符号长整型)( fram2+index ), aa);
         AA =__data20_read_char(无符号长整型)( fram2+index );
         
         __ delay_cycles (100);
       }
      }
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很高兴您能让它正常工作。

    >         允许对主存储器段2进行 MPUSEG2WE |//写入

    第2段是(大概)您的代码所在的位置。 您可能不希望这种可写操作。   
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正确无误。

    当我设法使其他一切正常工作时、我会进行研究。

    感谢您的观察。