你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

奇怪的 boot loader跳转APP异常问题

[复制链接]
歹徒兄弟 提问时间:2019-12-6 18:11 /
最近遇到一个非常邪门的问题:用"MDK做的BOOTLOADER程序"引导"STM32CubeIDE做的APP"会导致启动不了不能成功进入APP的问题。但是同样的APP源码用MDK来编译却是可以成功进入APP。大家可能会怀疑是STM32CubeIDE生成的APP机器码有问题,为了验证这个问题我去掉BOOTLOADER将APP的起始地址设为0x00再次用STM32CubeIDE编译生成机器码并烧录进芯片发现APP又可以正常运行。更加奇怪的是:如果保留BOOTLOADER让STM32CubeIDE进入debug模式也能正常启动APP,但是一旦芯片复位后就又不能进入APP了。
    通过以上操作应该可以确定STM32CubeIDE生成的APP是没有问题的,因为在没有BOOTLOADER的情况下APP是可以正常运行的。问题应该是出在BOOTLOADER上。我记得BOOTLOADER在跳转APP前会将APP的起始位置4个字节的内容做个判断,如果这个值合法则跳转不合法则不跳转:
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      Jump_To_Application();
    }
我怀疑问题应该就出在这里,于是将问题程序烧录后读出FLASH数据找到APP起始位置的数据:

APP起始位置数据

APP起始位置数据

可以发现这个值是0x20030000明显不合法,难怪跳转APP不成功。
我现在有个疑问:将堆栈首地址设为0x20030000为什么不会越界,因为我用的芯片内存地址最大值应该是0x2002FFFFF?
收藏 评论2 发布时间:2019-12-6 18:11

举报

2个回答
慎微 回答时间:2019-12-9 11:16:33
对比 查下您的堆栈size 定义,代码定定义大小跟事实大小可能不同,只要 0x2003000 没超出,编译是OK啊
maikk 回答时间:2024-11-15 10:35:09

同样的问题,链接文件中有_estack = ORIGIN(RAM) + LENGTH(RAM);应该取的是RAM部分的总长度,将这个值改到范围内就可以进行正常跳转了;我现在遇到的问题是跳转之后还是无法执行APP部分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版