主题中讨论的其他器件:UNIFLASH、 EK-TM4C1294XL
在我的器件中、固件升级必须由另一个器件通过以太网完成。 因此、我在我的应用程序中创建了代码(起始地址0x20000)、通过 TCP/IP 将接收到的数据写入另外一个存储器(0x40000)。 并在配置内存中将固件升级标志设置为1。
我已经检查过、在0x40000中存储的数据与从 PC 工具(项目工具)加载的二进制文件相同。
应用程序:
1. TCP/IP
2.固件升级命令用于接收数据,并将数据存储在0x40000中
3.检查 CRC 并设置固件升级标志
4.移动到引导地址(0x00)
用于移动到引导地址的代码
HWREG (NVIC_VTABLE)= 0x00;
//从应用程序的矢量表加载堆栈指针。
_asm (" LDR R1、[r0]\n"
" mov sp、r1");
//从应用程序的矢量表加载初始 PC 并分支到
//应用程序的入口点。
_asm (" LDR r0、[r0、#4]\n"
" bx r0\n");
在引导代码中:
1.检查固件升级标志状态。
2.如果设置了固件升级,则擦除闪存0f 应用程序(0x20000长度约为128KB),并将闪存写入数据从0x40000写入0x20000,并重置固件升级标志。
跳转至应用程序地址0x20000。 (设置或未设置固件升级标志)。 在首先刷写引导加载程序并通过 CCS IDE/LM 闪存刷写应用程序时、此方法有效。
HWREG (NVIC_VTABLE)= 0x20000;
//从应用程序的矢量表加载堆栈指针。
_asm (" LDR R1、[r0]\n"
" mov sp、r1");
//从应用程序的矢量表加载初始 PC 并分支到
//应用程序的入口点。
_asm (" LDR r0、[r0、#4]\n"
" bx r0\n");
通过 PC 工具(项目工具)升级后、从0x40000刷至0x20000并跳转至应用程序不工作。 在跳转到位置时丢失任何其他内容。 引导和应用程序都使用相同的 SRAM - 0x20000000存储器。 我需要更改 SRAM 中的任何内容吗?
应用命令文件
--retain=g_pfnVectors
/*以下命令行选项作为 CCS 项目的一部分设置。 */
/*如果您正在使用命令行进行构建,或者出于某种原因想要*/
/*在此处定义它们,您可以根据需要取消注释和修改这些行。 */
/*如果您使用 CCS 进行构建、则最好制作任何此类项目*/
/*对 CCS 项目的修改,并保留该文件。 */
/**/
/*--heap_size=0 */
/*--stack_size=256 */
/*--library=rtsv7M3_T_le_eabi.lib */
/*应用的起始地址。 正常情况下、中断矢量*/
/*必须位于应用程序的开头。 */
#define APP_BASE 0x00020000
#define RAM_BASE 0x20000000
/*系统内存映射*/
内存
{
/*存储在内部闪存中并从内部闪存执行的应用程序*/
Flash (RX):origin = APP_BASE,length = 0x00010000
/*应用程序使用内部 RAM 进行数据*/
SRAM (rwx):origin = RAM_BASE、length = 0x00040000
}
/*内存中的段分配*/
部分
{
.intvecs:> app_base
.text :>闪存
.const :>闪存
cinit :>闪存
请输入您的密码:> FLASH
init_array:> FLASH
.vtable:> RAM_BASE
.data :> SRAM
bss :> SRAM
.sysmem:> SRAM
.stack:> SRAM
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>= 15009000
.TI.ramfunc:{}load=flash、run=SRAM、table (BINIT)
#endif
#endif
}
引导命令
--retain=g_pfnVectors
/*以下命令行选项作为 CCS 项目的一部分设置。 */
/*如果您正在使用命令行进行构建,或者出于某种原因想要*/
/*在此处定义它们,您可以根据需要取消注释和修改这些行。 */
/*如果您使用 CCS 进行构建、则最好制作任何此类项目*/
/*对 CCS 项目的修改,并保留该文件。 */
/**/
/*--heap_size=0 */
/*--stack_size=256 */
/*--library=rtsv7M3_T_le_eabi.lib */
/*应用的起始地址。 正常情况下、中断矢量*/
/*必须位于应用程序的开头。 */
#define boot_BASE 0x00000000
#define RAM_BASE 0x20000000
/*系统内存映射*/
内存
{
/*存储在内部闪存中并从内部闪存执行的应用程序*/
FLASH (rwx):origin = boot_BASE、length = 0x00002000
/*应用程序使用内部 RAM 进行数据*/
SRAM (rwx):origin = 0x20000000、length = 0x00040000
}
/*内存中的段分配*/
部分
{
.intvecs:> boot_BASE
.text :>闪存
.const :>闪存
cinit :>闪存
请输入您的密码:> FLASH
init_array:> FLASH
.vtable:> RAM_BASE
.data :> SRAM
bss :> SRAM
.sysmem:> SRAM
.stack:> SRAM
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>= 15009000
.TI.ramfunc:{}load=flash、run=SRAM、table (BINIT)
#endif
#endif
}
__STACK_TOP =_STACK + 4096;
两者都有启动文件。 但"引导"不需要启动。 如何在 boot cmd 中删除该矢量。



。 