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.

[参考译文] TM4C129ENCPDT:TM4C129ENCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1235083/tm4c129encpdt-tm4c129encpdt

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:EK-TM4C1294XL

您好!

我尝试实现基于闪存的引导加载程序。 但我无法将主堆栈指针值设置为所需的闪存地址。

有人知道如何执行此操作吗?

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

    您好!

     请参考基于闪存的引导加载程序示例。 您可以在 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\boot_serial 中找到示例引导加载程序。 该引导加载程序通过 UART 接口进行引导加载。 引导加载程序必须保留0x0大小。 应用程序可以驻留在1024字节边界。 应用示例可在 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\boot_deme1中找到。 此应用从0x4000开始。 在引导加载程序配置文件 bl_config.h 中、应用程序起始地址和应用程序矢量表指定为0x4000、但只要该值是1024字节的倍数、就可以根据您的应用程序要求更改。 请参阅 bl_config.h 文件中的以下代码片段。  

    //*****
    //
    //应用的起始地址。 该值必须是1024的倍数
    //字节(使其与页边界对齐)。 矢量表应在
    //此位置,以及向量表(栈位于
    //在 SRAM 中,位于闪存中的复位矢量)被用作
    //应用程序映像的有效性。
    //
    //引导加载程序的闪存映像不得大于此值。
    //
    //取决于:无
    //不包括:无
    //需要:无
    //
    //*****
    #define APP_START_ADDRESS 0x4000

    //*****
    //
    //应用程序定位其异常向量表的地址。
    //它必须是1024字节的倍数(使其与页对齐)
    //边界)。 通常、应用程序将以其矢量表和
    //该值应设置为 APP_START_ADDRESS。 此选项用于
    //满足从外部存储器运行的应用程序,这些应用程序可能不是
    //可由 NVIC 访问(向量表偏移寄存器仅为30位)
    //长)。
    //
    //取决于:无
    //不包括:无
    //需要:无
    //
    //*****
    #define VTABLE_START_ADDRESS 0x4000

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

    嗨、Charles、

    谢谢你的答复。

    我在示例中找到了 boot_deme1。 该文件具有"跳转至引导加载程序"函数、我可以在应用程序中使用该函数。 我在建造过程中遇到的一个问题是  

    ROM_SysTickIntDisable ();
    ROM_SysTickDisable ();

    这2个函数无法从我的源文件中访问。 它以隐式函数声明的形式显示。

    1. 您知道我应该包含哪个头文件来解决该错误吗?

    我可以看到 (*(void (*)(void)))(*(uint32_t *) FlashAddress))();被调用以跳转到指定的 FlashAddress。 但我发现它将调用 FlashAddress 中的应用程序的 SVP 处理程序。  

    2.是否也没有必要将程序计数器更改为地址和主堆栈指针地址? 还是只能与它配合使用?

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

    嗨、Charles、

    又有一个更新。 我得到了 SysTickIntDisable ()和 SysTickDisable ();我的错误得到了解决。 但我无法执行到应用的跳转。

    你对此有什么想法吗?

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

    您好!

    更多更新。 我得到了 SysTickIntDisable ()和 SysTickDisable ();我的错误得到了解决。 [/报价]

    很高兴您遇到了编译问题。  

    但我无法执行到应用程序的跳转。

    您需要通过 JTAG 将引导加载程序编程到闪存中、并将其设置为0x0。 完成此操作后、闪存中唯一的内容是引导加载程序。 还没有应用程序。 引导加载程序不会跳转到应用程序、因为 应用程序尚不存在。 引导加载程序仍将处于引导加载模式、等待您提供应用程序代码(例如 boot_deme1)。 如果您使用的是 LaunchPad、我强烈建议您在转向您自己的定制板之前务必使其正常工作、那么您可以使用 LM 闪存程序来提供 boot_demo1.bin。 然后、该应用程序将通过 UART 接口下载到闪存中。 下载应用程序后、下次启动器件时、引导加载程序将在0x4000处找到有效的应用程序、然后跳转到该应用程序。  

    -参见下文,使用 LM Flash 程序选择串行接口下载。 则需要提供自己的 COM 端口。

    -下一步提供 boot_demo1.bin 并点击"程序"。

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

    尊敬的 Charles:

    感谢您的回复。

    但我已经将应用程序的 hex 文件刷写到指定位置、即0x10010。 我的引导加载程序位于0x00000000。

    我已单独测试了应用程序代码、运行正常。 以下是引导加载程序用于跳转到应用程序的代码部分。

    这是 GoToApplication()的函数。

    void GoToApplication(uint32_t FlashAddress)
    {
            IntMasterDisable();
    
            // We must make sure we turn off SysTick and its interrupt before entering
            // the boot loader!
            SysTickIntDisable();
            SysTickDisable();
    
            //
            // Disable all processor interrupts.  Instead of disabling them
            // one at a time, a direct write to NVIC is done to disable all
            // peripheral interrupts.
            //
            HWREG(NVIC_DIS0) = 0xffffffff;
            HWREG(NVIC_DIS1) = 0xffffffff;
            HWREG(NVIC_DIS2) = 0xffffffff;
            HWREG(NVIC_DIS3) = 0xffffffff;
    
            //
            // Return control to the application.  This is a call to the SVC handler in the application.
    
            (*((void (*)(void))(*(uint32_t *)FlashAddress)))();
    }

    但应用程序1未执行。

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

    在 我的回复中、我已经说过应用程序映像必须对齐到1024字节。 您的应用程序映像是否从0x10010开始? 它没有与1k 边界对齐。 在进行任何修改之前、为什么不首先尝试库存示例(串行引导加载程序和 boot_deme1)并开始工作?  

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

    对于此类信息、我的应用程序对齐到1024字节。 应用程序映像从0x10010开始。 但我提供的长度为384 KB、因此它与1024字节对齐。

    我将在下面添加快照。

    总之、在此期间我将尝试使用该示例。  

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

    您好!

     我想您对1024字节的含义有误。 1024是十进制值。 它的十六进制值为0x400。 您的起始地址是0x10010、等于65552十进制。 如果您将65552/1024相除、则不是一个整数。 起始地址必须为0x10000、而不是0x10010。 0x10000等于65536。 由65536除以1024等于64。 这就是我一直在说的。 请阅读 bl_config.h 文件中的注释。 您需要将 以下#define 更改为0x10000以及您的链接器命令文件、以便在0x10000处启动应用程序、而不是0x10010。  

    //应用的起始地址。 该值必须是1024的倍数
    //字节(使其与页边界对齐)。 矢量表应在
    //此位置,以及向量表(栈位于
    //在 SRAM 中,位于闪存中的复位矢量)被用作
    //应用程序映像的有效性。
    //
    //引导加载程序的闪存映像不得大于此值。
    //
    //取决于:无
    //不包括:无
    //需要:无
    //
    //*****
    #define APP_START_ADDRESS 0x4000

    //*****
    //
    // 应用程序定位其异常向量表的地址。
    //它必须是1024字节的倍数(使其与页对齐)
    //边界)。 通常、应用程序将以其矢量表和
    //该值应设置为 APP_START_ADDRESS。 此选项用于
    //满足从外部存储器运行的应用程序,这些应用程序可能不是
    //可由 NVIC 访问(向量表偏移寄存器仅为30位)
    //长)。
    //
    //取决于:无
    //不包括:无
    //需要:无
    //
    //*****
    #define VTABLE_START_ADDRESS 0x4000

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

    您好 Charles、

    感谢您的支持。

    这解决了我的问题。