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.

[参考译文] UCD3138A:数据闪存写入复位 CPU

Guru**** 2536970 points
Other Parts Discussed in Thread: UCD3138A

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1045203/ucd3138a-data-flash-write-resets-cpu

器件型号:UCD3138A

您好!

我想 使用数据闪存来存储变量、我使用示例中的 SW int 包装程序进行了测试擦除:

ERASE_DFLASH_SEGM_NO_DELAY (0);

在擦除段之前、它工作正常、在0xAA 之后、在0xFF 之后(通过 PMBus 调试->存储器转储进行检查)

然后、等待几秒钟后 、我尝试使用以下命令写入一些测试数据:

WRITE_DATA_FLASH_WORD (0x18800、0x1);

但是、在执行它之后、CPU 会进入 ROM、我假设  这是由于复位。 在命令它执行 pflash 后、数据闪存仍然为0xFF -未发生写操作

我在    写入之前尝试添加:disable_fast_interrupt ()、disable_interrupt ()和 set_supervisor_mode(),但没有成功... WRITE_DATA_FLASH_BLOCLOCK ( )也是如此

我通过 PMBus 上传固件、其中包含以下选项: 已勾选跳过数据闪存。

您是否有任何问题?

小型更新:

WRITE_DATA_FLASH_WORD (0x18800、0x1);在 ccs10.3 (我正在使用它)的 lab1示例中、将 CPU 复位

我确实在新文件夹中安装了实验示例、并在 CCS 6.2中打开了 lab1、并将 WRITE_DATA_FLASH_WORD (0x18800、0x1)添加到 main 中、它按预期工作、因此 问题看起来像是 CCS 存在问题、我在两个 CCS 中都使用 TI 编译 TI5.2.9

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

    Tomasz、我怀疑数据闪存的只读位可能在 load.asm 中被置位、而不是在软件中断中被清除。  或者、编译器可能使用字节写入来写入寄存器以清除数据闪存地址设置寄存器。   

    代码可能如下所示:

    //这清除只读位以允许写入数据闪存。
    DecRegs.FLASHILOCK.ALL = 0x42DC157E;//解锁闪存写入
    //DecRegs.MFBALR2.bit.RONLY = 0;
    //将数据输入到字中。
    *(uint32 *)(arg1 & 0xfffffffc)= arg2;
    //DecRegs.MFBALR2.bit.RONLY = 1;

    以红色突出显示的行是打开和关闭只读位的行。  如果它打开、即使在特权模式下也可以对数据闪存进行写入、从而导致复位。   

    这是一种真正不需要的额外保护级别。   

    即使存在这些行、编译器也会面临优化为字节写入的风险、而 DegRegs 不会接受这种风险。   

    为了处理这个问题、我建议输入  

    DecRegs.MFBALR2.ALL = 0x22;  

    代替第一个 DecRegs 写入。

    这将在 MFBALR2中放置正确的值、并防止编译器使用字节写入。

    我会注释掉对 RONLY 位的第二次写入、因为这并不是真正必要的。  我们已将这一保护级别从最近的代码中排除、因为数据闪存的唯一写入方式是通过 SWI。  实际上、我们将 RONLY 位添加到了芯片的早期版本中、该版本没有闪存密钥。   

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

    抱歉、但我确实意识到 CCS 6.2具有编译器5.2.5、该编译器可与 Lab1代码+ WRITE_DATA_FLASH_WORD (0x18800、0x1)配合使用;

    CCS 10.3使用5.2.9、该选项不适用于 Lab1 + WRITE_DATA_FLASH_WORD (0x18800、0x1);

    我复制了026 评估板上的 SW 中断函数:

    //this clears read only bit to permit writes to data flash.
    DecRegs.FLASHILOCK.all = 0x42DC157E;
    
    //DecRegs.MFBALR2.bit.RONLY = 0;                        //does not work
    DecRegs.MFBALR2.all &= ~(1<<1); // clear RONLY bit      //works
    
    //put data in word.
    *(Uint32 *)(arg1 & 0xfffffffc) = arg2 ;
    
    //DecRegs.MFBALR2.bit.RONLY = 1;                        //does not work
    DecRegs.MFBALR2.all |= (1<<1); // set RONLY bit         //works
    
    while(DecRegs.DFLASHCTRL.bit.BUSY != 0) { }
    return;

    代码仅与清零/设置位 RONLY 一起工作、如026示例中使用&=、 使用注释掉: DecRegs.MFBALR2.bit.RONLY = 0;复位 CPU、 也许在某个位置与32位代码执行有冲突、这是因为项目被配置为16位

    由于我使用的是 UCD3138A、我尝试在闪存解锁命令之后添加这些设置、但它们会导致 CPU 复位

    DecRegs.MFBALR2.bit.BLOCK_SIZE =2;
    DecRegs.MFBALR2.bit.ADDRESS = 0x22;

    在用直接位访问替换它们之后、它可以正常工作

    DecRegs.MFBALR2.all &= ~0x30F;
    DecRegs.MFBALR2.all |= 0x8820;

    将 ccs10.3指向与 ccs6.2一起安装的编译器5.2.5并使用更旧的5.2.5进行编译可解决   DecRegs.MFBALR2.bit.RONLY = 0的问题