|
发表于 2018-9-12 09:57:37
|
显示全部楼层
本帖最后由 rgw5267 于 2018-9-12 09:59 编辑
还有另外一个方法. 硬汉可以尝试一下. 先放一张图
STM32的脑残的FMC给SDRAM分配的地址在External device, 给NAND分配的却在External RAM区间, 而NAND无法直接执行程序, 我们可以通过地址映射交换两者的地址空间, 使SDRAM地址映射到External RAM. 具体方法为在main函数最开始执行- SYSCFG->MEMRMP = SYSCFG->MEMRMP | SYSCFG_MEMRMP_SWP_FMC_0;
复制代码
这样SDRAM的原地址0xc0000000就映射到了0x80000000(我是挂在bank1), 可以直接运行程序. 在bootloader中直接将程序拷贝到该地址就行了.
记得app中的中断向量地址和lds文件的地址也要修改.
lds文件修改位置
- MEMORY
- {
- FLASH (RX) : ORIGIN =0x80000000, LENGTH = 3M
- SRAM (RWX) : ORIGIN = 0x20000000, LENGTH = 192K
- CCMRAM (RWX) : ORIGIN = 0x10000000, LENGTH = 64K
- }
复制代码 SystemInit函数中的中断向量地址
- #ifdef VECT_TAB_SRAM
- SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
- #else
- SCB->VTOR = 0x80000000 | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
- #endif
复制代码
SDRAM前3M分配给了APP, 后面的都指向了FreeRTOS的栈空间. 程序已经验证过, 就是太慢太慢了. 我的SDRAM是16位的, 并且只能运行在96MHz.
运行有多慢, 原来从NAND读10M内容到SDRAM需要30S, 现在需要大概10分钟吧.
|
|