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.

[参考译文] MSP430G2231:触发闪存擦除-汇编器神秘面纱

Guru**** 2391415 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/713507/msp430g2231-triggering-flash-erase---assembler-mystery

器件型号:MSP430G2231

这并不是很重要、因为我无论如何都会修复它。  但是...

MSP430BSL_1_01_00_01.zip 中出现的 G2231的自定义 BSL 以及我已检查的所有以前版本中均会出现以下内容:

EraseSeg:  MOV    &FWKEY +擦除、&FCTL1

它汇编为:

MOV &0xA502、&0x0128

在我看来、它应该是:

MOV   #FWKEY 等

我提出的原因是、它看起来原始指令实际上是有效的、我不明白它怎么可能起作用。  无论位于0xA502位置的是什么(那里没有闪存)、上部字节中不大可能包含0xA5、因此应该忽略该指令。   或者、我看到这一切都是错误的吗?  有什么想法吗?

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

    感谢您的报告。 我同意这是一种奇怪的行为、因为命令 mov&0xA502、&0x0128应将地址0xA502的内容移动到地址0x0128。 您也是对的、0xA502是无效的存储器位置。

    我们将对其进行研究并返回给您。

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

    您好、Goerge、

    将正确的信息添加到您的分析和 Andre:位值必须指定"#"而不是"&"。

    为什么引导加载程序起作用、因为这种错误的符号分配仅在擦除段函数上。 它不会影响编程部分。

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

    感谢您的回复。  我已经确认擦除是使用错误指令执行的、至少在我的 G2231上是如此。  看起来错误已经存在了很长时间、如果它不起作用、则有人会提到它。  我在 ZIP 中的所有文件中搜索了出现"&FWKEY "的文件、 该文件仅出现在 G2xxx 器件的 v5和 v7的 CCS 和 IAR 代码中。  总共有四个文件。  

    一个解释可能是、当读取不存在的位置时、至少在 A5范围内、地址将返回为内容值。  如果我有时间、我将尝试对其进行测试。

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

    您对此主题还有其他疑问吗? 否则、我将关闭此线程。

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

    [引用用户="Andre Frantzke">George、您好、

    您对此主题还有其他疑问吗? 否则、我将关闭此线程。

    谢谢、
    Andre

    [/报价]

    嗯、我希望得到一个解释。  SLAU144指示如果高字节不是 FWKEY、处理器将复位。  显然、这不是发生的。 但这并不重要。  我只是想知道在这种情况下、完全错误的指令如何起作用。  如果没有人有解释、您可以关闭线程。

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

    让我与我们的内部团队核实一下。

    此致、
    Andre
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的乔治:
    由于引导加载程序未使用"擦除段"功能、因此从未看到此错误。 仅使用"整体擦除"。 我们将在未来的版本中解决此问题。 感谢您的关注!

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

    [引用用户="Andre Frantzke">George、您好、
    由于引导加载程序未使用"擦除段"功能、因此从未看到此错误。 仅使用"整体擦除"。 我们将在未来的版本中解决此问题。 感谢您的关注!

    此致、
    Andre

    [/报价]

    这似乎不正确。  引导加载程序根本不使用批量擦除。  这些文件中没有出现"MERAS"。  相反、它每次擦除主存储器一个段。  我不知道它为什么这么做、但这就是它所做的。  此外、错误的指令被用于每个段擦除、并且每次都能很好地工作。

    当我编写我自己版本的代码时、我切换到批量擦除、但不注意、否则复制了代码的这一部分、包括错误指令。  我的代码也非常完美。

    但我认为我发现了错误指令为什么起作用的解释。   我编写了一个简短的测试程序、该程序复制了错误的指令、如下所示:

       MOV.w   &(FWKEY + ERASE)、 &0x0200       ;重复编码错误
       MOV.w   &(FWKEY + MERAS)、 &0x0202      ;查看写入 RAM 的内容

    这些行将位置0xA502和0xA504的内容移动到 RAM 中、即使这些位置没有任何内容。 这正是错误的 BSL 指令所执行的操作。  然后使用正确的指令、我将 RAM 位置的内容复制到 INFOD 的底部、然后退出。  稍后,通过命令行 Flasher 阅读 INFOD 的内容,我得到了以下 IntelHex:

    20 1000 00 02A504A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 C

    因此解释似乎是、至少对于0xA5xx 范围的位置、如果您读取不存在任何内容的位置的内容、则位置地址本身将作为该位置的内容返回。  这意味着"&FWKEY+ERASE"的值与"#FWKEY+ERASE"的值相同。  这就是它的工作原理。  实际上、除了外观、您不需要修复它。

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

    我们在芯片上以及设计中都检查了这种行为。 您的发现是正确的。 如果在 MAB 上放置一个无效的地址、则使用数据总线上的最后一个值。 因此、在本例中、"&"和"#"是相同的。 这对 MSP430F2xx 器件有效。 对于 MSP430F5xx/F6xx 器件、这不起作用、因为它们的实现方式稍有不同。
    希望这对您有所帮助。

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

    显然、对于 G2xx 也是如此。  嗯、这说明了它。  非常感谢。