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.

[参考译文] TM4C1290NCZAD:基于 ARM 的微控制器论坛

Guru**** 2501695 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1305285/tm4c1290nczad-arm-based-microcontrollers-forum

器件型号:TM4C1290NCZAD

我项目的系统时钟设置完成了两次、因为在使用 FatFs 函数后、系统时钟将被修改。

为了解决该问题、我们再次完成了系统时钟设置。 这是否有效? 请提供您的答复。

空 main (void)
{
uint32_t time_epoch;
/*
*初始化所有的硬件 IO 和系统外设-
*/
//延迟以稳定上电的源/时钟
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_16MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、40000000);
FPUEnable();
FPULazyStackingEnable();

PP_Screen (ui32SysClock);  //此操作使用 FatFS 函数... 在执行调用  ui32SysClock 后 ...

ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_16MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、40000000);

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

    您好!

     我建议您弄清 PP_Screen 为什么修改时钟配置。 您应该修复自定义函数、使其不会重新配置系统时钟、因为不需要这样做。 它可以仅采用 ui32SysClock、无需触控时钟生成。 我很好奇、它是否与您第二次配置时钟的方式一样有效?  

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

    您好!

    PP_Screen (ui32SysClock)将按照指定的顺序执行闪存擦除、闪存写入和闪存读取。 SSI 接口与 FatFs 一起用于从 SD 卡读取文件并存储到闪存中。

    我只是发现、在最后一步之后、  闪存读取 操作导致将系统时钟修改为0x00008100 (始终)...的问题。

    我们仍然遇到这个问题、无法进一步实施 ROM 引导加载程序、因此我们将感谢您的响应和输入。

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

    您好!

     您能展示您的 PP_Screen 代码吗?

     您如何调用 ROM 引导加载程序? 您提供的详细信息不足以诊断问题。  

     这是一个美国节日周。 响应将延迟。  

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

    我有将近100个文件要从 SD 卡中读取和写入外部闪存。 我正在使用 SSI 接口从 SD 卡读取文件、并 使用 SSI 接口写入外部闪存。 此外、我在每次写入闪存后都在进行闪存读取操作。 之前、我是在完成所有100个文件的写入操作后进行闪存读取操作。 我已经确定该闪存读取操作导致问题修改了时钟值。

    为了解决这个问题、我已经在每次对闪存进行写入操作之后执行了闪存读取操作。 此次更新时、时钟值未被修改、因此保持稳定。

    现在、请指导我如何以从 SD 卡读取 firmware.bin 并加载到内部闪存中的类似方式使用 ROM_Bootloader。 我能否使用内部闪存写入 API 调用将固件文件加载到内部闪存(片上)中。

    请确认要放置在 SD 卡中的固件.bin 文件的名称、以便 ROM_Bootloader 通过 SSI 接口读取该文件。  我知道引导加载程序需要使用 SSI0。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为解决此问题,我在每次对闪存进行写入操作后执行了闪存读取操作。 使用此更新时,时钟值不会被修改,并且是稳定的。

    很高兴您通过解决方案解决了该问题。

    现在、请指导我如何以类似的方式使用 ROM_Bootloader、从 SD 卡读取 firmware.bin 并加载至内部闪存。 我可以使用内部闪存写入 API 调用将固件文件加载到内部闪存(片上)吗[/报价]

    我想我不清楚您的应用。 您到目前为止的应用说明似乎是通过 SSI 接口从 SD 卡中读取一些文件、然后通过 SSI 接口写入外部闪存。 是这样吗? 您正在从 SD 卡读取的100个文件是什么? 是这些固件还是一些数据文件?

    我不明白这里为什么涉及 ROM_Bootloader? 通常情况下、用户将使用基于 ROM 或基于闪存的引导加载程序来升级 MCU 上的现有固件。 也许我没看到什么内容、您似乎希望使用 ROM 引导加载程序读取 SD 卡、然后写入外部闪存。 这是你要问的吗?

     首先、 MCU ROM 引导加载程序无法读取 SD 卡。 ROM 引导加载程序只能 从 UART0、SSI0、I2C0、USB 或 EMAC 等接口中读取。 有关基于 ROM 的引导加载程序、请参阅第2节中的引导加载程序用户指南。  https://www.ti.com/lit/pdf/spmu301

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

    请查找所需应用的设计。

    SD 卡通过 SSI0与指定的 MCU 相连。 SD 卡将具有文件"firmware.bin"、这是要更新到片上闪存中的新应用固件文件。 我知道 ROM 引导加载程序可以使用 SSI0接口来更新固件。

    我的应用程序已经使用 SSI0通过 SD 卡访问 firmware.bin。 在特定条件下,我的应用程序将决定调用 ROM_UpdateSSI()函数来更新固件。 我知道 ROM_UpdateSSI ()函数将转换至引导加载程序模式、并擦除片上 MCU 闪存、然后通过 在 UART0、SSI0、I2C0、USB 或 EMAC 等接口之间读取数据、以使用新固件进行编程。

    .e2e.ti.com/.../Boot-Loader.docx

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

    ROM_UpdateSSI 将按照引导加载程序用户指南的第5节所述实施串行更新。 详细了解 SSI 传输的数据包处理和传输层协议。 ROM_UpdateSSI 不支持/处理 FAT 文件系统以读取 SD 卡中存储的文件。 您将需要自定义自己的基于闪存的引导加载程序。 同样、请执行第5部分、因为这是 MCU 和主机之间用于处理数据包的协议。 除了 TivaWare SDK 中提供的外、您还需要针对您的应用进行自定义。  

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

    我知道 ROM 引导加载程序不适合我的应用程序。

    现在、请指导我如何针对要求实施闪存引导加载程序。

    我的要求是上传/更新存储在 SD 卡中的 firmware.bin、该卡通过 SSI2与 MCU 连接、在短接 GPIO 引脚时、必须调用引导加载程序并且应该上传固件。

    我已经看了两个示例- boot_deme1和 boot_serial、并根据我的要求更新了 bl_config.h 文件。

    boot_demo1是应用程序代码应负责检测 SW1开关、在检测到该开关时、应调用引导加载程序。

    此外、boot_serial 提供了各种接口、我在 bl_config.h 中启用了 SSI 相关接口。

    现在、在哪里可以在我的项目中添加 SD 卡文件读取函数。

    e2e.ti.com/.../6165.bl_5F00_config.h

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在,在哪里添加我的项目中的 SD 卡文件读取函数。

    您好!

     您可以自由地修改引导加载程序。 请查看 bl_main.c 文件中的 Updater ()函数和其他相关函数。 Updater ()函数用于更新所选端口的固件。 查看您是否插入自己的 Hook 函数来访问 SD 卡。 如何自定义引导加载程序以使其与 SD 卡配合使用取决于您。

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

    非常感谢您的详细信息。  

    在集成 SD 卡代码之前、我有一个重要问题。

    我明白  JumpToBootLoader ()  应在检测到开关按压操作或其他事件后根据我的意愿从我的应用中调用。

    但我看过了跳转到引导加载程序的代码。


    JumpToBootLoader (空)
    {
    //
    //我们必须确保在进入 SysTick 之前关闭 SysTick 及其中断
    //启动加载程序!
    //
    MAP_SysTickIntDisable (); // SysTick 被禁用!!! 即我的 FatFs 必须填写
    MAP_SysTickDisable ();    // SysTick 被禁用!!! 即我的 FatFs 必须填写

    //
    //禁用所有处理器中断。 而不是禁用它们
    //一次一个对 NVIC 的直接写入可以禁用所有
    //外设中断。
    //
    HWREG (NVIC_DIS0)= 0xffffffff;
    HWREG (NVIC_DIS1)= 0xffffffff;
    HWREG (NVIC_DIS2)= 0xffffffff;
    HWREG (NVIC_DIS3)= 0xffffffff;

    //
    //将控制权返回给引导加载程序。 这是对 SVC 的调用
    //引导加载程序中的处理程序。
    //
    (*(void (*)(void))(*(uint32_t *) 0x2C))();

    ----------------

    要使用 FATF 访问 SD 卡、我必须启用 SysTick 调用、因为 FatFs 需要  disctimerproc ()  在10ms 回调下调用、使 FatFs 正常工作以访问 SD 卡文件。 但 JumpToBootLoader () 禁用了 SysTick 调用,如上所示。 那么、我如何才能访问 SD 卡?

    另外,请建议我任何其他方式来访问 SD 卡中的文件。

    下一步是:如何修改 Updater()?

    1) Updater()  函数有一条 switch 语句、该语句的值为 g_pui8DataBuffer[0] 、例如用于执行某些操作的 COMMAND_ping。 这些命令有什么用?

    2) 2)我是否需要将 SD 卡文件内容存储到 g_pui32DataBuffer 中?

    3) 3)支持的最大大小为65、这意味着我一次最多可以从 SSI 接口发送65个字节?

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

    o 使用 FATF 访问 SD 卡、我必须要求启用 SysTick 呼叫、因为 FatFs 需要  disctimerproc ()  在10ms 回调下调用、使 FatFs 正常工作以访问 SD 卡文件。 但 JumpToBootLoader () 禁用了 SysTick 调用,如上所示。 那么、我如何才能访问 SD 卡?

    另外,请建议我任何其他方式来访问 SD 卡中的文件。

    [/报价]

    禁用应用程序中断旨在确保处理器可以从应用程序成功跳转到引导加载程序。 想一想、当您跳转到引导加载程序、并且出现 PWM、I2C、UART 或任何外设等应用中断时、会发生什么情况。 或者就在您能够跳转到引导加载程序之前、就有一个异步外设加入进来。 一旦您进入了引导加载程序、它就没有能力处理任何中断。 如果您必须保留特定中断、则需要创建矢量表和 ISR 来处理中断。 我还没有遇到仍然需要处理应用程序中断的引导加载程序、因此这只是一个建议。 您需要根据我提供的说明了解如何处理该问题。 同样、您正在设计自定义引导加载程序、您可以根据自己的应用需求执行一些操作。  

    1) Updater()  函数有一条 switch 语句、该语句的值为 g_pui8DataBuffer[0] 、例如用于执行某些操作的 COMMAND_ping。 这些命令有什么用?

    [/报价]

    我多次说过、串行引导加载程序(SSI、UART、I2C)使用自定义协议来下载固件。 用户指南中介绍了相关命令。 主机软件可以发出 COMMAND_ping 命令来 询问客户端的存在情况和健康状况。 另请参阅此串行引导加载应用手册、它会有所帮助。 虽然它用于 UART 引导加载、但也可以重复使用这一概念、但 https://www.ti.com/lit/pdf/spma074

    2) 2)我是否需要将 SD 卡文件内容存储到 g_pui32DataBuffer 中?

    3) 3)支持的最大大小为65、这意味着我一次最多可以从 SSI 接口发送65个字节?

    [/报价]

    我倾向于认为、如果您尽可能多地重用现有代码、这样做会更省力。 如果为了编译自定义引导加载程序而必须修改大小和任何其他更改、可以随意执行此操作。 抱歉、我们没有这样的 SD 卡引导加载程序经验、我只能建议这么做。  

    [/quote]
    [/quote][/quote]