打印

stm32编译出来bin文件前4bytes由什么来决定?求指教

[复制链接]
6643|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wendyfox|  楼主 | 2011-12-28 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在使用STM32F2系列的芯片,编译出来的文件开头的前四个byte是0x2002 0000 ,使得在DFU程序中跳转无法跳到应用程序
源码
     if (((*(__IO uint32_t*)APP_DEFAULT_ADD) & 0x2FFE0000 ) == 0x20000000)
     { /* Jump to user application */
       JumpAddress = *(__IO uint32_t*) (APP_DEFAULT_ADD + 4);
       Jump_To_Application = (pFunction) JumpAddress;
       /* Initialize user application's Stack Pointer */
       __set_MSP(*(__IO uint32_t*) APP_DEFAULT_ADD);
       Jump_To_Application();
     }
以前做STM32F1系列的芯片也做过相应的程序,查看以前的程序bin文件,以前的程序编译出来的是0x2001 0000,符合以上程序,可以正常跳转。
现在用STM32F2使用的是相同的编译器相同的环境,也是GCC,但是出来却有一那么一点不同,求指教,应用程序是可以运行的。
沙发
nicholasldf| | 2011-12-28 19:00 | 只看该作者
本帖最后由 nicholasldf 于 2011-12-28 19:04 编辑

内部SRAM范围在0x20000000-0x2000FFFF,所以堆栈指针要在这个范围内
下面是我改的程序,,判断条件0xFFFF0000 比0x2FFE0000 更严格

/* 正常开机,跳往应用程序 */
/* 应用程序第一个为堆栈顶部值__initial_sp,应在STM32的64K内部RAM的0x2000_0000-0x2000_FFFF范围内,最高16位必须是0x2000 */
/* Test if user code is programmed starting from address "ApplicationAddress" */
//官方例程的 if (((*(vu32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000){
if (((*(vu32*)ApplicationAddress) & 0xFFFF0000 ) == 0x20000000){
/* Jump to user application */
JumpAddress = *(vu32*) (ApplicationAddress + 4);//第二个字为复位向量
Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */
//__MSR_MSP(*(vu32*) ApplicationAddress);
__set_MSP(*(vu32*) ApplicationAddress);//第一个字为堆栈顶值 Jump_To_Application(); }

使用特权

评论回复
板凳
nicholasldf| | 2011-12-28 19:07 | 只看该作者
F1内部SRAM小,,跟F2不一样,,堆栈指针的位置肯定也不一样,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

33

帖子

0

粉丝