标签:语句 程序 0X08000000 栈顶 IAP jump 地址 0x20000000 APP
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) //判断栈定地址值
STM32程序地址从 0X08000000 开始 执行,PC机也是从硬盘上的 0X08000000 地址开始执行。前四个字节是栈顶地址main()函数式主函数,也有个栈顶地址,其他函数一样,在调用跳转之前,将其对应的函数栈地址保存起来。 BootLoader程序先烧进Flash里,它的栈顶地址从0X08000000开始,4字节栈顶地址数据空间,然后是各种中断服务地址。
当收到APP程序时(它自己已经定义好了,收到APP文件后写道0X08000000+N这个地址上),它要把APP程序写到0X08000000+N上,因此,它需要首先判断一下APP程序在MDK中编译生成.bin文件后否是遵循这个0X08000000+N这个地址。如果和Bootloader要求的一样,那么就是正确的文件。
而appxaddr存放的是用户程序Flash的首地址,((volatile u32)appxaddr)的意思是取用户程序首地址里面的数据,这个数据就是用户代码的堆栈地址,堆栈地址指向RAM,而RAM的起始地址是0x20000000,因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x2001ffff区间中。
注:这里面的(0X20001000+4)和我们在SRAM里的起始地址 0X20001000 有什么关系呢?
我们选择0X20001000,就是留下SRAM区域的前4K SRAM给IAP程序使用。
————————————————
原文链接:https://blog.csdn.net/qq_21226319/article/details/74516391
标签:语句,程序,0X08000000,栈顶,IAP,jump,地址,0x20000000,APP 来源: https://www.cnblogs.com/tyutwanglei/p/12455005.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。