Cubemx配置原子sdram
看了下原子哥的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相关推荐
- 【SDRAM】STM32外扩SDRAM学习总结 + CubeMX配置教程
目录 一.SDRAM概述 二.CubeMX配置 三.程序配置 一.SDRAM概述 (内容参考正点原子 + 个人经验总结) STM32H743自带1M左右的RAM,虽然已经很大了,但总有不够的时候.RA ...
- STM32 利用cubemx配置正点原子4.3寸TFT-LCD 驱动芯片NT35510
主控芯片是STM32F103ZET6 利用CUBEMX配置可以省去初始化函数中的初始化GPIO.FSMC和时钟等步骤 原理图 4.3寸的也是通用的 # CUBEMX配置 特别注意,除了配置这些外,还要 ...
- cubemx配置正点原子lcd屏-完整版
在学习正点原子战舰板时,发现HAL库教程并未使用cubemx,因此自己整理了cubemx配置正点原子所有教程,真的是有手就行. LCD的工作原理下文就不讲了,可以参考正点原子教程,下面都是实操. 正点 ...
- c语言定时器定时1ms程序,STM32 Cubemx 配置定时器定时1mS
最近才发现原来我把定时器里的配置参数代表的意义给搞混了,这里记录一下,防止以后自己忘记. 以建立一个定时1mS定时器为例: 1.先打开定时器 2.配置好时钟 3.配置定时器设置 重点来了,以前在这里我 ...
- 基于stm32c8t6的两轮平衡小车 第二篇——原理图及CubeMx配置
目录 1.原理图 2.CubeMx配置 (1)创建工程 (2)配置时钟树 (3)仿真模式选择 (4)TIM2配置为PWM输出模式 (5)定时器TIM3,TIM4设置为编码器模式 (6)蓝牙串口配置 ( ...
- STM32 HAL库 CUBEMX配置 ADC采集
文章目录 STM32 HAL库 CUBEMX配置 ADC采集 软硬件型号 1.单通道不定时任意时刻采集信号 CUBEMX配置 代码添加 2.单通道ADC采集+DMA传输 CUBEMX添加配置 代码添加 ...
- CubeMX配置串口的程序烧入板子不跑的解决方法
对于cubeMX配置串口,keil5编译通过的,自己确定无问题的程序,以ISP烧入,烧入板子后无法运行的情况,我暂时的解决策略是按住reset键点击"开始编程",点击后松开rese ...
- STM32开发(14)----CubeMX配置ADC
CubeMX配置ADC 前言 一.什么是ADC? 二.实验过程 1.单通道ADC采集 STM32CubeMX配置 代码实现 2.多通道ADC采样(非DMA) STM32CubeMX配置 代码实现 3. ...
- 【CubeMX配置STM32的ADC】
CubeMX配置STM32的ADC 包含阻塞式和非阻塞式以及多通道ADC 一.CubeMX配置STM32 1.单通道ADC 单通道的配置比较简单,需要注意的是需要中断的使能,因为在使用非阻塞式的函数时 ...
最新文章
- python string 转bytes 以及bytes 转string
- ionic react-native和native开发移动app到底那个好
- sql having是什么意思_sql之汇总查询
- 今日arXiv精选 | 13 篇 ICCV 2021 最新论文
- 操作系统之进程管理:4、线程与多线程
- ubuntu 网络设置mark
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
- webapp检测手机运动方向,可实现手机摇一摇功能的触发
- 关于嵌入式系统的启动
- 首次用MFC制作界面,小白采坑记录
- jvm垃圾回收机制(GC)
- 鼠标移入显示图片案例
- 读书笔记:《明朝那些事第三部:妖孽宫廷》
- mac 打开网页慢_Safari打开网页卡住或加载极慢问题解决方案
- Android Volley 之自定义Request
- (附链接)12个画出漂亮神经网络图的工具
- win7无法打开无线网络服务器,笔记本win7系统无线网络连接受限制或无连接的解决方法...
- 20172328 蓝墨云实验——三种查找算法练习
- 数据库 流量切分_一种基于flex的可视化多层流量切分界面的实现
- 利用jQuery来动态为属性添加或者删除属性