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.

[参考译文] TM4C1290NCPDT:读/写保护刻录失败

Guru**** 2551110 points
Other Parts Discussed in Thread: TM4C1294KCPDT, EK-TM4C1294XL, TM4C1290NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1563903/tm4c1290ncpdt-read-write-protect-burn-failure

器件型号:TM4C1290NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XLTM4E129BNCZAD、TM4C1294KCPDT

工具/软件:

、芯片寄存器 FMPRE0 至 FMPRE7 可进行编程、但数据无法写入 FMPRE8 至 FMPRE15。

2、芯片寄存器 FMPPE0 至 FMPPE7 可进行编程、但数据无法写入 FMPPE8 至 FMPPE15。

3 μ s、FMPRE0 寄存器完全设置为 0、则芯片将被永久锁定、无法再次进入编程/调试模式。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid=“670216" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1563903/tm4c1290ncpdt-read-write-protect-burn-failure

    、芯片寄存器 FMPRE0 至 FMPRE7 可进行编程、但数据无法写入 FMPRE8 至 FMPRE15。

    2、芯片寄存器 FMPPE0 至 FMPPE7 可进行编程、但数据无法写入 FMPPE8 至 FMPPE15。

    [/报价]

    您好、

     您能否说明如何将寄存器 FMPRE0 编程到 FMPRE7? 您是如何 将 FMPRE8 编程为 FMPRE15 的? 您是否已 将编程“提交“到这些寄存器? 您需要提交 才能使设置成为永久设置。  

    3、如果 FMPRE0 寄存器完全设置为 0、则芯片将被永久锁定、无法再次进入编程/调试模式。

    当您将 FMPRE0 设置为 0 时、FMPPE0 的设置是什么? 我想您正在尝试启用仅执行保护、对吧? 您需要确保在编译代码时、不会对限制为仅执行的块进行字面数据访问。 对仅执行块的任何字面数据访问都将被阻止。 有关详细信息、请参阅数据表。   

    8.2.3.5 仅执行保护
    仅执行保护可防止对受保护的闪存块进行修改和可见性。 减少
    MODE 用于器件需要调试功能的情况、但属于的一部分
    必须保护应用程序空间不受外部访问的影响。 这方面的一个例子是公司
    希望销售 具有预编程专有软件的 TivaTM C 系列器件、但又允许销售
    最终用户将自定义代码添加到闪存的不受保护区域(例如电机控制
    模块、具有可定制电机配置部分(位于闪存中)。
    文字数据使保护机制变得复杂。 编译 C 代码和
    链接的文字数据(常量等)通常放置在文本段中函数之间、
    直接计算。 在运行时通过使用 LDR 指令访问字面数据、
    它使用 PC 相对存储器地址从存储器加载数据。 LDR 的执行
    指令在 Cortex-M3 的 DCode 总线上生成一个读取事务、该事务受于
    仅执行保护机制。 如果访问的块被标记为“仅执行“、则表示事务

    会被阻止、并且会阻止处理器加载常量数据、从而被抑制
    正确执行。 因此、使用仅执行保护需要处理文字数据
    方式不同。 有三种方法可以解决这一问题:
    1.使用编译器将字面数据收集到放入 1 的单独段中
    更多支持读取的闪存块。 请注意、LDR 指令可能使用 PC 相对地址、
    在这种情况下、字面池不能位于偏移量或软件的范围之外
    可保留一个寄存器以指向文字池的基地址、并且 LDR 偏移量为
    相对于池的开头。
    2.使用从算术指令立即数据和生成文字数据的编译器
    后续计算。
    3.使用方法 1 或 2,但在汇编语言中,如果编译器不支持这两种方法。

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

    当您将 FMPRE0 设置为 0 时、FMPPE0 的设置是什么? 我想您正在尝试启用仅执行保护、对吧? 您需要确保在编译代码时、不会对限制为仅执行的块进行字面数据访问。 对仅执行块的任何字面数据访问都将被阻止。 有关详细信息、请参阅数据表。   [/报价]

    您好、   

    当 FMPRE0 的值为 0x00000000、FMPPE0 的值为 0xFFFFFFFF 时、写入闪存的数据全为 0xFF。 完成上述数据编程后、SWD 接口无法停止启用。请帮助分析可能的原因。

     

    您能说明如何将寄存器 FMPRE0 编程为 FMPRE7 吗? 您是如何 将 FMPRE8 编程为 FMPRE15 的? 您是否已 将编程“提交“到这些寄存器? 您需要提交 才能使设置成为永久设置。  [/报价]

    您好、   

    我们通过 SWD 接口对芯片进行编程。 编程操作请参考以下说明。 数据可以成功写入芯片的 FMPRE0 到 FMPRE7、但数据无法写入 FMPRE8 到 FMPRE15。 FMPPE 也会出现同样的问题。

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid=“670216" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1563903/tm4c1290ncpdt-read-write-protect-burn-failure/6021697

    您好、   

    当 FMPRE0 的值为 0x00000000、FMPPE0 的值为 0xFFFFFFFF 时、写入闪存的数据全为 0xFF。 完成上述数据编程后、SWD 接口无法停止启用。请帮助分析可能的原因。

    [/报价]

    这是一种不切实际的组合 (FMPRE0=0 和 FMPPE0=1)、允许对闪存进行编程/擦除、但不允许读取。 请参阅数据表。  

    我们将通过 SWD 接口对芯片进行编程。 编程操作请参考以下说明。 数据可以成功写入芯片的 FMPRE0 到 FMPRE7、但数据无法写入 FMPRE8 到 FMPRE15。 FMPPE 也会出现同样的问题。

    我不知道为什么无法写入 FMPRE8-15。 您能否先解锁器件、以便所有非易失性寄存器都恢复到其出厂设置全 1。 解锁操作完成后、只需对 FMPRE8-15 进行编程即可。 您看到它们编程了吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是一种不切实际的组合 (FMPRE0=0 且 FMPPE0=1)、即允许对闪存进行编程/擦除而不是读取。 请参阅数据表。  [/报价]

    在相同情况下、使用 0x00000000 编程 FMPRE1-7 不会影响芯片、因此问题可能不会由您描述的场景引起。

    我不知道为什么 FMPRE8-15 不能写。 您能否先解锁器件、以便所有非易失性寄存器都恢复到其出厂设置全 1。 解锁操作完成后、只需对 FMPRE8-15 进行编程即可。 您看到他们编程了吗?

    在编程之前、我们已经对芯片执行了解锁操作。 编程 FMPRE8-15 和 FMPRE0-7 之间是否有任何区别? 由于我们同时对这 16 个寄存器进行编程、因此 FMPRE0-7 的数据可以写入芯片、但 FMPRE8-15 不能。 请提供这 16 个寄存器的编程过程的详细说明。 我想将其与我们的业务进行比较。 谢谢!

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在相同情况下、使用 0x00000000 编程 FMPRE1-7 不会影响芯片、因此问题可能不是由您描述的场景引起

    我很困惑。 在上一篇文章中、您说过“当 FMPRE0 的值为 0x00000000、FMPPE0 的值为 0xFFFFFFFF 时、写入闪存的数据全为 0xFF“。 这就是为什么我说这种结合是不现实的。

     

    我们在编程之前对芯片执行了解锁操作。 编程 FMPRE8-15 和 FMPRE0-7 之间是否有任何区别? 由于我们同时对这 16 个寄存器进行编程、因此 FMPRE0-7 的数据可以写入芯片、但 FMPRE8-15 不能。 请提供这 16 个寄存器的编程过程的详细说明。 我想将其与我们的业务进行比较。 谢谢

    这就是为什么我问您是否可以首先解锁设备、并且只对  FMPRE8-15 进行编程、而不对 FMPRE0-7 进行编程。 您可以尝试一下吗? 我想知道您是否只对 FMPRE8-15 进行编程而不是对 FMPRE0-7 进行编程、写入可以工作吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很困惑。 在上一篇文章中、您说过“当 FMPRE0 的值为 0x00000000、FMPPE0 的值为 0xFFFFFFFF 时、写入闪存的数据全为 0xFF“。 这就是为什么我说这种结合是不现实的。

    FMPRE1 为 0x00000000、FMPPE1 为 0xFFFFFFFF、对芯片没有影响。 但是、FMPRE0 为 0x00000000、FMPPE0 为 0x00000000、但芯片仍受影响。 因此、这不应是原因。

    这就是为什么我问您是否可以首先解锁设备、然后只对  FMPRE8-15 进行编程、而不对 FMPRE0-7 进行编程 。 您可以尝试一下吗? 我想知道,如果你只编程 FMPRE8-15 而不是 FMPRE0-7,可以写工作吗?[/报价]

    我又试了一次,但 FMPRE8-15 仍然无法刻录到芯片中。

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

    您好、

     您只在一个芯片还是多个芯片上看到问题? 您能在 EK-TM4C1294XL Launchpad 板上重复同样的问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否只在一个芯片或多个芯片上看到了问题? 您能在 EK-TM4C1294XL Launchpad 板上重复同样的问题吗?

    TM4E129BNCZAD 也有同样的问题,我没有任何其他芯片可用。 我手头没有 EK-TM4C1294XL Launchpad 板。 您能帮助验证一下吗? 谢谢!

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

    您好、

     我会运行一些测试并与您一起返回。

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

    您好、

     我对 FMPRE8-15 寄存器进行编程。 请参阅下面的第一张图。 它会一直工作到下一次下电上电。 请参阅第二张图。 下电上电后、FMPRE8-15 未提交。 我意识到这个问题是由于 MEM#18 勘误表造成的。 有关详细信息、请参阅勘误表。 上电后、每次在应用程序中重新提交寄存器。  

    下电上电后、FMPRE8-15 寄存器再次变为 0xFFFFFFFF。  

    下面是我使用程序 FMPRE8-15 的代码

        HWREG(FLASH_FMA) = 0x10;
        HWREG(FLASH_FMPRE8) = 0x0;
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
        while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
        {
        }
        HWREG(FLASH_FMA) = 0x12;
        HWREG(FLASH_FMPRE9) = 0x0;
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
        while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
        {
        }
        HWREG(FLASH_FMA) = 0x14;
        HWREG(FLASH_FMPRE10) = 0x0;
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
        while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
        {
        }
        HWREG(FLASH_FMA) = 0x16;
        HWREG(FLASH_FMPRE11) = 0x0;
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
        while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
        {
        }
        HWREG(FLASH_FMA) = 0x18;
        HWREG(FLASH_FMPRE12) = 0x0;
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
        while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
        {
        }
        HWREG(FLASH_FMA) = 0x1a;
        HWREG(FLASH_FMPRE13) = 0x0;
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
        while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
        {
        }
        HWREG(FLASH_FMA) = 0x1c;
        HWREG(FLASH_FMPRE14) = 0x0;
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
        while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
        {
        }
        HWREG(FLASH_FMA) = 0x1e;
        HWREG(FLASH_FMPRE15) = 0x0;
    
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid=“93620" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1563903/tm4c1290ncpdt-read-write-protect-burn-failure/6029923 ] 我对 FMPRE8-15 寄存器进行编程。 请参阅下面的第一张图。 它会一直工作到下一次下电上电。 请参阅第二张图。 下电上电后、FMPRE8-15 未提交。 我意识到这个问题是由于 MEM#18 勘误表造成的。 有关详细信息、请参阅勘误表。 上电后、每次在应用程序中重新提交寄存器。  [/报价]

     您好、

        我想再次与您确认、在 TM4C1290NCPDT 芯片的编程过程中无法设置 FMPRE8-15 寄存器。 是这样吗?

    [引述 userid=“670216" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1563903/tm4c1290ncpdt-read-write-protect-burn-failure/6026246

    FMPRE1 为 0x00000000、FMPPE1 为 0xFFFFFFFF、对芯片没有影响。 但是、FMPRE0 为 0x00000000、FMPPE0 为 0x00000000、但芯片仍受影响。 因此、这不应是原因。

    [/报价]

     您好、

       您能帮助分析此问题的原因吗? 如果 FMPRE0 为 0x00000000、则当通过 SWD 接口连接时、芯片无法发送启用暂停的命令。

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

    您好 Xin、

     很抱歉,因为我离开办公室,因为星期三只是回来了。  

        我想再次与您确认、在 TM4C1290NCPDT 芯片的编程过程中无法设置 FMPRE8-15 寄存器。 正确吗?

    没错。 您需要在应用程序中复位后重新提交寄存器。

       您能帮助分析此问题的原因吗? 如果 FMPRE0 为 0x00000000、则当通过 SWD 接口连接时、芯片无法发送启用暂停的命令。

    半启用命令是什么意思?  

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

    您使用半启用命令是什么意思?  [/报价]

    将 0xA05F0003 写入 0xE000EDF0、启用调试并请求内核停止的命令无法发送。

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

      如果将 FPPRE0 编程为 0、则意味着禁用对闪存前 64KB 的读取访问。 调试器无法读取闪存。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
     当您使用 0 对 FPPRE0 进行编程时、这意味着您禁用对闪存前 64KB 的读取访问。 调试器无法读取闪存。  [/报价]

      您的理解不正确。 我说“发送命令停止内核并启用调试失败“、而不是“读取失败“。

      在 TM4C1290NCPDT、TM4E129BNCZAD 和 TM4C1294KCPDT 芯片中将 0x00 写入 FPPRE0 后、发送停止内核并启用调试失败的命令。 将 0x00 写入 FPPRE1-7 不会导致此问题。 请帮助分析原因。 谢谢!

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

    您好、

    将 0xA05F0003 写入 0xE000EDF0 的命令、启用调试并请求内核停止、发送失败。

    您能告诉我谁在写入 0xE000EDF0 吗? 这是 Cortex-M4F 处理器中的调试停止控制和状态寄存器。 通常、这由调试器写入。 您使用哪种调试器? 是否恰好打开 Memory Browser? 如果您打开了 Memory Browser、则调试器将读取闪存内容

    如果您使用 CCS、则需要咨询我们的工具链专家、了解调试器如何写入调试停止寄存器、以及是否涉及任何读取操作、可能是它读取第一个 64KB 的闪存。  

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能告诉我谁是 0xE000EDF0 的写入者吗? 这是 Cortex-M4F 处理器中的调试停止控制和状态寄存器。 通常、这由调试器写入。 您使用哪种调试器? 是否恰好打开 Memory Browser? 如果您打开了 Memory Browser、则调试器将读取闪存内容

    我们使用类似于 J-link 的工具和与 Keil 类似的方法对芯片进行编程、然后遇到了此问题。 您能否使用 J-link 验证此问题?