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:boot.asm 中的无限循环

Guru**** 2553680 points
Other Parts Discussed in Thread: TM4C1294KCPDT, TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/922611/tm4c1294ncpdt-endless-loop-in-boot-asm

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:TM4C1294KCPDT

您好!

我正在处理一个项目、它卡在 boot.asm 中  

我无法跟踪这种情况的发生原因和原因。 是否有办法获得该信息或任何人对此有任何想法?

它是非 RTOS 项目。

这是它卡住的地方

NVIC_FAULT_STATUS 值为 0x00000000

有人可以帮助我解决这个问题吗?

谢谢。

-Deepak

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

    Deepak、您好!

     不确定问题是什么。 我有几个问题和一些建议。

     您在闪存中有什么程序? 您是否还记得在加载新程序后是否出现问题?

     2.程序是否运行到 main()?  

     3.如果您有另一个板,您可以在它上尝试相同的程序吗? 您可以在不同的电路板上重复同样的问题吗?

     4.如果加载另一个程序,是否可以重复相同的问题? 请尝试一个简单的程序、如"Hello"或"Blinky"示例。  

     

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

    您好、Charles、

    我从进入该状态的位置中找出了这个状态。我正在使用一个名为  FlashPBSave 的函数。


    我没有对此函数进行任何更改。 这对于 TM4C1294KCPDT 工作正常。

    这是否与,y 控制器更改为 TM4C1294NCPDT 有关?

    这是功能

    无效
    FlashPBSave (uint8_t * pui8Buffer)

    uint8_t * pui8新;
    uint32_t ui32Idx、ui32Sum;

    //
    //检查参数。
    //
    assert (pui8Buffer!=(void *) 0);

    //
    //查看闪存中是否有有效的参数块。
    //
    if (g_pui8FlashPBCurrent)

    //
    //将序列号设置为比最近的序列号大1
    //参数块。
    //
    pui8Buffer[0]= g_pui8FlashPBCurrent[0]+ 1;

    //
    //尝试立即写入新的参数块
    //最近参数块。
    //
    pui8New = g_pui8FlashPBCurrent + g_ui32FlashPBSize;
    if (pui8New = g_pui8FlashPBEnd)

    pui8New = g_pui8FlashPBStart;


    其他

    //
    //闪存中没有有效的参数块,所以设置序列
    //将此参数块的数量设为零。
    //
    pui8Buffer[0]= 0;

    //
    //尝试在闪存的开头写入新参数块
    //参数块的空间。
    //
    pui8New = g_pui8FlashPBStart;

    //
    //计算要写入的参数块的校验和。
    //
    对于(ui32Idx = 0、ui32Sum = 0;ui32Idx < g_ui32FlashPBSize;ui32Idx++)

    ui32Sum = pui8Buffer[ui32Idx];

    //
    //将校验和存储到参数块中。
    //
    pui8Buffer[1]+= ui32Sum;

    //
    //查找存储此参数块的位置。 这个无限循环
    //将在找到有效位置时显式细分。
    //
    while (1)

    //
    //查看此位置是否在擦除块的开头。
    //
    if ((((uint32_t) pui8New &(flash_sector_size - 1))= 0)

    //
    //擦除闪存的这个块。 这不会假设
    //如果闪存的这个块已经损坏,擦除成功
    //使用太多。 考虑到它的频率极低
    //写入参数块,这可能永远不会失败。
    //但是,这一假设并不是为了安全。
    //
    map_FlashErase (((uint32_t) pui8New);

    //
    //循环浏览闪存的这一部分,查看是否全部为1 (在其他中
    //字、它是闪存的已擦除部分)。
    //
    对于(ui32Idx = 0;ui32Idx < g_ui32FlashPBSize;ui32Idx++)

    if (pui8New[ui32Idx]!= 0xff)

    中断;

    //
    //如果闪存这一部分中的所有字节都为1、则会中断
    //循环,因为这是存储参数的好位置
    //块。
    //
    if (ui32Idx = g_ui32FlashPBSize)

    中断;

    //
    //递增到下一个参数块位置。
    //
    pui8New += g_ui32FlashPBSize;
    if (pui8New = g_pui8FlashPBEnd)

    pui8New = g_pui8FlashPBStart;

    //
    //如果每个可能的位置都已被选中,并且没有一个位置是有效的,那么
    //无法写入此参数块。 简单地说
    //返回而不写入。
    //
    if ((g_pui8FlashPBCurrent &&)(pui8New == g_pui8FlashPBCurrent))||
    (!g_pui8FlashPBCurrent &&(pui8New == g_pui8FlashPBStart)))

    返回;

    //
    //将此参数块写入闪存。
    //
    MAP_FlashProgram (((uint32_t *) pui8Buffer、(uint32_t) pui8New、
    G_ui32FlashPBSize);

    //
    //将参数块数据与现在应该在中的数据进行比较
    //闪存。 如果有任何数据不比较、则返回、留下先前的数据
    //闪存中的参数块为最新的(自当前参数起)
    //块无法正确编程)。
    //
    对于(ui32Idx = 0;ui32Idx < g_ui32FlashPBSize;ui32Idx++)

    if (pui8New[ui32Idx]!= pui8Buffer[ui32Idx])

    返回;

    //
    //新的参数块成为最新的参数块。
    //
    G_pui8FlashPBCurrent = pui8New;

    此致、

    Deepak

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

    您好!

     首先、您没有回答我的任何问题。 至于两个不同部件之间、我认为它不应影响 FlashPBSave 的工作方式。 原因是1294NCPDT 实际上具有1M 字节的闪存、而1294KCPDT 中的闪存为512KB。 我可能能够理解它是否适用于1294NCPDT、但不适用于1294KCPDT、但您的情况并非如此。  

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

    您好、Charles、

    我回复了、但我认为没有正确发布。 以下是答案、  

    1.我有的程序用于定制板。 当我在代码中进行更改并刷写代码时、问题就会开始。

    2.我的程序在上午8点和晚上8点完全正常运行了将近12小时,我正在使用 FlashPBSave,这就是我看到这个问题的时候。

    目前、我只有一个板。 我将在星期一之前获得更多的板。 我之前无法在另一个电路板上进行测试。

    4.我尝试恢复到正常工作的旧代码。 我也会在该代码中看到相同的问题。 这是否与坏内存有关?

    有时我也会收到此错误(在图像中)

    这是否相关?

    此致、

    Deepak

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

    您好!

     您知道吗?在12小时内、您曾调用 过多少次使用 FlashPBSave 来存储新参数? 请记住、您正在写入闪存。 闪存存储器的写入周期数量有限。 如果超出指定的周期数、则闪存可能会损坏。  

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

    您好、Charles、

    感谢你的帮助。 我发现我的编译器版本已更改、这就是出现此问题的原因。

    此致、

    Deepak