STM32F429的bootloader跳转到APP时跳转失败,无法进入APP

遇到的问题:
1.原有的工程,可以正常从bootloader 跳转到APP,但是在修改了APP里一个结构体后,bootloader无法正常跳转到APP。
结构体修改前:

typedef struct
{
    uint32_t drugItems[1000];
} TS_DRUG_ITEMS_COLLECTION;
struct TS_DRUG_CATEGORY
{
    uint32_t category_index;
    TE_STR_ID default_name_id;
    uint32_t drug_item_count;
    uint32_t color;
    char name_strings[4][64];
    TS_DRUG_ITEMS_COLLECTION drug_item_collection[4];
};

结构体修改后:

typedef struct
{
    uint8_t  flag;
    uint32_t drug_Item_index;
} INFO;
typedef struct
{
    INFO drugItems[1000];
} TS_DRUG_ITEMS_COLLECTION;
struct TS_DRUG_CATEGORY
{
    uint32_t category_index;
    TE_STR_ID default_name_id;
    uint32_t drug_item_count;
    uint32_t color;
    char name_strings[4][64];
    TS_DRUG_ITEMS_COLLECTION drug_item_collection[4];
};

问题排查:

  • 1.查看跳转部分代码

void AppEnterApplication(void)
{
T_U32 jump_address;
TF_VOID_FUNCTION jump_fun; if (AppIsApplicationExist())
{
/*disable all peripherals referrd to interrupt */
/*disable system tick */
SysTick->CTRL &= ~(SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk);
//disable rtc
RTC_DeInit();
RTC_ITConfig(RTC_IT_WUT, DISABLE);
//disalbe usarts
DrvUart2Deinit();
DrvUart1Deinit();

   /* Jump to user application */
   jump_address = *(T_U32*)(APPLICATION_ADDRESS + 4);
   jump_fun = (TF_VOID_FUNCTION)jump_address;
   /* Initialize user application's Stack Pointer */
   __set_MSP(*(T_U32*)APPLICATION_ADDRESS);
   jump_fun();    
   }

}

内存分配表:
```c
0x8000'0000  --> bootloader 栈顶地址
下面是bootloader中断向量表:
0x8000'0004 --> Reset_Handle
.......               --> 其他 中断
0x8000'FFFF --> bootloader end
0x8001'0000 --> app 栈顶地址
以下是app的中断向量表
0x8001'0004 --> Reset_Handle
.......               --> 其他 中断

对照.icf文件(IAR的配置文件)
如下图1
在这里插入图片描述

发现ROM地址正常。
2. 查看IAR的.map文件
通过调试,获取app的Reset_Handle的地址
jump_address = 0x806’b108
在IAR的.map文件里,发现
.text ro code 0x806’b108 0x10 startup_stm32f429_439xx.o [2]
说明确实进入到启动文件。
顺着,map文件往下看,找到堆栈区
如下图2
在这里插入图片描述
发现图2中,APP的栈顶地址跑到了0x2003’1398.而STM32F429的堆栈地址: 0x2000’0000~0x2002’FFFF。参考野火的《【野火】零死角玩转STM32—F429挑战者V2.pdf》,

在这里插入图片描述
修改前 :

sizeof(TS_DRUG_CATEGORY) = 4*4+4*64+4*4*1000 =16272 = 15KB
stack_address = 2002bfb8

修改后 :

sizeof(TS_DRUG_CATEGORY) = 4*4+4*64+1+4*4*1000 =2272= 19KB
stack_address =  0x2003'1398 

结论:
STM32F429的RAM,最大可用空间为 0x2002’FFFF,与.map文件里的栈顶地址对比发现栈顶地址跑到了SRAM的预留区域,超了SRAM的可用空间。导致程序跑飞。
后续实验,将结构体 TS_DRUG_CATEGORY 里的数组大小减少一半,程序能正常跳转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值