OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1857|回复: 5

stm32 iap的一些疑问

[复制链接]

12

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-9-20
在线时间
56 小时
发表于 2017-10-19 09:29:19 | 显示全部楼层 |阅读模式
1金钱
先上代码,属于原子例程
#define FLASH_APP1_ADDR  0x08010000   //第一个应用程序起始地址(存放在FLASH)
           //保留0X08000000~0X0800FFFF的空间为Bootloader使用(64KB)

if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
   {  
    iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
   }else
   {
    printf("非FLASH应用程序,无法执行!\r\n");
    LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!");   
   }

void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
  jump2app=(iapfun)*(vu32*)(appxaddr+4);  //用户代码区第二个字为程序开始地址(复位地址)  
  MSR_MSP(*(vu32*)appxaddr);     //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  jump2app();         //跳转到APP.
}
}
如果上述函数执行iap_load_app,那FLASH_APP1_ADDR地址里的内容判断是否是0x20000000,FLASH_APP1_ADDR+4的内容判断是否是0x08000000;这判断的我没看懂求指教

最佳答案

查看完整内容[请看2#楼]

因为如果代码是存储在RAM,那肯定就是0X2000开头的 如果代码是存储在flash的,肯定就是0X0800,开头的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-10-19 09:29:20 | 显示全部楼层
Riven丶叮当 发表于 2017-10-19 09:51
用户代码的首地址放的是堆栈指针,而堆栈应该指向RAM,而RAM的首地址是0x20000000,所以这句话用来判断是不 ...

因为如果代码是存储在RAM,那肯定就是0X2000开头的
如果代码是存储在flash的,肯定就是0X0800,开头的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-9-20
在线时间
56 小时
 楼主| 发表于 2017-10-19 09:51:08 | 显示全部楼层
用户代码的首地址放的是堆栈指针,而堆栈应该指向RAM,而RAM的首地址是0x20000000,所以这句话用来判断是不是已经有一个正确的堆栈指针地址写在了用户代码的首地址,进一步可以推测是不是有一个正确的用户代码写在了用户代码区,如果已经写入了,就可以跳过去运行,如果没有写入,就不跳过去
那FLASH_APP1_ADDR+4的内容判断是否是0x08000000是什么??
回复

使用道具 举报

12

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-9-20
在线时间
56 小时
 楼主| 发表于 2017-10-20 08:08:51 | 显示全部楼层
正点原子 发表于 2017-10-19 09:29
因为如果代码是存储在RAM,那肯定就是0X2000开头的
如果代码是存储在flash的,肯定就是0X0800,开头的

这里判断了两次啊、、先判断的0x08000000跳转到iap_load_app又判断了一次0x20000000
回复

使用道具 举报

12

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-9-20
在线时间
56 小时
 楼主| 发表于 2017-10-20 09:29:42 | 显示全部楼层
正点原子 发表于 2017-10-19 09:29
因为如果代码是存储在RAM,那肯定就是0X2000开头的
如果代码是存储在flash的,肯定就是0X0800,开头的

原子哥,我这个是flash的那还用判断0x20000000这个么?
回复

使用道具 举报

12

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-9-20
在线时间
56 小时
 楼主| 发表于 2017-10-20 10:11:24 | 显示全部楼层
正点原子 发表于 2017-10-19 09:29
因为如果代码是存储在RAM,那肯定就是0X2000开头的
如果代码是存储在flash的,肯定就是0X0800,开头的

这个不管是flash还是sram最后都是通过iap_load_app()跳转的,跳转之后都是要判断if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 22:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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