关于stm32 IAP的理解

IAP包括两部分程序:第1部分为IAP程序,第2部分为用户的APP程序,相当于就要两个工程。

先说CM3系列:

IAP工程的ROM和RAM的起始地址和大小不用修改,默认即可。IAP程序负责从串口或者其他通信接口接收数据,这些数据即APP程序代码。将APP代码复制到APP用户区,用户区的起始地址肯定是要大于IAP程序所占空间的,APP代码全部复制完后,调用跳转函数,实现跳转,即可以跑app程序。

在app工程中,需要把向量表重新定位在主程序的入口地址处,那么整个iap工程中,将有两张中断向量表:第1张为位于0x08000000,第2张位于app入口地址处。当跳转到app程序后,如果发生中断,将执行第1张还是第2张的中断向量表呢?第2张向量表是什么时候建立的呢?

先抛开内核实现情况来讲,理论上app程序发生的中断,就必须进入app的中断向量表,因为此表里面记录了每个中断服务函数的入口地址,而第1张表记录的是iap中断服务函数的入口地址。理论和实际到底是不是呢?答案是的,但是stm32的处理,硬件自动参与其中了。

那为什么原子上面讲,app发生的中断都会进入第1张表呢?原子解释为中断发生时,向量表提取时硬件这边会自动加上偏移地址。这样说的话,如果理论成立,这两张表都是不能被破坏的。如果跑app中断和第1张没有关系的话,那么第1张表是可以被破坏的,是不是这样的,需要测试。不管怎么说,第2张向量表是必须要的,因为里面记录了app中断服务地址。

第2张向量表的建立时间为,iap跳转到app后,将会建立第2张向量表。

再说CM0系列:

如stm32f0系列里面没有中断向量寄存器,怎么实现中断向量的重定位呢?cm0中有一个内存映射寄存器,可以把位于0x08000300(此地址只是举例)的中断向量表映射到ram中,即0x2000000处,当跑app程序时,发生了中断,会在ram中提取中断服务函数的入口地址。所以在app中的0x20000000处不能用于存放其他变量。所以app的ram要避开这段区间,不能用于存放任何变量。而iap的ram无需避开此段空间,iap程序可以使用0x20000000空间,因为当实现跳转后,app程序会重新为0x20000000重新赋值。

总的可以想象。当stm32中只有iap在跑的时候,此时还没有app程序,那么此时向量表只有1张,不管是rom还是ram各个空间都可以使用。app程序的加入后,想成功跑app,那么肯定要app的中断向量表,还有app程序的起始rom地址也要避开iap占用的区域,app的ram空间也要避开0x20000000,如果是cm0系列。

从app中还可以推测,跑main之前,肯定还有对全局变量的初始化。全局变量值先存放在rom中,然后在保存到相应的ram中。最后在执行main函数。

猜你喜欢

转载自blog.csdn.net/tangjienihaoma/article/details/80712015