回复【2楼】 正点原子 :
---------------------------------
成功了,来结个帖子。有学f429的童鞋也可以借鉴下,代码通过iap下载到sdram中,默认的话fmc初始化后bank1、bank2所映射的地址为0xc0000000,0xd0000000。很遗憾,stm32f429内部规划了一个内存映射表,限制了代码只能在某些地址中运行。在bank1、bank2所在的地址属于Execute Never区域。但f429提供了一个寄存器,可以将sdram映射到0x80000000(bank1)、0x90000000(bank2),所以需要在iap中设置SYSCFG->MEMRMP 寄存器的11,10位为01,如图
这样,在iap中操作sdram的地址就不再是0xd0000000(我挂在bank2上)了,而是0x90000000了,此时,sdram也就可以运行代码了。
这样在app程序中,设置rom1为0x90000000,设置一个大小,剩下的就是ram了,然后通过跳转就可以运行了。
这里感谢原子哥的iap,还有网上一个无名网友的文章,可惜已经没有了,只能通过快照看了。
测试结果,由于sdram速度只有主频的一半(f429 180M\sdram 90M),所以好多的循环延时都会不准了,但定时器还是准的。另外,跳转之前最好将iap中开启的中断关闭,在app中再初始化。调试过程中我开启了一个1ms的tim7中断,结果每次都死机,后来在跳转前关闭tim7就正常了,貌似滴答定时器可以不关闭。其他没测试。
|