STM32F407通过FSMC扩展外部SRAM和NAND FLASH

news2025/2/21 10:41:59

1 扩展外部SRAM

1.1 地址情况

 FSMC控制器的存储区分为4个区(Bank),每个区256MB。其中,Bank1可以用于连接SRAM、NOR FLASH、PSRAM,还可以连接TFT LCD。Bank1的地址范围是0x60000000~0x6FFFFFFF。Bank1又分为4个子区,每个子区寻址空间是64MB,占用26位地址线。4个子区的地址范围分别如下。

Bank 1子区1:0x60000000~0x63FFFFFF。
Bank 1子区2:0x64000000~0x67FFFFFF。
Bank 1子区3:0x68000000~0x6BFFFFFF(开发板上用于外扩SRAM)。
Bank 1子区4:0x6C000000~0x6FFFFFFF(开发板上用于连接TFTLCD)。

 每个子区有一个专用的片选信号。下面将使用Bank 1子区3连接一个1MB的SRAM芯片,为系统扩展内存。

下述引脚都可以直接通过STM32CubeMX配置:

A0至A18是19根地址线,连接FSMC的19根地址线,即FSMC_A0至FSMC_A18。
I/O0至I/O15是16位数据线,连接FSMC的FSMC_D0至FSMC_D15数据线。
CE是芯片的片选信号,连接MCU的FSMC_NE3(PG10引脚),也就是Bank 1子区3的片选信号。
OE是输出使能信号,连接MCU的FSMC_NOE(PD4引脚),是读数据时的使能信号。
WE是写使能信号,连接MCU的FSMC_NWE(PD5引脚),是写数据使能信号。
UB是高字节使能信号,连接MCU的FSMC_NBL1(PE1引脚)。
LB是低字节使能信号,连接MCU的FSMC_NBL0(PE0引脚)。

这里19根地址线,但是有UB和LB两个脚,可以分别使能高低字节,所以这样总存储量就可以达到2的20次方等于1MB

考虑到FSMC Bank 1-NOR/PSRAM3起始地址为0x6800 0000,因此如果要访问IS62WV51216芯片全部的1024KB数据的地址范围应该为0x6800 0000~0x680F FFFF

1.2 实验材料

本实验使用STM32F407ZGT6开发板,我买的开发板引脚顺序如下,注意顺序

SRAM芯片型号为IS62WV51216,其为16位宽512K容量的静态随机存取存储器,原理图如下

我这个开发板背面有带预留SRAM焊点,如果没有,可以自己画个板子做一下

1.3 STM32CubeMX配置过程

这里选择1 2 3 4配置无所谓,主要是下面

片选信号选NE3,存储器种类选SRAM,地址位数选19位(注意虽然存储容量为1MB,但是有19根地址线,数据位数16位,勾选Byte enable

不用修改引脚,自动配置都没问题

参数如下:

1.4 测试代码

打开Keil工程,代码如下:

/*定义SRAM地址*/
#define SRAM_ADDR_BEGIN		0x68000000UL //Bank1 子区3的 SRAM起始地址
#define SRAM_ADDR_HALF		0x68080000UL //SRAM 中间地址 512K字节
#define SRAM_ADDR_END	    0x680FFFFFUL //SRAM 结束地址 1024K字节
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}
/*用HAL函数写入数据*/
void SRAM_WriteByFunc(void)
{
    //1.写入字符串
    uint32_t *pAddr = (uint32_t *)(SRAM_ADDR_BEGIN);	//给指针赋值
    uint8_t strIn[] = "Moment in UPC";
    uint16_t dataLen = sizeof(strIn); //数据长度,字节数,包括最后的结束符'\0’
    if(HAL_SRAM_Write_8b(&hsram3, pAddr, strIn, dataLen) == HAL_OK)
    {
        printf("Write string at 0x6800 0000:");
        printf("%s\r\n",strIn);
				flg=1;
    }
 
    //2.写入一个随机数
    uint32_t num=0;
    pAddr=(uint32_t *)(SRAM_ADDR_BEGIN+256);	//指针重新赋值
    HAL_RNG_GenerateRandomNumber(&hrng, &num);	//产生32位随机数
    if(HAL_SRAM_Write_32b(&hsram3, pAddr, &num, 1) == HAL_OK)
    {
        printf("Write 32b number at 0x6800 0100");
        printf("0x%x\r\n", num);	
				flg=2;
    }
    printf("-----------------------------------------\r\n");
}
 
/*用HAL函数读取数据*/
void SRAM_ReadByFunc(void)
{
    //1.读取字符串
    uint32_t *pAddr = (uint32_t *)(SRAM_ADDR_BEGIN);	//给指针赋值
    uint8_t strOut[30];
    uint16_t dataLen = 30;
    if(HAL_SRAM_Read_8b(&hsram3, pAddr, strOut, dataLen) == HAL_OK)
    {
        printf("Read string at 0x6800 0000:");
        printf("%s\r\n", strOut); 
    }
 
    //2.读取一个uint32_t数
    uint32_t num=0;
    pAddr=(uint32_t *)(SRAM_ADDR_BEGIN+256);	//指针重新赋值,指向一个新的地址
    if(HAL_SRAM_Read_32b(&hsram3, pAddr, &num, 1) == HAL_OK)
    {
        printf("Read 32b number at 0x6800 0100:");
        printf("0x%x\r\n", num);
    }
    printf("-----------------------------------------\r\n");
}
while (1)
{
    SRAM_WriteByFunc();
    HAL_Delay(1000);
	SRAM_ReadByFunc();
	HAL_Delay(1000);
}

2 扩展外部NAND FLASH

2.1 实验材料

SRAM芯片型号为MT29F4G08,原理图如下:

2.2 STM32CubeMX配置过程

片选信号选择NCE3,数据位数为8位,参数配置如下:

2.3 测试代码

static NAND_IDTypeDef NAND_ID;
static HAL_StatusTypeDef res;
res = HAL_NAND_Read_ID(&hnand1, &NAND_ID);
static NAND_AddressTypeDef pAddress;
pAddress.Block = 1;
pAddress.Page = 2;
pAddress.Plane = 0;
static uint8_t pBuffer[2048];
for(uint16_t i = 0; i < 2048; i++)
{
	pBuffer[i] = 2+i;
}
HAL_NAND_Erase_Block(&hnand1, &pAddress);
res = HAL_NAND_Read_Page_8b(&hnand1, &pAddress, pBuffer, 1);
if(HAL_OK == res)
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
else
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}
for(uint16_t i = 0; i < 2048; i++)
{
	pBuffer[i] = 2+i;
}
res = HAL_NAND_Write_Page_8b(&hnand1, &pAddress, pBuffer, 1);
if(HAL_OK == res)
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
else
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}
for(uint16_t i = 0; i < 2048; i++)
{
	pBuffer[i] = 4+i;
}	
res = HAL_NAND_Read_Page_8b(&hnand1, &pAddress, pBuffer, 1);
if(HAL_OK == res)
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
else
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2298481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AndroidStudio查看Sqlite和SharedPreference

1.查看Sqlite 使用App Inspection&#xff0c;这是个好东西 打开方式&#xff1a;View → Tool Windows → App Inspection 界面如图&#xff1a; App inspection不但可以看Sqlite还可以抓包network和background task连抓包工具都省了。 非常好使 2.查看sharedPreference 使…

Elasticsearch:15 年来致力于索引一切,找到重要内容

作者&#xff1a;来自 Elastic Shay Banon 及 Philipp Krenn Elasticsearch 刚刚 15 岁了&#xff01;回顾过去 15 年的索引和搜索&#xff0c;并展望未来 15 年的相关内容。 Elasticsearch 刚刚成立 15 周年。一切始于 2010 年 2 月的一篇公告博客文章&#xff08;带有标志性的…

信呼OA办公系统sql注入漏洞分析

漏洞描述 信呼OA办公系统uploadAction存在SQL注入漏洞&#xff0c;攻击者可利用该漏洞获取数据库敏感信息。 环境搭建 源码下载地址&#xff1a;https://github.com/rainrocka/xinhu 下载后解压到本地网站根目录下&#xff0c;配置好数据库&#xff0c;然后安装即可 默认密…

机器学习算法 - 随机森林之决策树初探(1)

随机森林是基于集体智慧的一个机器学习算法&#xff0c;也是目前最好的机器学习算法之一。 随机森林实际是一堆决策树的组合&#xff08;正如其名&#xff0c;树多了就是森林了&#xff09;。在用于分类一个新变量时&#xff0c;相关的检测数据提交给构建好的每个分类树。每个…

原生Three.js 和 Cesium.js 案例 。 智慧城市 数字孪生常用功能列表

对于大多数的开发者来言&#xff0c;看了很多文档可能遇见不到什么有用的&#xff0c;就算有用从文档上看&#xff0c;把代码复制到自己的本地大多数也是不能用的&#xff0c;非常浪费时间和学习成本&#xff0c; 尤其是three.js &#xff0c; cesium.js 这种难度较高&#xff…

在 PyCharm 中接入deepseek的API的各种方法

在 PyCharm 中接入 DeepSeek 的 API&#xff0c;通常需要以下步骤&#xff1a; 1. 获取 DeepSeek API 密钥 首先&#xff0c;确保你已经在 DeepSeek 平台上注册并获取了 API 密钥&#xff08;API Key&#xff09;。如果没有&#xff0c;请访问 DeepSeek 的官方网站注册并申请 …

【2025新】基于springboot的问卷调查小程序设计与实现

目录 一、整体目录&#xff08;示范&#xff09;&#xff1a; 文档含项目技术介绍、E-R图、数据字典、项目功能介绍与截图等 二、运行截图 三、代码部分&#xff08;示范&#xff09;&#xff1a; 四、数据库表(示范)&#xff1a; 数据库表有注释&#xff0c;可以导出数据…

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 &#xff08;1&#xff09;创建Makefile文件 &#xff08;2&#xff09;编译规则 &#xff08;3&#xff09;编译 &#xff08;4&#xff09;变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…

什么是Docker多架构容器镜像

什么是Docker多架构容器镜像 在 Docker 中&#xff0c;同一个 Docker 镜像可以在不同的平台上运行&#xff0c;例如在 x86、ARM、PowerPC 等不同的 CPU 架构上。 为了支持这种多平台的镜像构建和管理&#xff0c;Docker 在 17.06 版本时引入了 Manifest 的概念&#xff0c;在…

【devops】 Git仓库如何fork一个私有仓库到自己的私有仓库 | git fork 私有仓库

一、场景说明 场景&#xff1a; 比如我们Codeup的私有仓库下载代码 放入我们的Github私有仓库 且保持2个仓库是可以实现fork的状态&#xff0c;即&#xff1a;Github会可以更新到Codeup的最新代码 二、解决方案 1、先从Codeup下载私有仓库代码 下载代码使用 git clone 命令…

RocketMQ及和Kafka的区别

目录 1 从场景入手2 RocketMQ是什么&#xff1f;3 RocketMQ及和Kafka的区别3.1 在架构上做了减法3.1.1 简化协调节点3.1.2 简化分区3.1.3 底层存储3.1.3.1 Kafka底层存储3.1.3.1 RocketMQ底层存储 3.1.4 简化备份模型3.1.4.1 Kafka备份模型3.1.4.2 RocketMQ备份模型 3.1.5 Rock…

【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统

项目介绍 本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…

Datawhale Ollama教程笔记3

小白的看课思路&#xff1a; Ollama REST API 是什么&#xff1f; 想象一下&#xff0c;你有一个智能的“盒子”&#xff08;Ollama&#xff09;&#xff0c;里面装了很多聪明的“小助手”&#xff08;语言模型&#xff09;。如果你想让这些“小助手”帮你完成一些任务&#…

基于JavaWeb开发的Java+Spring+vue+element实现旅游信息管理平台系统

基于JavaWeb开发的JavaSpringvueelement实现旅游信息管理平台系统 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各…

【技术产品】DS三剑客:DeepSeek、DataSophon、DolphineSchduler浅析

引言 在大数据与云原生技术快速发展的时代&#xff0c;开源技术成为推动行业进步的重要力量。本文将深入探讨三个备受瞩目的开源产品组件&#xff1a;DeepSeek、DataSophon 和 DolphinScheduler&#xff0c;分别从产品定义、功能、技术架构、应用场景、优劣势及社区活跃度等方面…

云计算实训室解决方案(2025年最新版)

一、中高职及本科院校在云计算专业建设中面临的挑战 随着大数据、信息安全、人工智能等新兴信息技术产业的快速发展&#xff0c;相关领域人才需求激增&#xff0c;许多本科及职业院校纷纷开设云计算及相关专业方向。 然而&#xff0c;大多数院校在专业建设过程中面临以下困难&…

我的新书《青少年Python趣学编程(微课视频版)》出版了!

&#x1f389; 激动人心的时刻来临啦&#xff01; &#x1f389; 小伙伴们久等了&#xff0c;我的第一本新书 《青少年Python趣学编程&#xff08;微课视频版&#xff09;》 正式出版啦&#xff01; &#x1f4da;✨ 在这个AI时代&#xff0c;市面上的Python书籍常常过于枯燥&…

网络安全要学python 、爬虫吗

网络安全其实并不复杂&#xff0c;只是比普通开发岗位要学习的内容多一点。无论是有过编程基础还是零基础的都可以学习的。网络安全目前可就业的岗位从技术上可分为两部分&#xff1a;web安全和二进制逆向安全。web安全是网络安全的入门方向&#xff0c;内容简单&#xff0c;就…

DBSCAN 基于密度的空间带噪聚类法

DBSCAN 基于密度的空间带噪聚类法 DBSCAN&#xff08;Density - Based Spatial Clustering of Applications with Noise&#xff09;即基于密度的空间聚类算法&#xff0c;它是一种典型的密度聚类算法&#xff0c;以下从核心概念、算法步骤、优缺点及应用场景等方面进行解释。…

Python基于Django的漏洞扫描系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…