在“线程:SysBIOS,controlSUITE”中讨论的其它部件
您好,亲爱的社区。
在我们的项目中,我们需要一个引导加载程序来更新存储在SD卡(SPI)上的M3固件。 我们还需要更新C28,但我们现在只关注M3。
我首先想尝试从引导加载程序跳到应用程序,作为第一次测试,在通过CCS和JTAG调试探头“手动”刷新两个固件之后。
我首先尝试了一种“天真”的方法:
我有两个CCS项目,一个用于bootloader,另一个用于应用程序。
booloader链接程序文件如下所示:
... flash_boot (rwx): origin = 0x20.003万,length = 0x0.0004万 //不确定此部分中的内容,但我猜这是关键。 ? 闪存(rwx) : Origin = 0x20.0034万,length = 0x0001FFCC // Bootloader代码(我知道,这是bootloader的一个大部分。) RSVD_firmware :原始= 0x22万,长度= 0x0005FF00 //为应用程序和主功能地址保留 ... 文本 :> flash .binit :> flash .cinit :>闪存 .Pinit :>闪存 .const :>闪烁 ...
和应用程序链接程序文件:
...
RSVD_bootloader :origin = 0x20.003万,length = 0x0001FFD0 flash_boot (rwx):origin = 0x22万,length = 0x0.0004万 //不确定此部分中放置的内容 flash (rwx) :origin = 0x22.0004万,length = 0x0005FEF8 // Application code main_ADDR (rwx): Origin = 0x0027FEFC,length = 0x0.0004万 //存储应用程序的主功能地址 ... 文本 :> flash .binit :> flash .cinit :>闪存 .Pinit :>闪存 .const :>闪烁 ...
因此,在应用程序代码中,我将main函数指针地址存储在特定的闪存地址(本例中为0x0027FEFC)。
在bootloader代码中,我只需检索应用程序的主函数地址并尝试从那里调用函数。 我知道主函数的地址是正确的,但是当我调用应用程序主函数时,什么也没有。 它只是挂起,我没有在调试器中捕获任何异常消息。
我知道这是一个很天真的解决方案,但它看起来对另一平台上的某些人来说是可行的,正如OP HERE e2e.ti.com/.../11.3899万中所描述的那样
有人能给我指出正确的方向来解决我的问题吗? 任何建议或示例都将受到极大的感谢。
我搜索了很多,但没有找到Concerto芯片的任何示例。 我知道CodeSkins为我的平台提出了商业解决方案,但我们现在真的很想自己来做。
谢谢大家!
RIL
更新:
阅读此帖子后:e2e.ti.com/.../32.1081万
我还尝试了:
//将引导程序表设置为闪存中应用程序的开头。
HWREG (NVIC_vtable)= 0x2200万;//也尝试了0x22.0001万,0x22.0004万和0x22.0005万
//从应用程序的矢量表中加载堆栈指针。
//
_ASM (" LDR. R1,[r0]\n"\}
"移动 SP,R1");
//将初始PC从应用程序的矢量表和分支加载到
//应用程序的入口点。
//
_ASM (" LDR. r0,[r0,#4]\n"\}
" r0\n");
但它不起作用。