我使用的开发板是野火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**********************/
测试结果:
我们做事的原则:实用的且最简单的就是最好的。