主题中讨论的其他器件:EK-TM4C1294XL
您好!
我尝试实现基于闪存的引导加载程序。 但我无法将主堆栈指针值设置为所需的闪存地址。
有人知道如何执行此操作吗?
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.
您好!
我尝试实现基于闪存的引导加载程序。 但我无法将主堆栈指针值设置为所需的闪存地址。
有人知道如何执行此操作吗?
您好!
请参考基于闪存的引导加载程序示例。 您可以在 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.是否也没有必要将程序计数器更改为地址和主堆栈指针地址? 还是只能与它配合使用?
您好!
更多更新。 我得到了 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字节的含义有误。 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