STM32CUBEMX安富莱STM32-V6开发板使用FMC驱动SDRAM芯片MT48LC4M32B2TG

文章的目的是快速使用SDRAM芯片,没有详细讲解原理。

1、环境:

单片机:STM32F429VIT6
CUBE版本:STM32CUBMX 6.12.1
编译:KEIL MDK
硬件:安富莱STM32-V6开发板
SDRAM芯片:MT48LC4M32B2TG

2、配置步骤

1、系统时钟,我的开发版外部8M晶振有问题了,所以用的是内部16M。主要AHB的时钟频率,因为SDRAM芯片要根据他来计算参数。
在这里插入图片描述
2、FMC配置
在这里插入图片描述
在这里插入图片描述
参数按上面配置,上面的参数具体是根据MT48LC4M32B2TG的规格书与AHB时钟频率计算所得,具体详情请搜索。

3、注意

注意:配置玩FMC的参数后,需要根据硬件实际连接情况,调整引脚配置,安富莱的硬件引脚与FMC的默认引脚有些许变动,需要调整。

引脚使用得比较多,要仔细检查
可以参考下面的使用情况,在cube上引脚重新选择一下即可。

	/* GPIOD */GPIO_Init_Structure.Pin  = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8| GPIO_PIN_9 | GPIO_PIN_10 |\GPIO_PIN_14 | GPIO_PIN_15;HAL_GPIO_Init(GPIOD, &GPIO_Init_Structure);/* GPIOE */  GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_7| GPIO_PIN_8 | GPIO_PIN_9 |\GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |\GPIO_PIN_15;	  HAL_GPIO_Init(GPIOE, &GPIO_Init_Structure);/* GPIOF */  GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3 | GPIO_PIN_4 |\GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |\GPIO_PIN_15;HAL_GPIO_Init(GPIOF, &GPIO_Init_Structure);/* GPIOG */  GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 |  GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15;HAL_GPIO_Init(GPIOG, &GPIO_Init_Structure);/* GPIOH */  GPIO_Init_Structure.Pin = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_9 |\GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |\GPIO_PIN_15;	HAL_GPIO_Init(GPIOH, &GPIO_Init_Structure); /* GPIOI */  GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 |\GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_9 | GPIO_PIN_10;HAL_GPIO_Init(GPIOI, &GPIO_Init_Structure);  

4、驱动编写及使用

1、头文件
上面的配置完成后,可以生成工程文件,然后就开始编写SDRAM的驱动程序。

/***
* SDRAM型号MT48LC4M32B2TG-7, 32位带宽, 容量16MB, 7ns速度(143MHz)。
* 外部SDRAM使用方法
* 绝对定位方式访问 SDRAM,这种方式必须定义成全局变量 1.直接定义变量,分配到外部EXT_SDRAM_ADDRuint8_t testValue __attribute__((at(EXT_SDRAM_ADDR)));2.函数直接操作引用testValue = 0xaa;
**/#ifndef _SDRAM_FMC_DRV_H_
#define _SDRAM_FMC_DRV_H_#include "fmc.h"#define EXT_SDRAM_ADDR  	((uint32_t)0xC0000000)
#define EXT_SDRAM_SIZE		(16 * 1024 * 1024)void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command);#endif /* _SDRAM_FMC_DRV_H_ */
//

2、C文件

#include "bsp_sdram.h"/* #define SDRAM_MEMORY_WIDTH            FMC_SDRAM_MEM_BUS_WIDTH_8  */
/* #define SDRAM_MEMORY_WIDTH            FMC_SDRAM_MEM_BUS_WIDTH_16 */
//#define SDRAM_MEMORY_WIDTH               FMC_SDRAM_MEM_BUS_WIDTH_32//#define SDCLOCK_PERIOD                   FMC_SDRAM_CLOCK_PERIOD_2
/* #define SDCLOCK_PERIOD                FMC_SDRAM_CLOCK_PERIOD_3 */#define SDRAM_TIMEOUT                    ((uint32_t)0xFFFF)
#define REFRESH_COUNT                    ((uint32_t)1293)    /* SDRAM自刷新计数 */  /* SDRAM的参数配置 */
#define SDRAM_MODEREG_BURST_LENGTH_1             ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2             ((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8             ((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3              ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200)/*
*********************************************************************************************************
*	函 数 名: SDRAM初始化序列
*	功能说明: 完成SDRAM序列初始化
*	形    参: hsdram: SDRAM句柄
*			  Command: 命令结构体指针
*	返 回 值: None
*********************************************************************************************************
*/
void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
{__IO uint32_t tmpmrd =0;/*##-1- 时钟使能命令 ##################################################*/Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;;Command->AutoRefreshNumber = 1;Command->ModeRegisterDefinition = 0;/* 发送命令 */HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);/*##-2- 插入延迟,至少100us ##################################################*/HAL_Delay(1);/*##-3- 整个SDRAM预充电命令,PALL(precharge all) #############################*/Command->CommandMode = FMC_SDRAM_CMD_PALL;Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;Command->AutoRefreshNumber = 1;Command->ModeRegisterDefinition = 0;/* 发送命令 */HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);/*##-4- 自动刷新命令 #######################################################*/Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;Command->AutoRefreshNumber = 8;Command->ModeRegisterDefinition = 0;/* 发送命令 */HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);/*##-5- 配置SDRAM模式寄存器 ###############################################*/tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |SDRAM_MODEREG_CAS_LATENCY_3           |SDRAM_MODEREG_OPERATING_MODE_STANDARD |SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;Command->AutoRefreshNumber = 1;Command->ModeRegisterDefinition = tmpmrd;/* 发送命令 */HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);/*##-6- 设置自刷新率 ####################################################*//*SDRAM refresh period / Number of rows)*SDRAM时钟速度 – 20= 64ms / 4096 *84MHz - 20= 1292.5 取值1293*/HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT); 
}

3、初始化
添加上面的文件到工程目录,打开“fmc.c”文件,找到“void MX_FMC_Init(void)”函数,按如下操作添加内容:
在这里插入图片描述

在这里插入图片描述
4、编译即可
debug查看内容。注意:SDRAM按如上配置的话,映射的起始地址为:0XC0000000。可以修改、使用了。

  • 外部SDRAM使用方法
  • 绝对定位方式访问 SDRAM,这种方式必须定义成全局变量
    1.直接定义变量,分配到外部EXT_SDRAM_ADDR
    uint8_t testValue attribute((at(EXT_SDRAM_ADDR)));
    2.函数直接操作引用
    testValue = 0xaa;
    在这里插入图片描述

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

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

相关文章

为什么QNAP威联通NAS的APP center无法安装APP?

创作立场:原创不易,拒绝搬运~ hello大家好,我是你们的老伙伴,稳重的大王~ 如题,大王带你一起来排查一下,可能遇到的问题。如有帮助,请给个关注鼓励,互谢~ 1 首先,安装…

第三百零一节 Lucene教程 - Lucene索引文件

Lucene教程 - Lucene索引文件 索引是识别文档并为搜索准备文档的过程。 下表列出了索引过程中常用的类。 类描述IndexWriter在索引过程中创建/更新索引。Directory表示索引的存储位置。Analyzer分析文档并从文本中获取标记/单词。Document带有字段的虚拟文档。分析仪可以处理…

人工智能算法之粒子群优化算法

人工智能算法之粒子群优化算法 粒子群优化算法(PSO)是一种群体智能优化算法,由Kennedy和Eberhart在1995年提出,灵感来源于鸟群、鱼群等生物群体行为。PSO通过群体中个体的交互及对周围环境的感知,快速找到最优解。PSO算…

【深入浅出】深入浅出transformer(附面试题)

本文的目的是为了帮助大家面试transformer,会结合我的面试经历以及看法去讲解transformer,并非完整的技术细致讲解,介意请移步。 结构 提到transformer网络模型,大家脑海中是否有这张图呢? 这是网络结构中经典的编解…

net 获取本地ip地址,net mvc + net core 两种

net mvc public static string GetIP(HttpRequestBase request){// 尝试获取 X-Forwarded-For 头string result request.Headers["X-Forwarded-For"]?.Split(,).FirstOrDefault()?.Trim();if (string.IsNullOrEmpty(result)){// 获取用户的 IP 地址result reques…

项目里MongodbTemplate用法

1. 先引入依赖(这里以gradle项目为例) implementation org.springframework.boot:spring-boot-starter-data-mongodb2. 在对应应类上获取MongoTemplate private final MongoTemplate mongoTemplate;3. 下面就是一些常用功能实现 注: 下面的XXX是你的表名 3.1 数据保存 实现1…

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识 在Android开发中,Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用,尤其是在高并发和UI性能优化中,可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…

pcl::IntegralImageNormalEstimation Assertion Assertion `v == T(Value)‘ failed.

pcl::IntegralImageNormalEstimation: Assertion Assertion v T(Value)’ failed. 最新项目用到IntegralImageNormalEstimation类计算法向量。配置运行成功后。 我用 PCL version 1.12.1 on Ubuntu 22. The eigen3 version is 3.4.0 运行IntegralImageNormalEst…

后端:Spring、Spring Boot-配置、定义bean

文章目录 1. 什么是Bean,如何配置2. 如何配置bean2.1 使用注解Bean2.2 使用注解Import 1. 什么是Bean,如何配置 被spring容器所管理的对象被称为bean,管理方式可以有纯xml文件方式、注解方式进行管理(比如注解Component)。 在Spring Boot中&…

开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码

大家好,我是一颗甜苞谷,今天分享一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码。 前言 在当前的物流仓储行业,企业面临着信息化升级的迫切需求,但往往受限于高昂的软件采购和维护成本。现有的…

vue添加省市区

主要参考“element”框架&#xff1a;Element - The worlds most popular Vue UI framework <div class"block"><span class"demonstration">默认 click 触发子菜单</span><el-cascaderv-model"value":options"optio…

Sigrity Power SI Resonance analysis模式如何进行谐振分析操作指导

Sigrity Power SI Resonance analysis模式如何进行谐振分析操作指导 Sigrity Power SI可以方便快捷的进行谐振分析,谐振分析的目的是为了分析电源地平面组成的腔体的谐振频率以及谐振幅度,让频率在谐振频率附近的信号避开谐振腔,以及添加相应的电容来降低谐振峰值. 仍然以这…

java-web-day7-会话跟踪技术

会话跟踪技术 1.cookie 优点:HTTP协议中支持的技术 缺点: 移动端App无法使用cookie 安全性不强, 而且用户可以自己禁用cookie cookie不能跨域 什么是跨域?协议,IP/域名, 端口三者中有一个不一样就是跨域 2.session--基于cookie实现 优点:用户数据存储在服务端, 只给浏览器一个…

vue特性

Vue.js是一套构建用户界面的渐进式框架&#xff0c;其特性主要包括以下几点&#xff1a; MVVM模式 Vue.js采用了MVVM&#xff08;Model-View-ViewModel&#xff09;的设计模式。在这种模式下&#xff0c;Model代表数据模型&#xff0c;View代表用户界面&#xff0c;ViewModel…

【AI开源项目】FastGPT- 快速部署FastGPT以及使用知识库的两种方式!

文章目录 一、FastGPT大模型介绍1. 开发团队2. 发展史3. 基本概念 二、FastGPT与其他大模型的对比三、使用 Docker Compose 快速部署 FastGPT1、安装 Docker 和 Docker Compose&#xff08;1&#xff09;. 安装 Docker&#xff08;2&#xff09;. 安装 Docker Compose&#xff…

Kubernetes实战——DevOps集成SpringBoot项目

目录 一、安装Gitlab 1、安装并配置Gitlab 1.1 、下载安装包 1.2、安装 1.3、修改配置文件 1.4、更新配置并重启 2、配置 2.1、修改密码 2.2、禁用注册功能 2.3、取消头像 2.4、修改中文配置 2.5、配置 webhook 3、卸载 二、安装镜像私服Harbor 1、下载安装包 2、…

从0学习React(7)

在上篇文章中&#xff0c;我们重点讲了关于函数组件的状态管理。这篇文章&#xff0c;我用一种新的方式来讲一讲React&#xff0c;我会通过一个函数来去讲React。当然&#xff0c;这肯定不能一个函数讲完&#xff0c;但是我可以讲很多个函数&#xff0c;一篇文章讲一个&#xf…

安卓屏幕息屏唤醒

背景&#xff0c;今天遇项目需要&#xff0c;需要在下载在后台任务运行时&#xff08;如下载、上传或进行长时间计算&#xff09;&#xff0c;保持 CPU 活动&#xff0c;然后就写了这个实现方法&#xff0c;废话不多说上代码 第一步&#xff0c;再清单AndroidManifest文件声明权…

多项目管理复杂性对企业的影响

在现代企业中&#xff0c;多项目管理已成为提升竞争力的关键策略。然而&#xff0c;资源分配冲突、沟通协调难题、优先级排序复杂等因素使得多项目管理充满挑战。资源分配冲突尤其突出&#xff0c;因为在多个项目同时进行时&#xff0c;有限的资源需要在不同项目间进行合理分配…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…