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

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

[复制链接]
shipeng1989 提问时间: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?
<
收藏 评论1 发布时间:2019-12-6 18:11

举报

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

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版