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.

[参考译文] MSP430FR6989:关于 FRAM 段的分频

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/729573/msp430fr6989-about-the-division-of-the-segment-of-the-fram

器件型号:MSP430FR6989

你好

"是否可以通过在 MPUSEGB 1和2中设置地址来对段进行分频?
在此之前、我们是否需要为 MPUSAM 中的所有段启用执行启用、写入启用?

此致。

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

    我对 FRAM 写入有疑问。

    现在我正在执行以下程序。 由于我设置了一个段并且禁止写入、我认为我无法写入、但是如果我这么做、我可以写入 FRAM 区域。 我认为写入使能位为0、因此它受写保护。 我不知道哪里出错了。 我很抱歉、但请告诉我。

    # pragma RETAIN (Tname)
    # pragma DATA_SECTION (Tname、"。 信息发展");
    const char Tname [8]="鳟鱼";

    # pragma RETAIN (UDATA)
    # pragma DATA_SECTION (UDATA、"。 信息发展");
    # pragma 位置(UDATA、0x4400)
       int UDATA [64][8]={、};

    主()

      WDTCTL = WDTPW | WDTHOLD;    //停止看门狗计时器

        MPUCTL 0 = MPUPW;                    //写入 PWD 以访问 MPU 寄存器
        MPUSEGB 1 = 0×1000;                 // B 1 = 0×10000;B 2 = 0×1A 000
        MPUSEGB 2 = 0×1A 00;               //边界被分配给段

        MPUSAM = MPUSEG 1 RE | MPUSEG 1 XE | MPUSEG 1 WE |
                 MPUSEG 2 RE | MPUSEG 2 XE | MPUSEG 2 WE |
                 MPUSEG3RE | MPUSEG3XE |
                 MPUSEGIRE | MPUSEGIWE | MPUSEGIXE;

        MPUSAM &=~ MPUSEG1 We;        //写入禁用
        MPUSAM &=~ MPUSEG 2 We;     //写入禁用

    完成此操作后、将从0x4400写入数据。
    是这样吗?

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、您能否添加您写入受保护段的代码?

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

    我发送编程代码。请检查并发送建议。

    #include
    #include

    #include

    #pragma 位置(UDATA、0x4400)

    int UDATA [32][8]={
    {0}、
    {0}、
    {0}、};

    /*********
    * main.c
    秘书长的报告 /
    int main (空)

    unsigned int i、j、k=0;

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式

    MPUCTL0_H =0xA5;//写入 PWD 以访问 MPU 寄存器
    MPUSAM |= MPUSEGIWE;//将 InfoA 设置为写使能

    MPUCTL0 = MPUPW; //写入 PWD 以访问 MPU 寄存器
    MPUSEGB1 = 0x1000; // B1 = 0x10000;B2 = 0x1A000
    MPUSEGB2 = 0x1A00; //将边框分配给句段

    MPUSAM = MPUSEG1RE | MPUSEG1XE | MPUSEG1WE|
    MPUSEG2RE | MPUSEG2XE | MPUSEG2WE|
    MPUSEG3RE | MPUSEG3XE | MPUSEG3WE|
    MPUSEGIRE | MPUSEGIWE| MPUSEGIXE;

    for (i=0;i<32;i++){
    for (j=0;j<8;j++){
    UDATA [i][j]= I+j+0x100;
    if (j==8){
    J=0;




    MPUSAM &=~MPUSEG1WE;
    MPUSAM &=~MPUSEG2WE;

    for (i=32;i<64;i++){
    for (j=0;j<8;j++){
    UDATA [i][j]= 1 + k++;
    if (j==8){
    J=0;



    for (i=64;i<96;i++){
    for (j=0;j<8;j++){
    UDATA [i][j]= 1;
    if (j==8){
    J=0;




    while (1){
    P1OUT ^= 0x01; //切换 LED
    _DELAY_CYCLLES (0xC00000); //等待16,000,000个 CPU 周期
    P9OUT ^= 0x80; //切换 LED



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

    您好!

    您需要设置 MPUENA 位来启用保护:

    MPUCTL0 = MPUPW | MPUENA;

    此致

    Lukas

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

    我想将 FRAM 区域分为三个段。
    其中一个段执行程序的编写和执行。
    其余2个段将随时从主机接收新数据并进行存储。

    此致。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、您希望使用 MPU 保护代码所在的段吗?
    我看到您的代码位于0x10000处。
    因此、您定义的第一个段是用于数据存储、第三个段是正确的?
    因此、您需要仅保护段2。

    Lukas