STM32F429如果像使用内部SRAM一样使用外部SDRM

时间:2024-03-19 07:46:26

实现说明:
默认情况下,我们都是通过MDK的option选项设置Flash和RAM
STM32F429如果像使用内部SRAM一样使用外部SDRM
这种情况下,所有管理工作都是编译来处理的,不方面用户将变量定义到指定的CCM 或者SDRAM中。而使用__attribute__指定具体地址又不方便管理。

针对这种情况,使用一个脚本文件即可解决,脚本定义如下:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00200000 { ; load region size_region
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00030000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 { ; RW data
*(.CCM_RAM)

}
RW_IRAM3 0xC0000000 0x01000000 { ; RW data
*(.SDRAM)

}
}
复制代码

同时配置option的链接选项使用此脚本:

STM32F429如果像使用内部SRAM一样使用外部SDRM
注意:要勾选掉“Use Memory Layout form Target Dialog”否则无法选择.sct文件
使用方法:
使用方便很简单,依然是使用__attribute__,但是不指定具体地址了,指定RAM区,方法如下,仅需加个前缀即可:
/* 定义在CCM RAM里面的变量 */
attribute((section (".CCM_RAM"))) uint32_t CCMBuf1[10];
attribute((section (".CCM_RAM"))) uint16_t CCMCount;

/* 定义在SDRAM里面的变量 */
attribute((section (".SDRAM"))) uint32_t SDRAMBuf1[10];
attribute((section (".SDRAM"))) uint32_t SDRAMCount;
复制代码

然后就可以直接使用变量,不过注意一点,使用SDRAM中的变量前,优先初始化SDRAM.

原文链接:http://forum.armfly.com/forum.php?mod=viewthread&tid=89275&highlight=sdram
感谢原文作者的无私奉献。