news 2026/4/29 20:51:22

STM32F429IGT6驱动FMC_SDRAM——W9825G6KH-6

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F429IGT6驱动FMC_SDRAM——W9825G6KH-6

参考文档:

https://zhuanlan.zhihu.com/p/657819569
https://blog.csdn.net/weixin_41613969/article/details/126822480
https://blog.csdn.net/m0_69169562/article/details/143217380
https://blog.csdn.net/qq_42039294/article/details/112221396
https://blog.csdn.net/qq_45467083/article/details/109425825
https://blog.51cto.com/u_15262460/3243123
https://blog.51cto.com/u_15830484/5761618
https://blog.csdn.net/Simon223/article/details/107819310
https://blog.csdn.net/Ningjianwen/article/details/90940570
https://blog.csdn.net/chen18221987993/article/details/128970443

https://www.bilibili.com/video/BV13a411c7UK/?vd_source=2a185775b9481ebf3be36db7d3ece99a

一、配置STM32CUBEMX

配置信息安装芯片要求配置,这里使用的是W9825G6KH-6,配置在SDRAM1,起始地址为0xC0000000。

按照下列配置,配置相关数据:

二、初始化函数

sdram_fmc.h :

#ifndef __SDRAM_FMC_H__ #define __SDRAM_FMC_H__ #include "main.h" #define EXT_SDRAM_ADDR ((uint32_t)0xC0000000) // BANK1 0XC000 0000 BANK2 0XD000 0000 #define EXT_SDRAM_SIZE (32 * 1024 * 1024) // 内存大小 32MB = 256Mbit #define SDRAM_TEST_SIZE (4 * 16 * 1024) // 单次读写间隔 #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) void SDRAM_Init(void); void fsmc_sdram_test(void); void sdram_test(void); #endif

sdram_fmc.c :

#include "sdram_fmc.h" #include "fmc.h" #include "usart.h" static int SDRAM_SendCommand(uint32_t CommandMode, uint32_t Bank, uint32_t RefreshNum, uint32_t RegVal) { uint32_t CommandTarget; FMC_SDRAM_CommandTypeDef Command; if (Bank == 1) { CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; } else if (Bank == 2) { CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; } Command.CommandMode = CommandMode; Command.CommandTarget = CommandTarget; Command.AutoRefreshNumber = RefreshNum; Command.ModeRegisterDefinition = RegVal; if (HAL_SDRAM_SendCommand(&hsdram1, &Command, 0x1000) != HAL_OK) { return -1; } return 0; } void SDRAM_Init(void) { uint32_t temp; /* 1. 时钟使能命令 */ SDRAM_SendCommand(FMC_SDRAM_CMD_CLK_ENABLE, 1, 1, 0); /* 2. 延时,至少100us */ HAL_Delay(1); /* 3. SDRAM全部预充电命令 */ SDRAM_SendCommand(FMC_SDRAM_CMD_PALL, 1, 1, 0); /* 4. 自动刷新命令 */ SDRAM_SendCommand(FMC_SDRAM_CMD_AUTOREFRESH_MODE, 1, 8, 0); /* 5. 配置SDRAM模式寄存器 */ temp = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 | //设置突发长度:1 SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | //设置突发类型:连续 SDRAM_MODEREG_CAS_LATENCY_3 | //设置CL值:3 SDRAM_MODEREG_OPERATING_MODE_STANDARD | //设置操作模式:标准 SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; //设置突发写模式:单点访问 SDRAM_SendCommand(FMC_SDRAM_CMD_LOAD_MODE, 1, 1, temp); /* 6. 设置自刷新频率 */ /* SDRAM refresh period / Number of rows)*SDRAM时钟速度 – 20 = 64000(64 ms) / 2^13 *84MHz - 20 */ HAL_SDRAM_ProgramRefreshRate(&hsdram1, 636); } //uint16_t testsdram[250000] __attribute__((at(0XC0000000))); /* 测试用数组 */ //SDRAM内存测试 void fsmc_sdram_test(void) { __IO uint32_t i=0; __IO uint32_t temp=0; __IO uint32_t sval=0;//在地址0读到的数据 //每隔16K字节,写入一个数据,总共写入2048个数据,刚好是32M字节 for(i=0; i<EXT_SDRAM_SIZE; i+=SDRAM_TEST_SIZE) { HAL_SDRAM_Write_32b(&hsdram1, (uint32_t *)(EXT_SDRAM_ADDR+i), (uint32_t *)&temp, 1); // *(__IO uint32_t *)(EXT_SDRAM_ADDR+i) = temp; temp++; } printf("write over temp:%d \r\n", temp); //依次读出之前写入的数据,进行校验 for(i=0; i<EXT_SDRAM_SIZE; i+=SDRAM_TEST_SIZE) { HAL_SDRAM_Read_32b(&hsdram1, (uint32_t *)(EXT_SDRAM_ADDR+i), (uint32_t *)&temp, 1); printf("[%d] addr:%04x temp:%d \r\n",i/(SDRAM_TEST_SIZE) ,EXT_SDRAM_ADDR+i, temp); } }

注:

绘制PCB,sdram的布线需要考虑等长阻抗匹配,随便连接的导线可能导致数据传输错乱。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 20:50:54

SC02E 超低待机电压+低功耗触摸芯片,让触摸设计更简单

在智能家电飞速发展的今天&#xff0c;“节能化”与“小型化”已成为行业不可逆转的两大趋势。作为连接用户与产品的关键交互入口&#xff0c;触控芯片的选择直接决定了产品的用户体验上限与BOM成本底线。面对这一市场需求&#xff0c;厦门晶尊微电子科技有限公司重磅推出了专为…

作者头像 李华
网站建设 2026/4/29 20:42:24

uni-app项目实战:用HBuilderX 3.8.3 + MuMu模拟器调试Leaflet天地图组件

uni-app实战&#xff1a;HBuilderX 3.8.3与MuMu模拟器高效调试Leaflet天地图组件 最近在开发一个需要集成天地图的项目时&#xff0c;发现uni-app官方地图组件对天地图的支持并不友好。经过一番折腾&#xff0c;终于摸索出一套在HBuilderX 3.8.3环境下&#xff0c;配合MuMu模拟…

作者头像 李华
网站建设 2026/4/29 20:41:21

从程序员到架构师:大编程范式全解析与实践对比

插件化架构 v3 版本最大的变化是引入了模块化插件系统。此前版本中集成在核心包里的原生功能&#xff0c;现在被拆分成独立的插件。 每个插件都是一个独立的 Composer 包&#xff0c;包含 Swift 和 Kotlin 代码、权限清单以及原生依赖。开发者只需安装实际用到的插件&#xff0…

作者头像 李华
网站建设 2026/4/29 20:40:25

每周技术面试高频题汇总:从算法原理到系统设计实战

大家好&#xff0c;又到了每周的面试复盘时间。过去一周&#xff0c;CSDN、掘金以及各大技术社区里&#xff0c;关于面试题的讨论热度居高不下。尤其是随着“金三银四”招聘季的余温尚在&#xff0c;很多大厂和独角兽企业的面试流程正在密集进行。 我仔细梳理了社区中热议的 1…

作者头像 李华
网站建设 2026/4/29 20:39:22

内网穿透方案:Fish-Speech 1.5在企业防火墙后的部署

内网穿透方案&#xff1a;Fish-Speech 1.5在企业防火墙后的部署 1. 引言 在企业内部部署AI服务时&#xff0c;经常会遇到一个实际问题&#xff1a;Fish-Speech 1.5 TTS服务部署在内网服务器上&#xff0c;但外部用户或分支机构需要访问。由于企业防火墙的安全策略&#xff0c…

作者头像 李华
网站建设 2026/4/29 20:38:41

LFM2-2.6B-GGUF实操手册:日志实时查看+err.log错误定位技巧

LFM2-2.6B-GGUF实操手册&#xff1a;日志实时查看err.log错误定位技巧 1. 项目概述 LFM2-2.6B-GGUF是由Liquid AI公司开发的轻量级大语言模型&#xff0c;采用GGUF量化格式&#xff0c;特别适合资源有限的本地部署场景。这个2.6B参数的模型经过量化后体积大幅缩小&#xff0c…

作者头像 李华