STM32程序运行在外部SRAM中

在项目开发中有时有些特殊的代码需要运行在RAM中,而这时不想用片内RAM,在STM32单片机上通过FSMC外挂一颗SRAM即可解决问题,外挂了SRAM该怎样将程序运行在外部SRAM中呢。本文来解决这个问题,使用的硬件平台为正点原子STM32F4探索者开发板,软件在实验36外部SRAM实验的基础上更改。

话不多说,且看代码,以及配置。(代码中尽量保存了原来的程序,其实为了说明这个问题,是没有必要的,但是保留原来的代码,看起来会不会很亲切哈哈)
为了进行测试,将原版实验代码的主函数进行了更改:

extern void PROGTEST(void);

int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);

LED_Init();	
LCD_Init();    
KEY_Init();	
//FSMC_SRAM_Init();		***//不在此执行FSMC初始化***
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");	
LCD_ShowString(30,70,200,16,16,"SRAM TEST");	
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/5/14");   
LCD_ShowString(30,130,200,16,16,"KEY0:Test Sram");
LCD_ShowString(30,150,200,16,16,"KEY1:TEST Data");
POINT_COLOR=BLUE;
PROGTEST();  ***//此函数放在外部SRAM中运行***

}
注意不能main中执行FSMC_SRAM_Init(); 因为在跳到main之前,执行了C库中的__main 它会将代码根据链接情况,拷贝到正确的执行地址,所以FSMC_SRAM_Init();要在执行__main之前就执行,因此要修改启动文件,启动文件修改如下:

STM32程序运行在外部SRAM中_第1张图片
在启动文件中执行完系统初始化 SystemInit后就执行FSMC的初始化,然后再执行__main在里面就会将数据段和代码段拷贝到它该处于的位置了,只要代码在链接地址所在的位置就能正确执行。

说到这里关于代码的更改就说完了,下面说配置:
我写的 PROGTEST() 在led.c中,为了说明这个问题我采用了简单粗暴的办法,直接将整个led.c都链接到了SRAM中,当然也可以通过自己写链接文件仅仅将这个函数链接到SRAM,配置方法如下:
打开Option for Target修改 RAM1
STM32程序运行在外部SRAM中_第2张图片
在RAM1中填上外部SRAM映射的起始地址和大小,注意不要勾选左边的对号,(我理解的是如果勾选上,单片机启动的时候会将此片RAM当做默认可用的RAM使用,但是这时候他还没有进行初始化,是不能使用的,因此不能勾选)RAM1的起始地址和大小根据自己的FSMC映射和SRAM大小来填写。

配置完它以后再配置led.c,右键led.c
STM32程序运行在外部SRAM中_第3张图片
在Code/Const 中选择RAM1即可。

至此代码部分和配置部分都说完了,编译代码,看map文件:
在这里插入图片描述
可以看到函数已经被链接到了SRAM中,在map中还可以看到
在这里插入图片描述
这个地址其实是代码在flash中的位置,__main会将代码从flash的这个位置拷贝到SRAM中正确的位置,其实如果不使用__main中的拷贝函数,自己拷贝也可以,那样的话就可以在c中调用FSMC初始化,初始化完成后自己再拷贝就可以了,但是既然c库提供了函数,为啥自己不用呢哈哈。
将代码下载到板子中就可以看到程序正确运行了,我的PROGTEST()是循环亮灯,
void PROGTEST(void)
{
while(1)
{
delay_ms(100);
LED0 = !LED0;
}
}
当我看到等不停闪烁时我就知道程序已经正确执行了。

在这里面涉及到一些启动文件的问题,网上有好多介绍STM32启动文件的,这里不再赘述。

你可能感兴趣的:(嵌入式开发)