本帖最后由 tanleitanlei 于 2022-4-7 19:46 编辑
简介
SDRAM 也就是同步动态随机存取内存,在计算机中得到了广泛的应用。在单片机应用中SRAM 和SDRAM 都用于扩展MCU 内存,通常SDRAM 用于大容量扩展,SRAM 用于小容量扩展。相比于SRAM,SDRAM 最大的不同是访问时有命令机制,而SRAM 可以直接访问,以及SDRAM需要在一定时间内刷新充电才能保存数据,否则数据将会消失,而SRAM 不需要刷新也能保存数据。SDRAM 在读取和写入时需要先发送命令例如:预充电命令、读命令、写命令等,具体的请参考SDRAM 芯片的数据手册。
表1. SDRAM 和SRAM 特点对比
SUFR 板载了一颗SDRAM 芯片,型号为W9825G6KH-6,容量为32M 字节,数据宽度为16 位,通过XMC 接口和MCU 连接。在288M 主频下,SDRAM 时钟为288 / 3= 96MHz。
资源准备
硬件环境:
对应产品型号的AT-SURF-F437 Board
软件环境:
AT32F435_437_Firmware_Library_V2.x.x\project\at_sufr_f437\examples\sdram
硬件设计
表2. 硬件资源使用
编号 | PIN Name | 外设功能 | 备注 | 1 | PD14 | XMC_D10 | | 2 | PD15 | XMC_D11 | | 3 | PD0 | XMC_D12 | | 4 | PD1 | XMC_D13 | | 5 | PE7 | XMC_D14 | | 6 | PE8 | XMC_D15 | | 7 | PE9 | XMC_A0 | | 8 | PE10 | XMC_A1 | | 9 | PE11 | XMC_A2 | | 10 | PE12 | XMC_A3 | | 11 | PE13 | XMC_A4 | | 12 | PE14 | XMC_A5 | | 13 | PE15 | XMC_A6 | | 14 | PD8 | XMC_A7 | | 15 | PD9 | XMC_A8 | | 16 | PD10 | XMC_A9 | | 17 | PF0 | XMC_A10 | | 18 | PF1 | XMC_A11 | | 19 | PF2 | XMC_A12 | |
20 | PF3 | XMC_A3 |
| 编号 | PIN Name | 外设功能 | 备注 | 21 | PF4 | XMC_A4 | | 22 | PF5 | XMC_A5 | | 23 | PF12 | XMC_A6 | | 24 | PF13 | XMC_A7 | | 25 | PF14 | XMC_A8 | | 26 | PF15 | XMC_A9 | | 27 | PG0 | XMC_A10 | | 28 | PG1 | XMC_A11 | | 29 | PG2 | XMC_A12 | | 30 | PC3 | XMC_SDCKE0 | | 31 | PG8 | XMC_SDCLK | | 32 | PC2 | XMC_SDNE0 | | 33 | PC0 | XMC_SDNWE | | 34 | PG15 | XMC_SDNCAS | | 35 | PF11 | XMC_SDNRAS | | 36 | PG4 | XMC_SDBA0 | | 37 | PG5 | XMC_SDBA1 | | 38 | PE0 | XMC_NBL0 |
|
对应的电路原理如下:
软件设计
1) SDRAM 测试
初始化TFT LCD
初始化SDRAM
写数据到SDRAM
从SDRAM 读数据
将信息显示在LCD 屏上
2) 代码介绍
main 函数代码描述
int main(void)
{
uint16_t i;
/* 初始化系统时钟 */
system_clock_config();
/* 初始化中断优先级分组 */
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
/* 初始化延时函数 */
delay_init();
/* 初始化LCD */
lcd_init(LCD_DISPLAY_VERTICAL);
/* initialize sdram */
sdram_init();
/* 显示信息 */
lcd_string_show(10, 20, 200, 24, 24, (uint8_t *)"SDRAM Test");
/* 初始化数据 */
for(i = 0; i < BUF_SIZE; i++)
{
write_buf = i;
}
/* 写数据到 SDRAM */
sdram_data_write(0, write_buf, BUF_SIZE);
/* 从SDRAM 读取数据 */
sdram_data_read(0, read_buf, BUF_SIZE);
/* 对比读出和写入的数据 */
if(buffer_compare((uint8_t *)write_buf, (uint8_t *)read_buf, BUF_SIZE * 2) == 0)
{
lcd_string_show(10, 60, 310, 24, 24, (uint8_t *)"sdram write/read ok");
}
else
{
lcd_string_show(10, 60, 310, 24, 24, (uint8_t *)"sdram write/read ok");
}
while(1)
{
}
}
下载验证
写数据到SDRAM
从SDRAM 读数据
对比读取和写入的数据是否相等,将信息显示在LCD 屏上
|