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.

[参考译文] TM4C1294NCPDT:CallApplication (ui32StartAddr) API 未执行

Guru**** 2398695 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1506770/tm4c1294ncpdt-callapplication-ui32startaddr-api-is-not-executing

器件型号:TM4C1294NCPDT

工具/软件:

尊敬的 E2E 团队:

我们正在尝试修改 usb_tick_update 示例代码、以无线升级固件(FOTA)、但遗憾的是、应用程序代码未在执行

请在下面找到我们设置的详细信息、

->在引导加载程序代码中  、以下端口被激活、

  • UART6.  :调试
  • SSI3  :串行闪存(8 MB)

->串行闪存用于存储从 FTP 服务器下载的固件二进制文件

->在应用程序中成功地将固件存储在串行闪存中

->然后在应用 程序中使用以下代码执行复位操作

HWREG (FORCE_UPDATE_ADDR)= u32_updateResource;//此处提供了固件升级资源信息

HWREG (NVIC_APINT)= NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ;

(*(void (*)(void))(*(uint32_t *) 0x2C)))();

->在引导加载程序代码中、串行闪存数据(用于固件升级)读取以以下方式完成

uint32_t ui32Data = 0;
int16_t i16_dataByte = 0;

static int i32_bytesReadCount = firmware_file_size;

for (i16_dataByte = 0;i16_dataByte < sf_data_chunk;i16_dataByte++)

SSIDataPut (SSI3_BASE、(uint32_t) 0xFF);
SSIDataGet (SSI3_BASE、&ui32Data);

G_ui8SectorBuf[i16_dataByte]=(uint8_t)(ui32Data & 0xFF);
}

G_ui8SectorBuf[sf_data_Block]= 0;

i32_bytesReadCount -> sf_data_chunk;

if (i32_bytesReadCount <= 0)
返回0;
暴露
返回 i32_bytesReadCount;

通过 UART 调试我们观察到的结果、

->所有必要的外设初始化都成功

->  栈指针 程序计数器 发现值有效

->  调用 CallApplication (ui32StartAddr) API 时、

  • 程序被卡住
  • 不执行应用代码、即使在控制器复位和电源重启操作后也是如此
  • 应用代码起始地址 0x00008000
  • 固件文件名 :  PROJECTBIN
  • 固件最大文件大小 9000000
  • 强制更新 ADDR 0x20004000
  • 闪存大小 1 MB (1024 * 1024)

请通过在固件升级后运行应用程序代码来帮助解决此问题

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    ->在应用程序中成功地将固件存储在串行闪存中

    好的。 我假设您的新固件已成功编程到外部串行闪存中。  

    您如何对外部串行闪存进行编程? usb_stick_update 示例假定固件已存储在 USB 记忆棒中。 USB 记忆棒通过 PC 文件系统与固件一起预存储。 您必须采用自己的方法将固件存储到串行闪存中、对吧?  

    [引述 userid="637521" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1506770/tm4c1294ncpdt-callapplication-ui32startaddr-api-is-not-executing

    ->然后在应用 程序中使用以下代码执行复位操作

    HWREG (FORCE_UPDATE_ADDR)= u32_updateResource;//此处提供了固件升级资源信息

    HWREG (NVIC_APINT)= NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ;

    (*(void (*)(void))(*(uint32_t *) 0x2C)))();

    [/报价]

    我想这是引导加载程序中的代码、对吗? 我可以在 usb_tick_update.c 文件中看到类似的代码。  

    当 运行 HWREG (NVIC_APINT)= NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ 时、将进行软件复位。 为什么要 在它后面加上(*(void (*)(void))(*(uint32_t *) 0x2C)))? 我认为它不会被执行、因为已经发生了重置。 AT 矢量0x2C 是什么? 您是否在使用它?

    Unknown 说:
    ->  调用 CallApplication (ui32StartAddr) API 的时刻、

     ui32StartAddr 是否等于0x8000?

    [引述 userid="637521" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1506770/tm4c1294ncpdt-callapplication-ui32startaddr-api-is-not-executing
    • 不执行应用代码、即使在控制器复位和电源重启操作后也是如此
    • 应用代码起始地址 0x00008000
    • 固件文件名 :  PROJECTBIN
    • 固件最大文件大小 9000000
    • 强制更新 ADDR 0x20004000
    • 闪存大小 1 MB (1024 * 1024)
    [/报价]

    除非您错误键入900kB、否则固件为9MB。 如何运行整个固件? 您只能读取9MB 的部分内容并将其存储在内部闪存中。 内部闪存最大仅为1MB、从0x8000开始。  

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

    1.好的。 我假设您的新固件已成功编程到外部串行闪存中。 ...

    示例代码中提供了 USB、但我们实现了外部串行闪存

     ui32StartAddr 是否等于0x8000?

    是的

    3. 我想这是引导加载程序中的代码、对吗? 我可以在 usb_tick_update.c 文件中看到类似的代码。  ...

    引导加载程序代码中提到了它的使用、我们在应用程序代码中使用了它

    4、 固件为9MB、除非您误键入900kB。 如何运行整个固件?  ...

    感谢您的指向、这是一个拼写错误

    但程序文件只有正确。

    因此、 可执行二进制文件的最大大小可以 达到 900000、但考虑到当前程序文件、它仅为218KB

    如前所述、应用代码调用 API 不会执行、也不存在 SP 或 PC 寄存器错误

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

    您好、

    [引述 userid="637521" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1506770/tm4c1294ncpdt-callapplication-ui32startaddr-api-is-not-executing

    uint32_t ui32Data = 0;
    int16_t i16_dataByte = 0;

    static int i32_bytesReadCount = firmware_file_size;

    for (i16_dataByte = 0;i16_dataByte < sf_data_chunk;i16_dataByte++)

    SSIDataPut (SSI3_BASE、(uint32_t) 0xFF);
    SSIDataGet (SSI3_BASE、&ui32Data);

    G_ui8SectorBuf[i16_dataByte]=(uint8_t)(ui32Data & 0xFF);
    }

    G_ui8SectorBuf[sf_data_Block]= 0;

    i32_bytesReadCount -> sf_data_chunk;

    if (i32_bytesReadCount <= 0)
    返回0;
    暴露
    返回 i32_bytesReadCount;

    [/报价]

     我在粘贴的代码中看不到如何对内部闪存进行编程。 我只看到您读取外部串行闪存。 我假设您已在0x8000处成功将218KB 固件编程到内部闪存。 是这样吗? 您是否可以使用"Memory Browser"查看从0x8000开始的内部闪存内容、并确保确实对新固件进行了编程?

    [引述 userid="637521" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1506770/tm4c1294ncpdt-callapplication-ui32startaddr-api-is-not-executing

    ->然后在应用 程序中使用以下代码执行复位操作

    HWREG (FORCE_UPDATE_ADDR)= u32_updateResource;//此处提供了固件升级资源信息

    HWREG (NVIC_APINT)= NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ;

    (*(void (*)(void))(*(uint32_t *) 0x2C)))();

    [/报价]

    我仍然不清楚上述代码吗? 固件的这一部分是否将从0x8000开始? 或者引导加载程序的上述代码是从0x0开始的吗?

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

    感谢您的答复

    外部串行闪存出现问题

     现在工作正常…