stm32iap跳转后停留在boot

stm32iap跳转后停留在boot,第1张

1、检查代码跳转方式是否正确:IAP程序为了跳转到bootloader中,使用函数指针+汇编指令的方式进行跳转,这样可以保证代码跳转的正确性。需要检查跳转代码中是虚扮否有误,确保可以正常跳转到指定的ROM段。

2、检查内存布局是否正确:在跳转前,需要确保在IAP和bootloader两段程序哗喊之间有足够的空间,以免跳转后出现内存溢出等问乱誉野题。需要检查bootloader程序所在的ROM段以及可以被复制和更新的数据段是否设置正确。

我用C8051F020上实现的一个IAP来举例吧。升级程序空亮局的确放在指定位置,因为C8051F020有64K的ROM,所以升级程序就占用ROM最后的4K的空间,前面64K就用来存放用户程序。在每次单片机启动时,放在0000H位置的LJMP指令不是跳转到用户程序,而是直接跳转到了升级程序(60K开始的位置),这里升级程序初始化串口,等待串口发来的数据流,如果数据流的不正确或者没有收到数据流,就跳转回斗让用户程序的入口执行用户上次下载进去的程序。所以在这里用户的程序不能超过60K,当然升级程序也不会“自宫键此”,就没什么影响了。

不了解所说的代码跳转方式具体是如何实凯悉轮现的,但可以肯定的是你的切换程序的相应处理。一般来说比较可靠的切换,是在被切换的函数中,通过修改SP寄存器的,然后在盯信返回跳转至指定函数的入口地址,从而切换的。 另外需要注意的是升级过程是在中断调用,函数的返回指令也是不一样的 。

裸奔的话给你一个自简单的参考结构,只要任何位置 switchapp(xxx); 都可以相对可靠的切换。

void *(陆者 CurrentApp )(void) =

void main( )

{

...

while(1)

{

CurrentApp ()

}

}

void switchapp( void *( NextApp ))

{

CurrentApp = NextApp

}

bool KeepRunning =true

void App1( )

{

while(KeepRunning)

{

.......

}

}

void App2( )

{

while(KeepRunning)

{

.......

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12313132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存