fire18 发表于 2013-10-28 13:20:24

请教下怎么从bootloader跳往主应用问题,一直没成功(已解决)

本帖最后由 FSL_TICS_ZJJ 于 2014-1-2 14:24 编辑

我用的芯片是K21的

bootloader中是这样设的:

//主应用在0x8000地址上
#define APP_ADDR_START 0x8000

void __set_MSP(uint32_t mainStackPointer)
{
__asm("msr msp, r0");
__asm("bx lr");
}

typedefvoid (*pFunction)(void);

pFunction Jump_To_Application;
DWORD JumpAddress;

void main()
{
       SCB_VTOR = APP_ADDR_START;
      
      //跳转至用户代码
      JumpAddress = *(DWORD*) (APP_ADDR_START + 4);
      Jump_To_Application = (pFunction) JumpAddress;

      //初始化用户程序的堆栈指针
      __set_MSP(*(DWORD*) APP_ADDR_START);        
      //
      Jump_To_Application();
}

主应用的icf文件中我是这样设的:

define symbol __ICFEDIT_region_ROM_start__ = 0x8000;
define symbol __ICFEDIT_region_ROM_end__   = __ICFEDIT_region_ROM_start__ + 0x78000;

define symbol __code_start__ =__ICFEDIT_region_ROM_start__ +0x00000410;

主应用编译转换成bin格式后看MAP文件,确实是链接到0x8000地址上了,是对的,用jlink调试bootloader,可以确定0x8000地址上的内容和主应用的bin文件是一致的,没有问题,但跳过去执行却不正常,麻烦帮忙看下还有哪里没有弄对,谢谢

zhaoghsea 发表于 2013-10-28 15:26:24

本帖最后由 zhaoghsea 于 2013-10-28 15:27 编辑

我用过K20 ROM_start 0X1000 没看到你的ram_start啊,这个要在ramstart的基础上+0x410 codestart我倒没见到
另我最后的跳转是jumpAPP(0X1000),你这边加了4,不知后面那个子函数是不是就没加了
jumpAPP()
{
/*set up stack pointer*/
asm("LDR r13,");
/*jump to app reset vector*/
asm("ADD r0,r0,#0x04");
asm("LDR r0,");
asm("BX r0");
}
---------------------------------------------------------------------------------------------------------
建议你参照官网的AN2295去改。不过好像后来新的AN2295例程好像删掉了KINETIS系列。
如果没有的话,留邮箱我回头发给你,zhaoghsea@126.com

FSL_FAE_JiCheng 发表于 2013-10-28 15:40:35

zhaoghsea 发表于 2013-10-28 15:26 static/image/common/back.gif
我用过K20 ROM_start 0X1000 没看到你的ram_start啊,这个要在ramstart的基础上+0x410 codestart我倒没见到 ...

方便的话直接传上来吧~

zhaoghsea 发表于 2013-10-28 16:35:54

app代码你参照官方例程就可以了,icf文件里就我说的那几个地方注意看下,应该好弄的

fire18 发表于 2013-10-29 09:41:37

zhaoghsea 发表于 2013-10-28 16:35 static/image/common/back.gif
app代码你参照官方例程就可以了,icf文件里就我说的那几个地方注意看下,应该好弄的 ...

谢谢!

我链接主程序在0x8000地址上,bin文件的前8字节是:
E8 D5 FF 1F A1 26 00 00

即堆栈顶是1FFFD5E8
reset的中断向量是000026A1

这能看出来主程序链接的对不对吗,reset的中断向量还是应该是在0000A6A1才对呢,还有哪里需要设置才对


SCB_VTOR = APP_ADDR_START;
   
// Jump to user application
JumpToUserApplication(APP_ADDR_START);
//==============
while(1);

刚才单步调了下,走到asm("BX       r0");时,R0=000026A1,单步后又回来了bootloader空间,走到了while(1),并没有走到主程序中,且报错:
Tue Oct 29, 2013 09:40:06: The stack pointer for stack 'CSTACK' (currently 0x1FFFD5E8) is outside the stack range (0x1FFF93F8 to 0x1FFFB3F8)
Tue Oct 29, 2013 09:40:06: The stack pointer for stack 'CSTACK' (currently 0x1FFFD5E8) is outside the stack range (0x1FFF93F8 to 0x1FFFB3F8)
Tue Oct 29, 2013 09:40:11: The stack pointer for stack 'CSTACK' (currently 0x1FFFD5E8) is outside the stack range (0x1FFF93F8 to 0x1FFFB3F8)
Tue Oct 29, 2013 09:40:13: The stack pointer for stack 'CSTACK' (currently 0x1FFFD5E8) is outside the stack range (0x1FFF93F8 to 0x1FFFB3F8)

这可能是哪里不对呢,谢谢

FSL_TICS_LIKAN 发表于 2013-10-30 12:19:12

跳转地址有问题吧。For BX and BLX, bit of Rm must be 1 for correct execution. Bit is used to update the EPSR T-bit and is discarded from the target address.

fire18 发表于 2013-10-30 12:54:19

(正解)

本帖最后由 FSL_TICS_ZJJ 于 2014-1-2 14:23 编辑

昨晚上搞定了,问题的实际原因是bootloader和应用程序中都做了时钟初始化,去掉应用程序中的时钟初始化代码后就正常了,谢谢

Henjay724 发表于 2014-4-13 14:53:20

jiang887786 发表于 2014-9-4 19:59:12

我是来学习的,谢谢!
页: [1]
查看完整版本: 请教下怎么从bootloader跳往主应用问题,一直没成功(已解决)