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.

[参考译文] RM46L430:F021_API v02.01.01接受数据/预取中止

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/571475/rm46l430-f021_api-v02-01-01-takes-data-prefetch-aborts

器件型号:RM46L430
主题中讨论的其它部件:RM46L852、HALCOGEN

您好!


我正在尝试执行自定义的 CAN 引导。 它基于 Hercules、可下载 R48处理器的示例源。 我正在使用已关闭优化的 CCSv6。


我使 CAN 工作(在注释掉闪存擦除/写入)。


现在、我尝试实际闪存、这是引导加载程序存在的原因。

问题是当我运行 Hercules 程序时、它挂起、而当我暂停时、PC 位于 ASM 矢量表中。 FAULT 指令地址为0x10、因此没有帮助引脚指示故障。 在向量上放置断点并不能更好地指示故障。

奇怪的是、如果我执行系统复位并单步进入 f021库、则不会发生陷阱、并且闪存会被擦除并稍后写入。 是的、我单步进入我的案例中的 RAM 代码、地址为0x0800_a588... 步进需要很长的时间和很多周期、但是我有单步执行、将3个16字节的块写入0x20000 +的闪存。 在此过程中的任何时候、如果我将 ccsv6设置为"Go"、则处理器最终会在向量中挂起。 因此、JTAG 上的 ccsv6会改变足够的处理器状态以"修复"中止问题、或者 R46配置中存在速度问题。

有什么想法吗?


是否可以获取库的源代码、以便我可以尝试输入一些测试延迟等?

谢谢、Steve

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

    源不可分发。 明天我将更详细地了解一下您的场景、并告诉您是否可以看到任何具体问题。 同时、如果您可以附加一个演示该问题的简化项目并将其发布在此处、我也可以在我的工作台上调试该问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好主意。 我将尝试构建一个更易于调试的简单测试项目。

    此致、Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大约一个月前我下载了这个 spna183.zip、将其解压、并将 ccsv6瞄准 rm46中的 boot_can。

    我将处理器更改为电路板的 rm46l852 SOC。

    我不得不对包含路径和资源路径大惊小怪、以匹配我在系统中放置内容的位置。 然后、我要构建它。

    我修改了 bl_dcAN.c 文件以仅测试闪存问题。 在 while (1)之后的 updateRCAN 中、我将其放入:



    //在仅执行升级闪存部分而不是 CAN 内容的循环中进行 Hack
    G_ulTransferAddress = 0x20000;
    memset (g_pulDataBuffer、0xA5、buffer_size);
    ulBytes = buffer_size;
    oReturnCheck = Fapi_BlockErase (ucBank、g_ulTransferAddress、g_ulTransferSize);

    //如果发生访问冲突,则返回错误。
    //
    if (oReturnCheck)

    ucStatus = CAN_CMD_FAIL;
    UART_putString (UART、"\r 擦除闪存失败:");
    中断;


    /*初始化闪存包装程序寄存器*/
    oReturnCheck = 0;
    oReturnCheck = Fapi_BlockProgram (ucBank、g_ulTransferAddress、(uint32_t)&g_pulDataBuffer[0]、ulBytes);

    //如果发生访问冲突,则返回错误。
    if (oReturnCheck)

    //指示闪存编程失败。
    ucStatus = CAN_CMD_FAIL;
    ucUpdateStatus = 0;
    UART_putString (UART、"\r 程序闪存失败:");
    中断;

    其他

    //现在更新要编程的地址。
    g_ulTransferSize -= ulBytes;
    G_ulTransferAddress += ulBytes;
    ucUpdateStatus = 1;


    //退出主循环
    中断;


    我只需运行该代码并等待几秒钟的无操作、然后单击暂停、就会看到它在向量中旋转。

    有趣的是、如果我单步执行擦除和编程代码、并继续单步执行基于 RAM 的代码、则擦除和编程内容都可以正常工作。

    因此、如果您有 rm46处理器、我认为您可以重现此问题。

    Steve
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要清除、SOC 是 rm46l852而不是 rm46l430、如果需要的话。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Steve、

    您能告诉我它卡在哪里(哪一行)吗? 它可能卡在 BL_FLASH.c 中的某个位置

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

    您好 QJ、

    不、我无法分辨它在哪里中止。我认为它总是在基于 RAM 的库中失败。

    我无法从寄存器中得知。 在链路寄存器中、它具有20014、这是它从0x20000开始闪烁的地方

    我不确定如何解码所有中止信息、因此我认为这里是有趣的内核和 cp15寄存器。

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

    您好 Steve、

    我将您的代码复制到了我的项目中、它可以对闪存进行擦除和编程、而不会出现任何问题。  

    闪存操作代码应放置并在 SRAM 中执行、而不是在闪存中执行。  sys_startup.c 中的_copyAPI 2RAM_()用于将这些代码复制到 SRAM 中。  

    此致、

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

    您好 QJ、

    谢谢、我希望它能正常工作。

    正如我说过的、如果我只是单步执行代码、它将对我有效。 是的、ccsv6将单步进入 RAM、在此库可进行反汇编。 那么、在某种速度设置中可能会出现问题?

    您是否在 rm46x 处理器上进行了测试?  我的晶体为16MHz、因此我假设库根据需要设置其他时钟(我认为它是160MHz)。 此外、我假设库处理闪存等待状态设置。

    您是否从 spna183.zip 中的代码开始?

    我不确定我在哪里得到 f021_API、我认为它是在某些怪兽 halcogen zip 文件中预构建的。

    Steve。

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

    您好 QJ、

    我对 库的可见部分和 RM46x 16 32位 TRM spnu514b.pdf 感到困惑-

    您的库使用:

    C:\users\scalfee\scalfee_1\scalfee_1\Triton\main\CTL\SafetyMCU_Bootloader\inc\F021_API_Constants.h:
    49 #define F021_FLASHECC_MAP_END 0xF04FFFFFU
    50
    51:#define F021_CPU0_REGISTER_ADDRESS 0xFFF87000U
    52.
    53 /*特定 TI OTP 偏移*

    C:\users\scalfee\scalfee_1\scalfee_1\Triton\main\CTL\SafetyMCU_Bootloader\inc\F021_API_Registers.h:
    74 #define FWP_WRITE_OFFSET 0x120U
    75 //创建指向 FWPWRITEx 寄存器的字节访问器指针的宏
    76:#define FWPWRITE_BYTE_ACCESTER_ADDRESS ((FwpWriteByteAccessorType*)(F021_CPU0_REGISTER_ADDRESS + 0x120U)
    77 //创建指向 FWPWRITE_ECC 寄存器的字节访问器指针的宏
    78:#define FWPWRITE_ECC_BYTE_accor_address ((FwpWriteByteAccessorType*)(F021_CPU0_register_address + 0x140U))
    79 /*创建指向 FWPWRITEx 寄存器的 DWORD 访问器指针的宏*/
    80:#define FWPWRITE_DWORD_ACCEMOR_ADDRESS ((FwpWriteDWordAccessorType*)(F021_CPU0_REGISTER_ADDRESS + 0x120U))

    但 TRM 不会讨论偏移量为0x120的闪存基址 A fff8_7000的寄存器

    实际上、它完全跳过它们。 第279页

    FFF8 706Ch FDIAGCTRL 诊断控制寄存器第5.8.26节
    FFF8 7070h FRAW_DATAH 未更正原始数据高电平寄存器部分5.8.27
    FFF8 7074h FRAW_DATAL 未更正原始数据低寄存器部分5.8.28
    FFF8 7078h FRAW_ECC 未校正原始 ECC 寄存器第5.8.29节
    FFF8 707Ch FPAR_OVR 奇偶校验覆盖寄存器第5.8.30节
    FFF8 70C0h FEDACSDIS2闪存错误检测和校正扇区禁用寄存器2第5.8.31节
    FFF8 7288h FSM_WR_ENA FSM 寄存器写入使能部分5.8.32
    FFF8 72A4h FSM_Sector FSM 扇区寄存器第5.8.33节

    也许您可以对 SOC 上的实际情况有所了解?

    谢谢、Steve

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

    您好!

    我刚才确认我使用的是最新的 f021 API v02.01.01

    Steve

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

    您好 Steve,

    附件是我用于在 RM46x Launchpad 上进行测试的项目。 我也使用了 f021 API v02.01.01。 闪存 API 位于 C:\ti\hercules\F021闪存 API\02.01.01

    此致、

    e2e.ti.com/.../0363.SafetyMCU_5F00_Bootloader.zip

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

    您好 QJ

    我仍在尝试构建此功能。 最后、我想知道如何加载项目所需的确切编译器版本。

    现在、我找不到您的项目"rtsv7R4_A_le_eabi.lib"中所需的 RTS 库。 这存在于较旧的编译器中、但不存在于16.6中? 因此链接失败。

    我正在使用  CCS 版本:6.2.0.00050

    此致、Steve

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

    CCS 将为您动态构建库、但您需要告诉它自动选择库。

    刚才在 这里回答了类似的问题:e2e.ti.com/.../2100932
    项目属性选项卡的屏幕截图、您需要在其中进行此选择。

    或者、您可以从命令提示符中手动调用 mklib 脚本、但让 CCS 更轻松地为您执行此操作。
    Wiki 页面 processors.wiki.ti.com/.../Mklib 上介绍了手动方法

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

    使用您的项目、我能够使我的小型 Hack 测试正常工作。

    我使用了与之前相同的闪存 API、但您使用的 SafetyMCU_Bootloader 代码与我下载的代码不同。 因此差异必须存在。

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

    您好、Steve、

    请在 while (1)循环中找到包含您的代码的 CAN 引导加载程序。 它适用于单步执行和一次性执行。 引导加载程序使用闪存 API 修订版2.01.01、该库位于 C:\ti\Hercules \F021闪存 API\02.01.01中

    此致、

    e2e.ti.com/.../6175.SafetyMCU_5F00_Bootloader.zip

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

    您好 QJ、

    此 zip 与您先前发送的 zip 是否不同? 我还能够使测试代码运行。

    谢谢、Steve

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

    您好、Steve、

    唯一的区别是、新的 zip 项目在安装文件夹(c:\ti\hercules\...)中使用头文件和闪存 API。 而不是引导加载程序文件夹中的文件和库。 新的 zip 文件不包含其他引导加载程序(SPI、UART 等)。

    此致、

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

    您好 QJ、


    我现在的工作状态相当好。

    我确实注意到 rm46上有错误的指令陷阱。

    如果我调用 fapi_BlockErase (0、pagealignedaddr、1)、我会得到一个错误的 instp 陷阱。

    如果我使用 Fapi_BlockErase (0、pagealignedaddr、0x400)调用它、它将起作用。

    1或0x400都不是页面大小、因此有点奇怪。 但是、我给出了权变措施。 请考虑这是一个错误报告。

    此致、Steve

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

    此闪存是否具有最小写入大小? 在 Tiva 上、我可以擦除一个页、然后使用每个位的写操作逐位清除它。 这使我能够创建系统活动记录、然后在闪存中标记其连续发生。 因此、任何崩溃或重启都可能会继续、而我之前也不会这么做。

    在 Hercules 上、似乎有一个最小写入大小-如果我在一个字节中将一个位写入零并且字节不是全部为1、那么它似乎不会引起一个错误、但是在一个功率循环上、内容丢失。 是否存在最小写入大小? 它是一个字节吗? 它是16字节、是完整页吗?

    感谢您的建议。

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

    RM46上的闪存受 ECC 保护、有时当您尝试执行看起来"正常"的操作时、例如从"1"->"0"翻转一个位
    将导致一个或多个 ECC 位从0更改为1、这需要扇区擦除。 因此、它实际上并不适合它
    该用例。

    如果您需要 EEPROM 类型的功能、应查看 FEE 驱动器。 这使用特殊的 EEPROM 仿真组来仿真 EEPROM。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Anthony、

    您知道闪存的对齐要求和最小写入大小实际上是什么吗? 我想我有足够的闪存、希望保持简单。

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

    从 ECC 的角度来看、它是64位(并与64位边界对齐)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Steve、

    您还应注意程序闪存与指定用于 EEPROM 仿真的数据闪存的最大 W/E 周期能力。 组设计所固有的两种写入/擦除能力之间存在很大的差异。 此外、使用 FEE 驱动器、ECC 更新和数据写入大小由 FEE 驱动器管理、因此无需深入了解闪存仿真原理。 这是由 Tiva 器件在 HF/ROM 中处理的、这就是为什么它对您来说是透明的。 Hercules 保持了更高水平的灵活性、这意味着硬件中内置的功能更少、并且在理解算法时复杂性更高。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、

    您或 Anthony 是否知道哪个文件包含网站上最新和已知良好的"收费驱动程序"谷歌搜索不清楚。

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

    它包含在 HALCoGen 中。