历史上的今天
今天是:2025年01月11日(星期六)
2020年01月11日 | STM32串口IAP实验中的地址问题
2020-01-11 来源:eefocus
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)和if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)分析
首先要清楚:0x8000000是Flash的起始地址,0x20000000是SRAM的起始地址。jump2app()是一个虚拟函数(函数指针)
(*(vu32*)(0X20001000+4))== (*(__IO uint32_t*)(0X20001000+4))
==(*(volatile unsigned int*)(0X20001000+4))
(*(vu32*)(0X20001000+4)) 通过内存寻址访问地址为(0x20001000 + 4)中的值
(0X20001000+4)只是一个常量;
(volatile unsigned int*)(0X20001000+4) 将0x20001000 + 4这个常量强制转化成volatile unsigned int类型的指针;
(*(volatile unsigned int*)(0X20001000+4)) 相对于取0x20001000 + 4地址处的值
程序设置把串口接收来的数据从0x20001000开始存储,第一个4个字节为栈顶地址,第二个4字节为复位中断向量的入口地址,接下来+8,将会是NMI中断服务函数的入口地址, +12,将会是HardFault的服务函数入口地址...

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程序使用。
上一篇:STM32之程序如何防止堆栈溢出
下一篇:STM32堆栈整理
史海拾趣
|
毋庸置疑,采用高亮度LED照明将成为未来汽车的主要特征,这归功于LED相对于传统的白炽光照明方案所具有的许多基本优势。此外,采用LED照明也可带动汽车设计技术和设计风格上的变化。然而,正像任何创新技术一样,LED在被广泛用于汽车照明之前,仍需 ...… 查看全部问答> |
|
做个家用带有温湿度测试仪的电子表,原理图、PCB在17楼,欢迎讨论 这个应用很简单,取代家用的电子表,除了具有普通电子表具有的显示时间,报警功能外,添加温度和湿度显示,这样可以随时了解室内的温湿度状况。市场挺好。… 查看全部问答> |
|
正在读研究生呢,非常想做一些嵌入式方面的研究,最好是WinCE方面的。 这里的各位大侠在这方面都很有经验,所以请各位推荐几款市场上可以买的成品PDA,价格适中,2000元以内。 而且,可以用作开发。 现在,我看了几款在taobao网上,不敢买,怕买 ...… 查看全部问答> |
|
做一个管理软件,使用vb,需要从昆腾plc中通过tcp/ip方式取数,听说需要用modbus协议取数,对这个协议不熟悉,有Modbus的接口或者驱动之类的东西吗,thanks a lot… 查看全部问答> |
|
spartan 6 warning HDLCompiler:89 在spartan 6 中,我调用了一个除法器,结果出现如下warning: HDLCompiler:89 - \"E:\\qiaodong\\FPGA\\test_FPGA\\test_div\\top.vhf\" Line 53: <div_lx16> remains a black-box since it has no binding entity. 如何解决? ...… 查看全部问答> |
|
一种目的,两种用途: 1)生成相同元件的多次实例化,示例如下: for k in 99 downto 0 generate flip_flop : DFF port map ( clk => clk, d => din(k), q => dout(k) ); ...… 查看全部问答> |




