【SRAM】CubeMX配置STM32H743+IS61WV204816外部扩展SRAM

1 篇文章 0 订阅

一、前言

虽然H743给的内部RAM已经很多了,但看到我这篇文章的朋友一定都明白:就算再慷慨的内部RAM,也有用尽的时候,所以我们要外扩RAM,这时候有两个选择,SDRAM或者SRAM,都可以用,我会用两篇博客分别带来它们两者的配置过程!

F407和H743配置大同小异,H7多出来的地方也没什么。
我就以H743+IS61WV204816BLL的配置为例:

二、配置CubeMX

首先还是惯例的配置时钟,还有电源调整器电压范围调为0(这样就能把时钟调得很高)。
在这里插入图片描述
然后把时钟配一下,拉到最高480M,让cubemx自动配置
在这里插入图片描述

照例打开串口
在这里插入图片描述

接下来就是配置FMC啦,SRAM就是挂在这个接口上(这个接口在F407上叫FSMC,FMC可以看作是升级版,比FSMC多些功能,还能挂SDRAM)
先是第一部分的配置:
在这里插入图片描述
这三点需要额外注意!!!
在这里插入图片描述

①首先,我们SRAM挂在这个区域,但可要注意了,这个区域里有个很容易忽视的“4x64MB”,原来这个区域又划分成了4个64MB的区域!
NE1区域:0x6000 0000 ~0x63FF FFFF
NE2区域:0x6400 0000 ~0x67FF FFFF
NE3区域:0x6800 0000 ~0x6BFF FFFF
NE4区域:0x6C00 0000 ~0x6FFF FFFF
而我们的SRAM挂在哪个NE上,要取决于SRAM的CS引脚接在STM32上的哪个引脚上,比如我的SRAM的CS引脚接在STM32H743ZIT6的PC7上,这个引脚有FMC_NE1的功能,所以我这里用的就是NE1,在CubeMX里就选择NE1。
②然后看到地址位,为什么我填的是21bit呢?因为这个SRAM是204816,这个名字表明这是一个2048K行位宽16位的SRAM,2048千行需要多少位来表示呢?2的21次方就是2048K,所以这个芯片的地址线有21bit(A0-A20),当然,这个也能在手册里看见,我啰嗦几句只是想把这个讲得更生动一些。(照例来说,如果是102416,就是20bit(A0-A19);51216就是19bit(A0-A18))
③16位宽,所以是16咯。下面也要勾上允许16位写入。

接下来是FMC配置的第二个部分,没什么好说的。
在这里插入图片描述
生成代码后打开MDK

三、配置MDK和程序

接下来是配置MDK和程序:
勾上微库,勾掉信息生成,关闭优化,勾上reset and run。都是基本操作了。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
程序配置,我喜欢先配置串口,配置好之后编译一下看看有没有问题。
串口重定向:

int fputc(int ch, FILE *f)
{
//具体哪个串口可以更改huart1为其它串口
HAL_UART_Transmit(&huart3 , (uint8_t *)&ch, 1 , 0x0f);
return ch;
}

别忘了在需要串口输出的程序上添加:

#include “stdio.h”

然后在fmc.c中添加一个测试SRAM的程序(摘自野火的例程)

/**
  * @brief  测试SRAM是否正常 
  * @param  None
  * @retval 正常返回1,异常返回0
  */
uint8_t SRAM_Test(void)
{
  /*写入数据计数器*/
  uint32_t counter=0;
  
  /* 8位的数据 */
  uint8_t ubWritedata_8b = 0, ubReaddata_8b = 0;  
  
  /* 16位的数据 */
  uint16_t uhWritedata_16b = 0, uhReaddata_16b = 0; 
  
  SRAM_INFO("正在检测SRAM,以8位、16位的方式读写sram...");


  /*按8位格式读写数据,并校验*/
  
  /* 把SRAM数据全部重置为0 ,IS62WV51216_SIZE是以8位为单位的 */
  for (counter = 0x00; counter < IS62WV51216_SIZE; counter++)
  {
    *(__IO uint8_t*) (Bank1_SRAM4_ADDR + counter) = (uint8_t)0x0;
  }
  
  /* 向整个SRAM写入数据  8位 */
  for (counter = 0; counter < IS62WV51216_SIZE; counter++)
  {
    *(__IO uint8_t*) (Bank1_SRAM4_ADDR + counter) = (uint8_t)(ubWritedata_8b + counter);
  }
  
  /* 读取 SRAM 数据并检测*/
  for(counter = 0; counter<IS62WV51216_SIZE;counter++ )
  {
    ubReaddata_8b = *(__IO uint8_t*)(Bank1_SRAM4_ADDR + counter);  //从该地址读出数据
    
    if(ubReaddata_8b != (uint8_t)(ubWritedata_8b + counter))      //检测数据,若不相等,跳出函数,返回检测失败结果。
    {
      SRAM_ERROR("8位数据读写错误!");
      return 0;
    }
  }
	
  
  /*按16位格式读写数据,并检测*/
  
  /* 把SRAM数据全部重置为0 */
  for (counter = 0x00; counter < IS62WV51216_SIZE/2; counter++)
  {
    *(__IO uint16_t*) (Bank1_SRAM4_ADDR + 2*counter) = (uint16_t)0x00;
  }
  
  /* 向整个SRAM写入数据  16位 */
  for (counter = 0; counter < IS62WV51216_SIZE/2; counter++)
  {
    *(__IO uint16_t*) (Bank1_SRAM4_ADDR + 2*counter) = (uint16_t)(uhWritedata_16b + counter);
  }
  
    /* 读取 SRAM 数据并检测*/
  for(counter = 0; counter<IS62WV51216_SIZE/2;counter++ )
  {
    uhReaddata_16b = *(__IO uint16_t*)(Bank1_SRAM4_ADDR + 2*counter);  //从该地址读出数据
    
    if(uhReaddata_16b != (uint16_t)(uhWritedata_16b + counter))      //检测数据,若不相等,跳出函数,返回检测失败结果。
    {
      SRAM_ERROR("16位数据读写错误!");

      return 0;
    }
  }
  
  SRAM_INFO("SRAM读写测试正常!"); 
  /*检测正常,return 1 */
  return 1;
}

然后在fmc.h中前后分别添加两段代码

段前:

/* USER CODE BEGIN Includes */
#include "stdio.h"
//地址线范围为A0~A19 
#define Bank1_SRAM1_ADDR    ((uint32_t)(0x60000000))
#define IS62WV51216_SIZE 0x200000  //1024*16/2bits = 0x200000  ,2M字节
/* USER CODE END Includes */

段后:

/* USER CODE BEGIN Prototypes */
/*信息输出*/
#define SRAM_DEBUG_ON         1
#define SRAM_INFO(fmt,arg...)           printf("<<-SRAM-INFO->> "fmt"\n",##arg)
#define SRAM_ERROR(fmt,arg...)          printf("<<-SRAM-ERROR->> "fmt"\n",##arg)
#define SRAM_DEBUG(fmt,arg...)          do{\
                                          if(SRAM_DEBUG_ON)\
                                          printf("<<-SRAM-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\
                                          }while(0)
uint8_t SRAM_Test(void);														
/* USER CODE END Prototypes */

在main.c中添加引用SRAM检测函数对SRAM进行检测,并用串口打印出检测结果。

printf("SRAM配置实例");
	
printf ( "\r\n扩展SRAM写入/读取测试开始\r\n" );
if(SRAM_Test()==1)
{
	printf("测试成功");	  
}
else
{	
	printf("测试失败");
}

编译下载,结果成功!

在这里插入图片描述

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: STM32H743是一款高性能、高集成度的微控制器,具有灵活的内存映射。它的内存映射方案如下: 1. Flash存储器:STM32H743具有多个Flash存储器扇区,用于存储程序代码和数据。其中一部分区域是用于存放读写操作的代码和数据,另一部分区域是用于存放只读操作的代码。 2. SRAM存储器:SRAM用于存储程序数据和变量。STM32H743具有多个SRAM存储器,包括系统存储器和备份存储器。系统存储器用于执行程序代码和存储变量,备份存储器用于保存系统的状态和数据。 3. 外设寄存器:STM32H743具有丰富的外设模块,这些外设模块通过内存映射方式与内存连接。每个外设都有一组寄存器,用于控制和配置外设的功能。通过访问这些寄存器,可以配置外设的工作模式和参数。 4. DMA控制器:DMA(直接内存访问)控制器也是通过内存映射方式与内存相连。它允许外设和存储器之间直接进行数据传输,减轻了CPU的负担。通过访问DMA控制器的寄存器,可以配置和控制DMA传输的参数和工作模式。 5. 外部存储器:STM32H743还支持外部存储器的连接,如SDRAM、NAND Flash等。这些外部存储器也是通过内存映射方式进行访问。 总的来说,STM32H743的内存映射方案将Flash、SRAM、外设寄存器、DMA控制器和外部存储器等模块通过地址映射到内存空间中,使得它们可以被代码直接访问和控制。这种灵活的内存映射方案为开发者提供了方便的硬件编程接口,使得开发和调试过程更加高效和简单。 ### 回答2: STM32H743是意法半导体(STMicroelectronics)推出的一款高性能微控制器,具有丰富的外设和较大的内存容量,其内存映射如下: 首先,STM32H743具备了多种类型的内存。首先是Flash存储器,它用于存储程序代码和常量数据。STM32H743具有2MB的Flash存储器,其中一部分用于存储固件启动程序(BootLoader),其余部分用于用户程序代码。 接下来是SRAM存储器,用于存储运行时数据。STM32H743配备了1MB的SRAM存储器,可根据需要分配给不同的数据段,如栈、堆和全局变量。 此外,STM32H743还具有Tightly Coupled Memory(TCM),是一种特殊类型的SRAM存储器,它与CPU之间的访问速度更快。STM32H743提供了512KB的TCM存储器,可以用于高速数据处理和执行关键代码。 另外,STM32H743还具备外部SDRAM(Synchronous Dynamic Random Access Memory)存储器接口,可以扩展额外的存储容量。这对于需要大量存储空间的应用程序来说非常有用。 除了存储器的类型,STM32H743还采用了一种特殊的地址空间布局。它将不同类型的存储器映射到不同的地址范围。例如,Flash存储器映射到地址范围0x0800 0000-0x081F FFFF,SRAM存储器映射到地址范围0x2000 0000-0x200F FFFF等。这种地址映射方案方便了程序的访问和管理。 总的来说,STM32H743的内存映射提供了多种类型的存储器,包括Flash存储器、SRAM存储器、TCM存储器和外部SDRAM存储器接口,可以满足不同应用场景对存储容量和存储速度的需求。同时,合理的地址映射方案也方便了程序员对存储器的访问和管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值