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:更新闪存导致挂起。 Tiva C 系列- Tm4c129NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/592032/tm4c1290ncpdt-updating-the-flash-leading-to-hang-tiva-c-series---tm4c129ncpdt

器件型号:TM4C1290NCPDT
主题中讨论的其他器件:UNIFLASH

你(们)好

上下文: 我已将闪存分为3个部分: 0x000 ->闪存引导加载程序起始地址。  0x4000 -> Tiva 应用和0x82000 -> Tiva 应用

这是为 Tiva 的失效防护升级完成的。

现在,问题是:我正在使用应用程序更新 Tiva 的闪存,它正在挂起。 我正在使用

我正在使用代码:

BL_FLASH_program_fn_hook (g_ui32TransferAddress、
(uint8_t *)&g_pui32DataBuffer[1]、
((ui32Size + 3)&~3));

即时写入闪存。 应用数据通过 UART 发送到 Tiva、 Tiva 使用上述 API 即时写入应用。

如果 Tiva 从0x4000引导、它将写入 0x82000中的数据、如果 Tiva 从0x82000引导、它将写入第一个分区-> 0x4000。  

该代码工作正常、现在已开始出现问题、  

闪存无法完全更新。 它介于两者之间。

此 API 是否适用于所有级别的优化?

谢谢、

Sanchit Mehra

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Sanchit 您好。
    您如何实现选择性引导加载? 0x4000处的 MyApp_copy_A 更新0x82000处的 MyApp_copy_B、反之亦然。 还可以 但是、在复位后、如何指示模块从 A 或 B 应用程序开始? 引导加载程序如何决定开始哪个应用程序的副本? 您说它正在工作、但现在它挂起了。 在工作时、使用 LM 闪存编程器或 UniFlash 可能会发生0x4000和0x82000上的固件更新? 我提出这一问题是因为我想说的是、如果是这样。
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有听说过引导加载程序不能在不同的优化级别下工作的任何报告。 您说它以前工作过、但现在挂起了。 您改变了什么? 您是否在 CCS 暂停后查看过代码? 程序计数器在什么函数中(或在什么地址)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 ,Sanit,

    我之所以指出优化的原因是:当我启用全局优化时,它可以工作,它没有挂起,但在优化级别为0时挂起。

    其次,这不是引导加载程序,而是应用程序更新不同闪存地址中的另一个应用程序。

    0x4000更新0x82000、0x82000更新0x4000闪存区域。

    首先,这些起始闪存地址是否正确? 两种应用程序?

    其次,闪存引导加载程序引导应用程序时是否可以使用 CCS 调试应用程序 ox4000? 首先、闪存引导加载 程序启动、然后根据当前分区的信息从0x4000或0x82000加载应用程序。

    感谢你的帮助

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Sanchit。
    您的初始帖子并不意味着两个不同的应用程序、而是同一应用程序的两个副本。 无论如何、在复位/引导后、引导加载程序如何决定跳转到哪个应用程序并启动? 按钮? 其他意思?
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    是的、它们是具有不同链接器文件的相同应用。 我在 EEPROM 中设置当前应用程序加载的闪存地址,以确定必须更新闪存的哪个区域。

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

    [引用 user="Sanchit Mehra"]其次,闪存引导加载程序引导应用程序时是否可以使用 CCS 调试应用程序 ox4000?

    是的、我建议当引导加载程序挂起时、您连接 CCS、然后确定程序计数器的位置。 (我会执行 View->Disassembly)。 根据 PC 的地址、您可以加载引导加载程序或应用程序的符号、或者您可能会看到 PC 指向 ROM。 它还可能卡在故障 ISR 中。 这些信息可能有助于您了解正在发生的情况。

    [引用 user="Sanchit Mehra"]我之所以指出优化的原因是:当我启用全局优化时,它起作用,它不会挂起,但在优化级别为0时挂起。

    如果将优化级别恢复为-O2、它是否会再次工作?

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

    是的、它可以与 O2一起使用。
    但是,第二个应用程序选择的闪存地址是否正确:0x82000?

    谢谢、
    Sanchit Mehra
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定我是否理解您的问题。 是的、地址0x82000是此器件的有效闪存地址。 0x82000不是您选择的地址吗? 您是否未配置链接命令文件以将第二个应用程序链接到该地址的闪存中? 与 CCS 连接时、是否会看到第二个应用程序的代码编程到该地址空间中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:

    我询问地址的原因是,我在某个位置读出地址必须是16k/0x4000的倍数。
    这只是一个问题、
    是的、链接器命令全部正常。

    其次、引导加载程序中没有问题。 通过在系统引导时加载应用程序、它可以正常工作。

    第三,我必须了解如何调试应用程序(如果由自定义的闪存引导加载程序引导/加载)。
    因为、我想 CCS 不会获得应用程序的控制权、因为0x000处的闪存引导加载程序会在不使用 CCS 的情况下加载我的应用程序。

    谢谢、
    Sanchit
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、现在我了解了地址。 闪存由16KB 扇区擦除、因此从0x80000到0x81FFF 的地址也将被擦除。 如果要保留该范围中的先前数据、则可能是问题所在。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:

    嗯、我的两个应用大小都最大为100KB。
    闪存被 LM Flash pro 擦除、直到二进制文件的大小。 和 sflash 实用程序,然后升级开始

    如果是问题、它会在每次升级时出现。

    谢谢、
    Sanchit Mehra