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.

[参考译文] CCS/MSP430F5659:如何解锁并写入信息段A?

Guru**** 2614265 points
Other Parts Discussed in Thread: MSP430F5659

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/656171/ccs-msp430f5659-how-to-unlock-and-write-to-iformation-memory-segment-a

部件号:MSP430F5659

工具/软件:Code Composer Studio

您好,

我需要写些什么才能写在程序的信息记忆段A中?

我可以用这种方式写信给所有其他批注:

unsigned char *addr;

Addr = 0x1980;//seg a.

FCTL3 = FWKEY;

FCTL1 = FWKEY + WRT;

//写一些东西

*addr = 0x55;

FCTL1 = FWKEY;

FCTL3 = FWKEY + LOCK;

此代码在Code Composer V4版本中工作。

我需要做些什么来解决这个问题?

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

    您应该使用Locka (FCTL3)。 在5xx/6xx系列数据表(slau208)中对此进行了说明...

    信息存储器的段A与所有其它段用Locka位单独锁定。 如果
    Locka = 1,无法写入或擦除数据段A,并且所有信息存储器都受到保护
    句段已擦除。 如果Locka =0,则段A可以像任何其它闪存 段一样被擦除和写入。
    当向Locka位写入1时,该位的状态将切换。 将0写入Locka不起作用。 这个
    允许不更改现有的闪存编程例程。

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

    如果上述帖子解决了您的问题,请继续并选择IT resolved your issue,以便我们可以关闭此线程并将其记录。 谢谢!

    此致,

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

    Mat,您好!

    我在 打开此案例之前已经阅读了此信息,我仍然认为此设备的硅树脂有任何问题,或者有人认为我不完全理解。

    我通过 以下方式解决了这个问题,在原始代码中,我将段的图像复制到RAM,然后根据请求的数据更新RAM中的图像,然后在信息存储器中擦除段, 然后将更新的映像从RAM写入信息存储器:

    unsigned long address = 0x1900;//segment A

    CHAR数据= 0x55;

    FCTL4 = FWPW;

    IF (FCTL3和Locka)

    FCTL3 = FWPW + Locka;

    //清除句段

    FCTL3 = FWKEY;

    FCTL1 = FKEY + ERASE;

    *地址= 0;

    FCTL1 = FWKEY;

    FCTL3 = FWKEY + LOCK;

    //写入数据

    IF (FCTL3和Locka)

    FCTL3 = FWPW + Locka;

    FCTL4 = FWPW + LOCKINFO;

    while (FCTL3 & BUSY){};

    FCTL4 = FWPW;

    IF (FCTL3和Locka)

    FCTL3 = FWPW + Locka;

    FCTL1 = FWKEY;

    FCTL3 = FWKEY + WRITE;

    *(char*)(地址)=数据;

    FCTL1 = FWKEY;

    FCTL3 = FWKEY + LOCK;

    IF (FCTL3和Locka)

    FCTL3 = FWPW + Locka;

    FCTL4 = FWPW + LOCKINFO;

    我不知道为什么,但这只是一种非常奇怪的方法,每次我需要检查Locka位以访问段A (擦除或写入)?

    我认为我在代码上面写了一些不必要的行,但我不能完全理解,在我以前的项目中,这个系列的另一个微控制器的实施更简单。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    开机后(已知状态,锁定段A),每次写入段A时,都可以在开头解锁(锁定),在末尾锁定(锁定),只需一个指令(与FCTL3相关),而不检查是否锁定。 FWKEY和FWPW具有相同的值0xA500。 我不知道您以前使用过这个家族中的什么微分,但我没有注意到与信息A细分市场相关的任何奇怪的事情。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如Zrno所述,它只应执行一个指令,以便您更改信息存储器的段A。 Locka位控制写入内存段的能力。 在写入数据段A之前,必须检查位的状态,以确保其值正确。 Locka=0表示句段已解锁且可以写入,而Locka=1表示句段已锁定且不可更改。 如果Locka=1并且您想将其解锁,则必须向该位写入'1'以切换值。 写入完成后,再次写入'1'以将位切换回锁定状态。

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

    大家好,

    我在使用TI下载应用MSP430 USB固件升级示例时遇到错误问题,该示例需要将数据放入信息存储器INFOD中。

    我的芯片是MSP430F5659,TI文本文件中的数据是:

    @1800

    FF AA

    @8000

    4F 14 F1 03 C1 43 00 00 E2 B2 3E 09 7A 24 B1 13

    F6 6C C1 4C 00 00 E2 C2 3E 09 73 3C 03 43 C2 3C

    03 43 C0 3C 03 43 BE 3C 92 B3 2C 53 BB 24 B1 13

    24 84 C1 4C 00 00 B6 3C B1 13 38 65 A2 B3 2C 53

    没有两行(@1800,FF AA),我没有错误。 我的代码是:

    Case update_code_CMD:

     

          //设置启动BSL进程

          __disable_interrupt ();

     

          如果(FCTL3和Locka){

                 FCTL3 = FWKEY | Locka;

          }

          否则

     

                 FCTL3 = FWKEY;

          }

     

    USBKEYPID = 0x9628;                                  

    USBCNF &=~PUR_EN;               

    USBPWRCTL &=~VBOFFIE;                               

    USBKEYPID = 0x9600;                                  

    __DELAY周期(50万);

          ((void(*)))0x1000)();//          调用BSL

          中断

     

    是否有任何解决此问题的想法?

    谢谢!

    千斤顶

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

    您似乎在新的帖子上发布了您的问题( e2e.ti.com/.../65.7941万 ),因此请参阅此处以获得有关解决您的特定问题的帮助。

    亚历山大

    您是否能够解决您的问题?

    此致,

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

    请告知我们您的问题是否有任何更新,以及您是否能够解决问题,以便我们相应地关闭此线程。

    谢谢,此致,

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

    由于我们几周内没有收到关于此问题的回复,因此对该线程的支持似乎已完成。 如果问题已解决,请继续并选择"已解决",我将关闭此线程。 如果您遇到其他问题,请随时发布另一篇E2E文章,以便解决这些问题。

    谢谢,此致,

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

    Mat,您好!

    我已经解决了我的问题,因为我在18.01 2018的帖子中写道,我没有更改我的代码。
    我发现了另一个与此主题相关的问题,它是内存覆盖问题,我不知道为什么Code Composer V6没有按照我的期望插入以下代码:

    void WriteDataToFlash (无符号长地址,char*数据,int长度)

    INT I = 0;
    对于(i = 0;i <长度;i++)

    //一些代码用于检查地址并打开闪存进行写入
    *((char*)(address++))= data[i];
    //一些代码用于锁定内存
    }
    }

    在这种情况下,编译器会将指向指针的地址转换为unsigned long,然后增大该值,这样每次循环的迭代都会跳过四个字节的内存空间。
    如果我将有问题的行更改为此行:

    *((char*)(地址)+ I)=数据[i];

    它工作正常。

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

    我看到你的要求和你对问题仍然存在的关切。 请允许我们继续支持此主题,以便我们跟踪进度。 详细描述您现在看到的问题,并使用“插入代码”工具上载有问题的代码片段。

    此致,

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

    Mat,您好!

    这是我的问题,我写了一个简单的代码,写了两个符号 'A'然后'B'到信息内存段A的地址0x1980,在第一种情况下,它工作正常,但在第二种情况下,我有一个问题, 程序计数器跳到当前函数之外的任何语句,当我在第一次写入'B'时更改代码,然后以同样的方式更改'A'时,问题总是出现在'B'的情况下:

    #define u8无符号字符

    Void主(void)

       u32地址= 0;

     

       FCTL4 = FWPW;

       IF (FCTL3和Locka)

              FCTL3 = FWPW + Locka;

      //清除句段

       while (FCTL3 & BUSY){};

     

       FCTL3 = FWPW;

       FCTL1 = FWPW +擦除;

       *(u8*)(0x1980)= 0;

       while (FCTL3 & BUSY){};

     

       FCTL3 = FWPW +锁;

     

       IF (!(FCTL3和Locka))

              FCTL3 = FWPW + Locka;

       FCTL4 = FWPW;

     

       //写入'A'

       FCTL4 = FWPW;

       IF (FCTL3和Locka)

              FCTL3 = FWPW + Locka;

     

       FCTL3 = FWKEY;

       FCTL1 = FWKEY+WRT;

     

       *(u8*)(0x1980)='A';

      //写入'B'

       FCTL1 = FWKEY+WRT;

     

       Addr =0x1980;//我用地址0x1981尝试过,结果相同

       *(u8*)(addr)='B';

     

       FCTL1 = FWKEY;

       FCTL3 = FWKEY+LOCK;

     

       IF (FCTL3和Locka)

              FCTL3 = FWPW + Locka;

       FCTL4 = FWPW;

     

       FCTL1 = FWKEY;

       FCTL3 = FWKEY+LOCK;

    }

    出现此问题是因为以下编译器的解释,我使用MSP430F5659 MCU,我认为这是一个硅问题,因为信息内存的其他段没有相同的问题,我可以在调试会话中使用常量地址写入A段, 有时取决于当前的代码编译(代码存储器中的句子分配),它在自由运行条件下(无调试会话)可以正常工作(案例'B'):

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

    如果我在您的情况下,要清除此问题(闪存写入),我将使用UART日志记录(在自由运行期间),而不是断点调试。 我还将尝试在信息段A中的两个不同位置写入(段擦除后),例如0.198万h和0.199万h。 我不在C中为MSP430编码,因此不知道与指针/地址相关的人员,但在汇编器中生成代码是可以的。

    编辑:我刚刚尝试用闪光灯将数据写入MSP430F5659的信息段。 使用从RAM执行的块写入。

    文件test_infoa_5...

    org 0.198万h
    dw 0.0123万h,0.4567万h,089ABh,0CDEFh,0.1122万h, 0.3344万h, 0.5566万h, 0.7788万h...
    
    End
    
    @1980
    23 01 67 45 AB 89 EF CD 22 11 44 33 66 55 88 77...
    
    q 

    闪烁...

    D:\MSP4>flash -f test_infoa_5.txt -uinfoa -einfo -w -v
    
    文件:"test_infoa_5.txt"
    @198.0128万字节
    总大小:128字节
    
    在
    
    
    
    
    
    解锁COM7时找到SBW+获取设备# JTID熔丝设备核心硬软LotWafer DieX DieY 1 91 OK 3081 2106 10 B7A5.0951万 0A00
    
    信息擦除
    时间: 135毫秒
    
    写入
    时间:132毫秒速度:0,9 KB
    
    /秒验证
    时间:52毫秒速度:2,4 KB
    
    /秒发布设备
    
    总时间: 422 ms
    
    d:\MSP430>flash -rq 1980
    
    在COM7上找到SBW+
    
    Get Device
    # JTID Fuse Device Core Hard Soft LotWafer DieX DieY
    1 91 OK 3081 2106 10 B7A5.0951万 0A001100
    
    Read Quick
    11980123
    4567 89AB CDEF 1122 3344 5566 7788
    时间:39 ms
    
    Release Device
    
    总时间: 125 ms
    
    d:\MSP430> 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    亚历山大

    我将在类似于MSP430F5659的Launchpad上运行您的代码,并查看是否可以重新创建您看到的问题,以便调试问题的根本原因。 请附上您正在使用的源代码,并详细说明如何在我的笔记本电脑和Launchpad上重新创建问题,以便我有更好的机会找到错误。 我看到您说该代码在自由运行期间正常工作,但在调试会话中不工作;请您进一步解释一下。

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

    我会密切关注您的回复,但我至少复制了您在上面的评论中提供的代码片段,并且能够看到'A'和'B'被写入到各自的内存位置(见下文)。 我改变了一件事,就是B被写入地址,地址设置为0x1980, 但是我把它改成了0x1981,这样我就可以看到'A'和'B'都成功地写了,方法是在写了'B'之后在代码中设置一个断点,然后检查内存的内容。 这是否与您看到的类似?

    此致,

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

    自从我上一周前发布此主题以来,是否有任何更新?

    此致,

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

    请向我们更新此线程的状态,如果不再需要支持,请选择"已解决",以便我们可以关闭此线程。 感谢您的帮助!

    此致,

    Matt Calvo