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.

[参考译文] LAUNCHXL-F280049C:FAPI 程序闪存会跳过地址、擦除会跳过扇区

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1199321/launchxl-f280049c-fapi-program-flash-skips-address-and-erase-can-skip-sectors

器件型号:LAUNCHXL-F280049C

调用所有 FAPI Gurus、

在异步擦除模式和只对闪存数据进行编程或自动 ECC 模式期间发现 FAPI 的奇数问题。 添加了#prama 以将优化降低到远低于应用程序的水平、但这并不能帮助解决这些问题。

FAPI 调用通过#pragma 放置在 LSRAM 中、并将 F021_API_F28004x_FPU32_EABI (.bss)复制到 LSRAM 中。 闪存首先初始化5个等待状态、4个导致非法指令异常。

擦除扇区已跳过4个扇区的中间闪存地址、FAPI 和 FSM 未报告错误。 将 代码更改为空白在擦除后检查每个扇区、时间将告诉您这是否有用。 似乎擦除模式可能需要在循环中敲入闪存、直到空白检查成功、这样在 POR 之后它不会导致无效指令异常。 只能通过使用这些扇区的擦除命令中的 F7调试 F6来擦除这两个扇区、几遍调试步骤传递函数 确实擦除了扇区。 确保使用内存浏览器检查您的闪存扇区是否实际被擦除。

在程序模式下、地址指针在首次写入64位后跳过目标指针的2个或4个地址。 这样就会在实际数据之间留下空洞(FFFF)。 测试的两种数据类型(uint16_t x4字)和(float32_t x2字)、每个数据类型具有相同的跳过行为。 尽管 uint16_t 以与 float32_t 相同的方式写入浮点数据 导致64位对齐时出现地址跳转的原因是什么? CPU 或 FPU 知道浮点变量存在、但在调试中未显示其具体情况。

地址指针第二次递增未写入数据后、再次跳过、然后 FAPI 发布异常"无效数据缓冲器长度"。 不过、FAPI 似乎确实导致了异常、而不是4个循环指针。 FAPI 应该在内部添加到起始地址指针、似乎没有这样做。 我们是否必须在每次程序写入后清除状态、该调用不会显示在程序模式流程图或示例中。

 

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

    您好、GI、

    请查看此闪存 API 使用常见问题解答: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/951668/faq-faq-on-flash-api-usage-for-c2000-devices 

    我们将在本周五审核您的帖子。

    谢谢、此致、

    Vamsi

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

    FAPI 用户指南未解释下一个地址 正确的原因、但没有编程的数据、然后跳转到下一个地址。 因此、这4个字0x0009C0A3是(FFFF、FFFF、FFFF、FFFF)、然后它再次开始写入。 此外、提供的128位示例(PG.20-21)在4环路中具有 FAPI 错误检测、因此比较粗略。 如果发生错误、4循环将会中断、 并且不需要在4循环中获取 FSM 状态、除非它轮询 FSM 忙状态。

    似乎编程模式未返回第20页上显示的预期状态 (Fapi_FSM_Ready)  

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

    您好、GI、

    您是否已经了解了我分享的常见问题解答?

    谢谢、此致、

    Vamsi

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

    你(们)好,Vamsi

    否、但感谢您提供常见问题解答链接、并在发布此链接之前进行快速回顾。

    在 FSM 程序模式时序中发现了问题、4个循环不应单独依赖于就绪状态。 也需要等待忙状态。 有156个字要写入、验证将变得复杂、直到程序正常工作。 现在、它只在几个地方使0000无效、但不会跳过地址、结构成员指针的工作效果要好得多。

    注意到该示例、很明显 FSM 程序模式 x49c 的运行速度要快得多。 现在、在4个循环中在 BUSY 和 READY 状态之间添加40µs μ s 延迟宏。

     

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

    您好、GI、

    很高兴它帮助了我们。

    关于 void 0000:您是否说即使在数据中提供0000s、API 也会跳过编程0000s?

    谢谢、此致、

    Vamsi

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

    不是 FSM 只是坚如其果、写入远远超过当前扇区的块大小、并在(int)数据类型之后向第一个(unsigned int)添加0000。

    最坏的情况是、一旦 FAPI 对除 FFFF 以外的扇区进行编程、它就会拒绝擦除它们、并在 POR 之后抛出非法的中断异常。 然而、当成功以外的任何事情发生时、FAPI 会报告成功。 似乎该 FAPI 代码从未在 x49c 上进行过测试、只是无法在100MHz SYSCLK 下正常工作。 我们需要将 FSM 设置为使用较慢的时钟源分频器、但我找不到这样的 driverlib 函数来设置 FSM 时钟预分频。

    请注意、返回状态完全错误、单步执行 F5/F6。 Fapi 无法运行100MHz 时钟速率、或者 PLL 速度可能太快。 MCU 必须以100MHz SYSCLK 运行、并且运行速度有点慢。

    调试与 FSM 寄存器 RWAIT HAL 置位5等待消息。 然而、在 FAPI 对多个扇区进行错误编程并且无法在 POR 之后擦除(抛出 INT 异常"非法指令") FSM RWAIT 默认为0xF 最大值。 调试不能单步执行 Fapi 擦除扇区、因为已设置 Cstat 寄存器位1调试显示发生成功状态。

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

    您好、GI、

    为什么您认为这是频率/等待状态问题?  有什么具体原因? 请提供更多详细信息。

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    CCS XDS110 5.5MHz 时钟可以擦除 FAPI 无法擦除的所有闪存扇区。 我尝试了调试中的所有内容、通过 FAPI 擦除来擦除2个扇区。 当然、FAPI 将返回所有现有的空字节、并像他那样进行擦除。 FSM 时序问题的证明是程序跳过闪存地址、在4环路中添加 FSM 忙状态检查+ 40us 延迟后停止。 使用擦除尝试了相同的 stagey、但他不会收到调试非法指令、然后在扇区具有实际要擦除的数据时在 POR 之后循环。 只要这些部门是空白的,就没有问题。  

    后来发现的 F021库也被复制(.bss)不应存在于 下面所述的 LSRAM 中。  

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

    您好、GI、

    您是从闪存还是 RAM 执行闪存 API?

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    我阅读了常见问题解答、发现200MHz x7无法运行 Fapi、必须减小 SYSCLK 100Mhz、似乎暗示 FSM 和/或 FAPI 具有计时限制。  

    Fapi 处于 RAM 0寄存器速度1优化中。 添加了延迟的代码 snip 在第二天不起作用、程序模式不会向闪存调试单步执行写入任何内容。

    BTW:由于 长度固定为4个字、因此错误没有意义(Fapi_Error_OccasIncorrectDataBufferLength)。 输入缓冲器的长度怎么可能出错? 看起来 Fapi 程序模式代码有指令解码问题、因此无法发布这样一 个模糊的错误消息。

     F021_API_F28004x_FPU32_EABI 在(.bss)下显示 LSRAM0_1可能会解释 Fapi 函数调用无法以高指令解码速度正确执行?

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

    您好、GI、

    您计划将什么 SYSCLK 用于 F280049?

    关于  Fapi_Error_AppoIncorrectDataBufferLength:您能否搜索"使用 Fapi_issueProgrammingCommand()一次可以编程多少位?" 使用常见问题解答中提供了哪些详细信息?

    谢谢、此致、
    Vamsi

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

    SYSCLK=100Mhz、已建立64位。

    此问题似乎与分配为 pu16DataBuffer 的程序数据类型有关。 它无法很好地处理(int)、这种情况在 SDK 中用于电机控制、以及尝试将数据类型转换为无符号 pu16DataBuffer 的 float 和 long。 pu16DataBuffer 似乎需要是一个没有任何符号的非特定动态指针。 因此、程序模式只使用任何数据类型转储到良性未键入程序缓冲区中。

    如果它只是一个数据缓冲区指针、为什么通过 pu16DataBuffer 的程序模式不允许通过定义的 int16t 数据类型 F012.h 的程序模式? 奇怪的数据缓冲区允许 float32_t 为2个字64位、但正在跳过字地址。 FAPI 似乎需要进行广泛的审查、以便更有效地处理 C2000/ARM 数据类型。 可能是 FSM 在较高的 SYSCLK 速度、100MHz 及更高的频率下出现问题的原因。   

    编译器数据类型:

    int、signed int、16位二进制-32768至32767

    FAPI 程序模式:无符号 int 16位二进制0至65535

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

    您好、GI、

    1) 1)让我们首先关闭 SYSCLK 问题: 为什么要将 SYSCLK 配置为大于100MHz?  器件仅支持高达100MHz 的频率。

    2) 2)由于您说在100MHz 下使用4个等待状态时发生了非法陷阱:您使用的时钟源是什么? INTOSC2还是外部?

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1199321/launchxl-f280049c-fapi-program-flash-skips-address-and-erase-can-skip-sectors/4525109 #4525109"] 1)让我们先关闭 SYSCLK 问题: 为什么要将 SYSCLK 配置为大于100MHz?

    常见问题解答提到200MHz MCU 只能运行 FAPI 100MHz.SYSCLK、这就是 FAPI 在高速时运行不正常的点。

    FAPI 的所有这些奇怪问题与 F021库有关、无法将其复制到 LSRAM 中、因此(.bss)必须位于 GS0A 存储器空间。 请在常见问题解答中添加此类注意事项。 另请注意、当 F021库移动到 RAMGS0_A 时、在移动(.bss)后 CCS 调试步进增加了100%

    注意到 F021库通过.bss 加载到 LSRAM 中时、FAPI 会破坏或清除一些控制数据#pragma 变量。