STM32开发板扩展外部SRAM

我使用的开发板是野火STM32F407ZGT6核心板,板子在硬件层已经焊接好端口,因此只需要修改代码即可。

重点:配置外部SRAM仅需要一步,即在板子初始化程序system_stm32f4xx.c中,增加一个宏定义:#define DATA_IN_ExtSRAM 1。(在魔法棒中配置宏定义与此方法本质是一样的,此处不再介绍,免得小白困惑)

/************************* Miscellaneous Configuration ************************/
/*!< Uncomment the following line if you need to use external SRAM or SDRAM mounted
     on STM324xG_EVAL/STM324x7I_EVAL/STM324x9I_EVAL boards as data memory  */     
#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F469_479xx) || defined(STM32F413_423xx)
/* #define DATA_IN_ExtSRAM */
#define DATA_IN_ExtSRAM 1
#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx || STM32F469_479xx || STM32F413_423xx */

#if defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx) || defined(STM32F469_479xx)
/* #define DATA_IN_ExtSDRAM */
#endif /* STM32F427_437x || STM32F429_439xx || STM32F446xx || STM32F469_479xx */ 

测试:因为system_stm32f4xx.c程序将外部SRAM存储映射到了Bank1的SRAM2段(该部分内容在SystemInit_ExtMemCtl(void)函数最后的注释段可以看到),因此外扩SRAM的初始地址是0x64000000。测试方法是在main函数中定义一个变量,然后通过USART端口输出该变量的地址,看看是不是0x64000000即可。具体的测试程序通过简单注释掉野火FSMC工程MAIN函数不需要的部分即可。

/**
  ******************************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   SRAM应用例程
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火  STM32 F407 开发板 
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */
  
#include "stm32f4xx.h"
#include "./usart/bsp_debug_usart.h"
#include "./led/bsp_led.h"  
//#include "./sram/bsp_sram.h"	 //注释掉野火的SRAM配置相关部分 
 

#define Bank1_SRAM2_ADDR  ((uint32_t)(0x64000000)) //外部SRAM的初始地址

/*绝对定位方式访问SRAM,这种方式必须定义成全局变量*/
uint8_t testValue __attribute__((at(Bank1_SRAM2_ADDR))); //将变量testValue定义在外部存储
/*
 * 函数名:main
 * 描述  :主函数
 * 输入  :无
 * 输出  :无
 */
int main(void)
{ 	
	LED_GPIO_Config();
	LED_BLUE;
	
	/* 配置串口1为:115200 8-N-1 */
	Debug_USART_Config();
  
//    //初始化外部SRAM  
//    FSMC_SRAM_Init();
	
	printf ( "\r\n野火外部 SRAM 测试\r\n" );
	
  /*蓝灯亮,表示正在读写SRAM测试*/
  LED_BLUE;
  
//  /*对SRAM进行读写测试,检测SRAM是否正常*/
//  if(SRAM_Test()==1)
//  {
//		//测试正常 绿灯亮
//    LED_GREEN;			  
//  }
//	else
//	{
//		//测试失败 红灯亮
//		LED_RED;
//	}
//	
	/*指针方式访问SRAM*/
	{	
	 uint32_t temp;
	
	 printf("\r\n指针方式访问SRAM\r\n");
	/*向SRAM写入8位数据*/
	 *( uint8_t*) (Bank1_SRAM2_ADDR ) = (uint8_t)0xAA;
	 printf("\r\n指针访问SRAM,写入数据0xAA \r\n");

	 /*从SRAM读取数据*/
	 temp =  *( uint8_t*) (Bank1_SRAM2_ADDR );
	 printf("读取数据:0x%X \r\n",temp);

	 /*写/读 16位数据*/
	 *( uint16_t*) (Bank1_SRAM2_ADDR+10 ) = (uint16_t)0xBBBB;
	 printf("指针访问SRAM,写入数据0xBBBB \r\n");
	 
	 temp =  *( uint16_t*) (Bank1_SRAM2_ADDR+10 );
	 printf("读取数据:0x%X \r\n",temp);


	 /*写/读 32位数据*/
	 *( uint32_t*) (Bank1_SRAM2_ADDR+20 ) = (uint32_t)0xCCCCCCCC;
	 printf("指针访问SRAM,写入数据0xCCCCCCCC \r\n");	 
	 temp =  *( uint32_t*) (Bank1_SRAM2_ADDR+20 );
	 printf("读取数据:0x%X \r\n",temp);

	}
	
	/*绝对定位方式访问SRAM,这种方式必须定义成全局变量*/
	{
		testValue = 0xDD;
		printf("\r\n绝对定位访问SRAM,写入数据0xDD,读出数据0x%X,变量地址为%X\r\n",testValue,(uint32_t )&testValue);	 
	}
    while(1)
    {

    }
}



void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}


/*********************************************END OF FILE**********************/

测试结果:

 

 我们做事的原则:实用的且最简单的就是最好的。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值