看了下原子哥的HAL SDRAM教程, 发现没有cubemx的好用,于是想搞一下cubemx生成SDRAM读写demo

1 原理图

这个芯片算相当便宜了, 32MB大小5元钱,  比SRAM价格不知道低到哪里去了.

2 cubemx配置如图

如果遇到高刷新率,一定要把SDRAM突发传输打开

另外原子里面配置是是2, cubemx里面配置是4,  所以如果需要快速读取还是按照原子的时序2来

注意时序要配对

仅仅这样是不够的,还需要配置PE0 PE1

3 工程配置

在fmc.c中加入下图代码,目的是为了初始化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)//在指定地址(WriteAddr+Bank5_SDRAM_ADDR)开始,连续写入n个字节.
//pBuffer:字节指针
//WriteAddr:要写入的地址
//n:要写入的字节数
void FMC_SDRAM_WriteBuffer(uint8_t *pBuffer,uint32_t WriteAddr,uint32_t n)
{for(;n!=0;n--){*(__IO uint8_t*)(Bank5_SDRAM_ADDR+WriteAddr)=*pBuffer;WriteAddr++;pBuffer++;}
}//在指定地址((WriteAddr+Bank5_SDRAM_ADDR))开始,连续读出n个字节.
//pBuffer:字节指针
//ReadAddr:要读出的起始地址
//n:要写入的字节数
void FMC_SDRAM_ReadBuffer(uint8_t *pBuffer,uint32_t ReadAddr,uint32_t n)
{for(;n!=0;n--){*pBuffer++=*(__IO uint8_t*)(Bank5_SDRAM_ADDR+ReadAddr);ReadAddr++;}
}void MX_SDRAM_InitEx(void)
{__IO uint32_t tmpmrd = 0;FMC_SDRAM_CommandTypeDef Command;/* Step 1: Configure a clock configuration enable command */Command.CommandMode            = FMC_SDRAM_CMD_CLK_ENABLE;Command.CommandTarget          =  FMC_SDRAM_CMD_TARGET_BANK1;Command.AutoRefreshNumber      = 1;Command.ModeRegisterDefinition = 0;/* Send the command */HAL_SDRAM_SendCommand(&hsdram1, &Command,0X1000);/* Step 2: Insert 100 us minimum delay */ /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */HAL_Delay(1);/* Step 3: Configure a PALL (precharge all) command */ Command.CommandMode            = FMC_SDRAM_CMD_PALL;Command.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK1;Command.AutoRefreshNumber      = 1;Command.ModeRegisterDefinition = 0;/* Send the command */HAL_SDRAM_SendCommand(&hsdram1, &Command, 0X1000);  /* Step 4: Configure an Auto Refresh command */ Command.CommandMode            = FMC_SDRAM_CMD_AUTOREFRESH_MODE;Command.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK1;Command.AutoRefreshNumber      = 8;Command.ModeRegisterDefinition = 0;/* Send the command */HAL_SDRAM_SendCommand(&hsdram1, &Command, 0X1000);/* Step 5: Program the external memory mode register */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;/* Send the command */HAL_SDRAM_SendCommand(&hsdram1, &Command, 0X1000);/* Step 6: Set the refresh rate counter *//* Set the device refresh rate */HAL_SDRAM_ProgramRefreshRate(&hsdram1, 683);
}

fmc.h中加入下图代码

/* USER CODE BEGIN Prototypes */
void MX_SDRAM_InitEx(void);
void FMC_SDRAM_WriteBuffer(uint8_t *pBuffer,uint32_t WriteAddr,uint32_t n);
void FMC_SDRAM_ReadBuffer(uint8_t *pBuffer,uint32_t ReadAddr,uint32_t n);
/* USER CODE END Prototypes */

4 主函数调用

在main.c的主函数中加入SDRAM初始化

void main()
{
// 前面一堆初始化
xx();/* USER CODE BEGIN 2 */// 初始化代码放这里MX_SDRAM_InitEx();/* USER CODE END 2 */

5 测试

void fsmc_sdram_test(uint16_t x,uint16_t y)
{  uint32_t i=0;     uint32_t temp=0;    uint32_t sval=0;    //在地址0读到的数据                    //每隔16K字节,写入一个数据,总共写入2048个数据,刚好是32M字节printf("SDRAM begin\r\n");for(i=0;i<32*1024*1024;i+=16*1024){*(__IO uint32_t*)(Bank5_SDRAM_ADDR+i)=temp; temp++;}//依次读出之前写入的数据,进行校验       for(i=0;i<32*1024*1024;i+=16*1024) {    temp=*(__IO uint32_t*)(Bank5_SDRAM_ADDR+i);if(i==0)sval=temp;else if(temp<=sval)break;//后面读出的数据一定要比第一次读到的数据大.             printf("SDRAM Capacity:%dKB\r\n",(uint16_t)(temp-sval+1)*16);//打印SDRAM容量}
}   

6 运行结果

7 附加说明

如果在调试SDRAM中,没配置对,有时候会出现不能烧录问题,这个时候把复位键按住,在松开按键瞬间点击下载就可以了

代码地址:

git:https://github.com/KiritoGoLeon/stm32-HAL-learn/tree/master/stm32_f429_sdram

csdn: https://download.csdn.net/download/a2267542848/13614430

Cubemx配置原子sdram相关推荐

  1. 【SDRAM】STM32外扩SDRAM学习总结 + CubeMX配置教程

    目录 一.SDRAM概述 二.CubeMX配置 三.程序配置 一.SDRAM概述 (内容参考正点原子 + 个人经验总结) STM32H743自带1M左右的RAM,虽然已经很大了,但总有不够的时候.RA ...

  2. STM32 利用cubemx配置正点原子4.3寸TFT-LCD 驱动芯片NT35510

    主控芯片是STM32F103ZET6 利用CUBEMX配置可以省去初始化函数中的初始化GPIO.FSMC和时钟等步骤 原理图 4.3寸的也是通用的 # CUBEMX配置 特别注意,除了配置这些外,还要 ...

  3. cubemx配置正点原子lcd屏-完整版

    在学习正点原子战舰板时,发现HAL库教程并未使用cubemx,因此自己整理了cubemx配置正点原子所有教程,真的是有手就行. LCD的工作原理下文就不讲了,可以参考正点原子教程,下面都是实操. 正点 ...

  4. c语言定时器定时1ms程序,STM32 Cubemx 配置定时器定时1mS

    最近才发现原来我把定时器里的配置参数代表的意义给搞混了,这里记录一下,防止以后自己忘记. 以建立一个定时1mS定时器为例: 1.先打开定时器 2.配置好时钟 3.配置定时器设置 重点来了,以前在这里我 ...

  5. 基于stm32c8t6的两轮平衡小车 第二篇——原理图及CubeMx配置

    目录 1.原理图 2.CubeMx配置 (1)创建工程 (2)配置时钟树 (3)仿真模式选择 (4)TIM2配置为PWM输出模式 (5)定时器TIM3,TIM4设置为编码器模式 (6)蓝牙串口配置 ( ...

  6. STM32 HAL库 CUBEMX配置 ADC采集

    文章目录 STM32 HAL库 CUBEMX配置 ADC采集 软硬件型号 1.单通道不定时任意时刻采集信号 CUBEMX配置 代码添加 2.单通道ADC采集+DMA传输 CUBEMX添加配置 代码添加 ...

  7. CubeMX配置串口的程序烧入板子不跑的解决方法

    对于cubeMX配置串口,keil5编译通过的,自己确定无问题的程序,以ISP烧入,烧入板子后无法运行的情况,我暂时的解决策略是按住reset键点击"开始编程",点击后松开rese ...

  8. STM32开发(14)----CubeMX配置ADC

    CubeMX配置ADC 前言 一.什么是ADC? 二.实验过程 1.单通道ADC采集 STM32CubeMX配置 代码实现 2.多通道ADC采样(非DMA) STM32CubeMX配置 代码实现 3. ...

  9. 【CubeMX配置STM32的ADC】

    CubeMX配置STM32的ADC 包含阻塞式和非阻塞式以及多通道ADC 一.CubeMX配置STM32 1.单通道ADC 单通道的配置比较简单,需要注意的是需要中断的使能,因为在使用非阻塞式的函数时 ...

最新文章

  1. python string 转bytes 以及bytes 转string
  2. ionic react-native和native开发移动app到底那个好
  3. sql having是什么意思_sql之汇总查询
  4. 今日arXiv精选 | 13 篇 ICCV 2021 最新论文
  5. 操作系统之进程管理:4、线程与多线程
  6. ubuntu 网络设置mark
  7. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
  8. webapp检测手机运动方向,可实现手机摇一摇功能的触发
  9. 关于嵌入式系统的启动
  10. 首次用MFC制作界面,小白采坑记录
  11. jvm垃圾回收机制(GC)
  12. 鼠标移入显示图片案例
  13. 读书笔记:《明朝那些事第三部:妖孽宫廷》
  14. mac 打开网页慢_Safari打开网页卡住或加载极慢问题解决方案
  15. Android Volley 之自定义Request
  16. (附链接)12个画出漂亮神经网络图的工具
  17. win7无法打开无线网络服务器,笔记本win7系统无线网络连接受限制或无连接的解决方法...
  18. 20172328 蓝墨云实验——三种查找算法练习
  19. 数据库 流量切分_一种基于flex的可视化多层流量切分界面的实现
  20. 利用jQuery来动态为属性添加或者删除属性

热门文章

  1. python信号_python 之信号Signal
  2. R语言数据的读取与导出
  3. 打开github网站排版错误解决办法
  4. java dao与dto_DAO与DTO名词解释
  5. En-Tan-Mo隆重亮相Staking 生态大会
  6. 关于360DOC(个人图书馆)不能复制的解决办法_bin910729_新浪博客
  7. sequel ace 无法格式化sql(使用ruby替代php脚本解决问题)
  8. 圆的FFT分析的算法
  9. H.264视频压缩标准拓展视频监控的潜力
  10. Ae 表达式语言引用​:Path Property