搜索
bottom↓
回复: 6

STM32的bootloader中检查堆栈地址时为什么用0x2FFE000

[复制链接]

出0入0汤圆

发表于 2019-6-24 09:21:01 | 显示全部楼层 |阅读模式
接触过几次STM32的bootloader,但一直没有深入了解为何在检查堆栈地址时用0x2FFE000去和app的地址的内容做“与”运算:
  1. void BootLoad_Jump(void)
  2. {
  3.         /* Check Vector Table: Test if user code is programmed starting from address
  4.         "APPLICATION_ADDRESS" */
  5.         d_printfhex32((*(__IO uint32_t*)APPLICATION_ADDRESS));d_printf("\n");
  6.         if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
  7.         {
  8.                 JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS +4);
  9.                 d_printfhex32(JumpAddress);d_printf("\n");
  10.                 HAL_Delay(100);
  11.                 Jump_To_Application = (pFunction) JumpAddress;
  12.                 /* Initialize user application's Stack Pointer */
  13.                 __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  14.                 Jump_To_Application();
  15.         }
  16. }
复制代码

这个0x2FFE000是怎么来的?

出0入8汤圆

发表于 2019-6-24 09:44:06 | 显示全部楼层
本帖最后由 barryxiao 于 2019-6-24 14:55 编辑

0x2ffe000的掩码计算结果等于0x20000000,对应的要求是,目标地址的低17bit可以为任意的0/1,第17~31bit必须为0010 0000 0000 000
意思是,目标地址必须是0010 0000 0000 000* **** **** **** ****这样的二进制组成
更简单的说就是,这段地址必须落在以0x20000000开头的128kB以内,就是说在SRAM中

补充。高位是0010,有3个为0的bit没有限制地址0/1,实际可能落的断是0x2/3/6/7/a/b/e/f几个段

出0入0汤圆

 楼主| 发表于 2019-6-24 09:59:38 | 显示全部楼层
哦,这个数是要根据ram的大小确定的,明白了。感谢感谢!!
拿到同事移交的代码是这个值,但实际使用中的RAM才8K,看来好多人对这个没有理解!!

出0入0汤圆

发表于 2019-6-24 10:03:44 | 显示全部楼层
二楼透彻

出870入263汤圆

发表于 2019-6-24 10:36:38 | 显示全部楼层
barryxiao 发表于 2019-6-24 09:44
0x2ffe000的掩码计算结果等于0x20000000,对应的要求是,目标地址的低17bit可以为任意的0/1,第17~31bit必 ...

要我的话就直接用0xfffe000做掩码。
它用0x2ffe000岂不是0x30000000,0x60000000,0x70000000,0xa0000000,0xb0000000,0xe0000000,0xf0000000都可以?

出0入8汤圆

发表于 2019-6-24 13:30:08 来自手机 | 显示全部楼层
关注一下,大家各抒己见

出0入8汤圆

发表于 2019-6-24 14:48:32 | 显示全部楼层
本帖最后由 barryxiao 于 2019-6-24 14:52 编辑
armstrong 发表于 2019-6-24 10:36
要我的话就直接用0xfffe000做掩码。
它用0x2ffe000岂不是0x30000000,0x60000000,0x70000000,0xa0000000,0 ...


嗯,还有3个bit没有完全固定。要固定在SRAM中的话应该用ff才行,写法也更简单
可能是他们出于别的目的弄的吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 19:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表