OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 23843|回复: 21

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第四十二章 外部SRAM实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-4-2 22:57:46 | 显示全部楼层 |阅读模式

第四十二章 外部SRAM实验

       STM32F103ZET6自带了64K字节的SRAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合,STM32自带的这些内存就不够用了。比如跑算法或者跑GUI等,就可能不太够用,所以战舰STM32开发板板载了一颗1M字节容量的SRAM芯片:IS62WV51216,满足大内存使用的需求。

本章,我们将使用STM32来驱动IS62WV51216,实现对IS62WV51216的访问控制,并测试其容量。本章分为如下几个部分:

42.1 IS62WV51216简介

42.2 硬件设计

42.3 软件设计

42.4 下载验证

42.1 IS62WV51216简介

IS62WV51216ISSIIntegrated Silicon Solution, Inc)公司生产的一颗16位宽512K512*16,即1M字节)容量的CMOS静态内存芯片。该芯片具有如下几个特点:

l  高速。具有45ns/55ns访问速度。

l  低功耗。

l  TTL电平兼容。

l  全静态操作。不需要刷新和时钟电路。

l  三态输出。

l  字节控制功能。支持高/低字节控制。

IS62WV51216的功能框图如图42.1.1所示:


42.1.1 IS62WV51216功能框图

       图中A0~18为地址线,总共19根地址线(即2^19=512K1K=1024);IO0~15为数据线,总共16根数据线。CS2CS1都是片选信号,不过CS2是高电平有效CS1是低电平有效;OE是输出使能信号(读信号);WE为写使能信号;UBLB分别是高字节控制和低字节控制信号;

战舰STM32开发板使用的是TSOP44封装的IS62WV51216芯片,该芯片直接接在STM32FSMC上,IS62WV51216原理图如图42.1.2所示:


42.1.2 IS62WV51216原理图

       从原理图可以看出,IS62WV51216STM32的连接关系:

            A[0:18]FMSC_A[0:18]

            D[0:15]FSMC_D[0:15]

UBFSMC_NBL1

LBFSMC_NBL0

OEFSMC_OE

WEFSMC_WE

CSFSMC_NE3

本章,我们使用FSMCBANK1 区域3来控制IS62WV51216,关于FSMC的详细介绍,我们在第十八章已经介绍过,在第十八章,我们采用的是读写不同的时序来操作TFTLCD模块(因为TFTLCD模块读的速度比写的速度慢很多),但是在本章,因为IS62WV51216的读写时间基本一致,所以,我们设置读写相同的时序来访问FSMC。关于FSMC的详细介绍,请大家看第十八章和《STM32参考手册》。

IS62WV51216就介绍到这,最后,我们来看看实现IS62WV51216的访问,需要对FSMC进行哪些配置。步骤如下:

1)使能FSMC时钟,并配置FSMC相关的IO及其时钟使能。

    要使用FSMC,当然首先得开启其时钟。然后需要把FSMC_D0~15FSMCA0~18等相关IO口,全部配置为复用输出,并使能各IO组的时钟。

2)设置FSMC BANK1 区域3的相关寄存器。

此部分包括设置区域3的存储器的工作模式、位宽和读写时序等。本章我们使用模式A16位宽,读写共用一个时序寄存器。

3)使能BANK1区域3

最后,只需要通过FSMC_BCR寄存器使能BANK1,区域3即可。

通过以上几个步骤,我们就完成了FSMC的配置,可以访问IS62WV51216了,这里还需要注意,因为我们使用的是BANK1的区域3,所以HADDR[27:26]=10,故外部内存的首地址为0X68000000      

42.2 硬件设计

本章实验功能简介:开机后,显示提示信息,然后按下KEY1按键,即测试外部SRAM容量大小并显示在LCD上。按下WK_UP按键,即显示预存在外部SRAM的数据。DS0指示程序运行状态。

本实验用到的硬件资源有:

1)  指示灯DS0

2)  KEY1WK_UP按键

3)  串口

4)  TFTLCD模块

5)  IS62WV51216

这些我们都已经介绍过(IS62WV51216STM32的各IO对应关系,请参考光盘原理图),接下来我们开始软件设计。

42.3 软件设计

打开上一章的工程,首先在HARDWARE文件夹下新建一个SRAM的文件夹。然后新建sram.csram. h两个文件,将他们保存在SRAM文件夹下,并将这个文件夹加入头文件包含路径。

       打开sram.c文件,输入如下代码:

#include "sram.h"    

#include "usart.h"

//使用NOR/SRAM Bank1.sector3,地址位HADDR[27,26]=10

//IS61LV25616/IS62WV25616,地址线范围为A0~A17

//IS61LV51216/IS62WV51216,地址线范围为A0~A18

#define Bank1_SRAM3_ADDR    ((u32)(0x68000000)) 

//初始化外部SRAM

void FSMC_SRAM_Init(void)

{                                          

       RCC->AHBENR|=1<<8;       //使能FSMC时钟  

       RCC->APB2ENR|=1<<5;        //使能PORTD时钟

       RCC->APB2ENR|=1<<6;        //使能PORTE时钟

      RCC->APB2ENR|=1<<7;        //使能PORTF时钟

       RCC->APB2ENR|=1<<8;        //使能PORTG时钟            

       GPIOD->CRH&=0X00000000;

       GPIOD->CRH|=0XBBBBBBBB; //PORTD复用推挽输出       

       GPIOD->CRL&=0XFF00FF00;

       GPIOD->CRL|=0X00BB00BB;               

       GPIOE->CRH&=0X00000000;

       GPIOE->CRH|=0XBBBBBBBB; //PORTE复用推挽输出  

       GPIOE->CRL&=0X0FFFFF00;

       GPIOE->CRL|=0XB00000BB;    

       GPIOF->CRH&=0X0000FFFF;

       GPIOF->CRH|=0XBBBB0000;     //PORTF复用推挽输出      

       GPIOF->CRL&=0XFF000000;

       GPIOF->CRL|=0X00BBBBBB;         

       GPIOG->CRH&=0XFFFFF0FF;

       GPIOG->CRH|=0X00000B00;     //PORTG复用推挽输出 PG10->NE3    

      GPIOG->CRL&=0XFF000000;

       GPIOG->CRL|=0X00BBBBBB; 

       //寄存器清零

       //bank1NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。

       //这里我们使用NE3 ,也就对应BTCR[4],[5]                             

       FSMC_Bank1->BTCR[4]=0X00000000;

       FSMC_Bank1->BTCR[5]=0X00000000;

       FSMC_Bank1E->BWTR[4]=0X00000000;

       //操作BCR寄存器       使用异步模式,模式A(读写共用一个时序寄存器)

       //BTCR[偶数]:BCR寄存器;BTCR[奇数]:BTR寄存器

       FSMC_Bank1->BTCR[4]|=1<<12;//存储器写使能

       FSMC_Bank1->BTCR[4]|=1<<4; //存储器数据宽度为16bit        

       //操作BTR寄存器                                                     

       FSMC_Bank1->BTCR[5]|=3<<8;

//数据保持时间(DATAST)为4HCLK 4/72M=55ns        

       FSMC_Bank1->BTCR[5]|=0<<4; //地址保持时间(ADDHLD)未用到         

       FSMC_Bank1->BTCR[5]|=0<<0; //地址建立时间(ADDSET)为1HCLK 

       //闪存写时序寄存器 

       FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;//默认值

       //使能BANK1区域3

       FSMC_Bank1->BTCR[4]|=1<<0;                                                                             

}                                                                                                  

//在指定地址(WriteAddr+Bank1_SRAM3_ADDR)开始,连续写入n个字节.

//pBuffer:字节指针

//WriteAddr:要写入的地址

//n:要写入的字节数

void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)

{

       for(;n!=0;n--) 

       {                                                                       

              *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;     

              WriteAddr++;

              pBuffer++;

       }  

}                                                                                                                                      

//在指定地址((WriteAddr+Bank1_SRAM3_ADDR))开始,连续读出n个字节.

//pBuffer:字节指针

//ReadAddr:要读出的起始地址

//n:要写入的字节数

void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)

{

       for(;n!=0;n--) 

       {                                                                              

              *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);   

              ReadAddr++;

       } 

}

       此部分代码包含3个函数,FSMC_SRAM_Init函数用于初始化,包括FSMC相关IO口的初始化以及FSMC配置。另外,FSMC_SRAM_WriteBufferFSMC_SRAM_ReadBuffer这两个函数分别用于在外部SRAM的指定地址写入和读取指定长度的数据(以字节为单位)。这里需要注意的是:FSMC当位宽为16位的时候,HADDR右移一位同地址对其,但是ReadAddr我们这里却没有加2,而是加1,是因为我们这里用的数据为宽是8位,通过UBLB来控制高低字节位,所以地址在这里是可以只加1的。另外,因为我们使用的是BANK1,区域3,所以外部SRAM的基址为:0x68000000

保存sram.c文件,并加入到HARDWARE组下,然后打开sram.h,在该文件里面输入如下代码:

#ifndef __SRAM_H

#define __SRAM_H                                                                                                           

#include <stm32f10x_map.h>                                                                              

void FSMC_SRAM_Init(void);

void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 NumHalfwordToWrite);

void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 NumHalfwordToRead);

#endif

保存此部分代码。最后,打开test.c文件,修改代码如下:

u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组

//外部内存测试(最大支持1M字节内存测试)      

void fsmc_sram_test(u16 x,u16 y)

       u32 i=0;          

       u8 temp=0;       

       u8 sval=0;      //在地址0读到的数据                                

      LCD_ShowString(x,y,239,y+16,16,"Ex Memory Test:   0KB");

       //每隔4K字节,写入一个数据,总共写入256个数据,刚好是1M字节

       for(i=0;i<1024*1024;i+=4096)

       {

              FSMC_SRAM_WriteBuffer(&temp,i,1);

              temp++;

       }

       //依次读出之前写入的数据,进行校验         

      for(i=0;i<1024*1024;i+=4096)

       {

             FSMC_SRAM_ReadBuffer(&temp,i,1);

              if(i==0)sval=temp;

             else if(temp<=sval)break;//后面读出的数据一定要比第一次读到的数据大.  

              LCD_ShowxNum(x+15*8,y,(u16)(temp-sval+1)*4,4,16,0);//显示内存容量 

      }                                

}             

int main(void)

{           

       u8 key;          

      u8 i=0;        

       u32 ts=0;

      Stm32_Clock_Init(9);           //系统时钟设置

       uart_init(72,9600);             /串口初始化为9600

       delay_init(72);                         //延时初始化

       LED_Init();                        //初始化与LED连接的硬件接口

       LCD_Init();                       //初始化LCD

       usmart_dev.init(72);             //初始化USMART       

      KEY_Init();                         //按键初始化 

      FSMC_SRAM_Init();           //初始化外部SRAM 

      POINT_COLOR=RED;         //设置字体为红色

       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   

       LCD_ShowString(60,70,200,16,16,"SRAM TEST"); 

       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

       LCD_ShowString(60,110,200,16,16,"2012/9/16"); 

       LCD_ShowString(60,130,200,16,16,"KEY1:Test Sram");

       LCD_ShowString(60,150,200,16,16,"WK_UP:TEST Data");

      POINT_COLOR=BLUE;//设置字体为蓝色 

       for(ts=0;ts<250000;ts++)testsram[ts]=ts;//预存测试数据   

      while(1)

       {    

              key=KEY_Scan(0);//不支持连按 

              if(key==KEY_DOWN)fsmc_sram_test(60,170);//测试SRAM容量

              else if(key==KEY_UP)//打印预存测试数据

              {

                     for(ts=0;ts<250000;ts++)LCD_ShowxNum(60,190,testsram[ts],6,16,0);

//显示测试数据    

              }else delay_ms(10);  

              i++;

              if(i==20)//DS0闪烁.

              {

                     i=0;

                     LED0=!LED0;

             }

       }       

}

       此部分代码除了mian函数,还有一个fsmc_sram_test函数,该函数用于测试外部SRAM的容量大小,并显示其容量。main函数则比较简单,我们就不细说了。

此段代码,我们定义了一个超大数组testsram,我们指定该数组定义在外部sram起始地址(__attribute__((at(0X68000000)))),该数组用来测试外部SRAM数据的读写。注意该数组的定义方法,是我们推荐的使用外部SRAM的方法。如果想用MDK自动分配,那么需要用到分散加载还需要添加汇编的FSMC初始化代码,相对来说比较麻烦。而且外部SRAM访问速度又远不如内部SRAM,如果将一些需要快速访问的SRAM定义到了外部SRAM,将会严重拖慢程序运行速度。而如果以我们推荐的方式来分配外部SRAM,那么就可以控制SRAM的分配,可以针对性的选择放外部还是放内部,有利于提高程序运行速度,使用起来也比较方便。

 

42.4 下载验证

在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,得到如图42.4.1所示界面:


42.4.1 程序运行效果图

此时,我们按下KEY1,就可以在LCD上看到内存测试的画面,同样,按下WK_UP,就可以看到LCD显示存放在数组testsram里面的测试数据,如图42.4.2所示:


42.4.2 外部SRAM测试界面

       该实验我们还可以借助USMART来测试,只需要在usmart_nametab里面添加读写SRAM的两个函数,就可以用USMART来测试外部SRAM了。

 

实验37 外部SRAM实验.rar

185.05 KB, 下载次数: 1597

《STM32开发指南》第四十二章 外部SRAM实验.rar

575.77 KB, 下载次数: 1529

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

432

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2012-6-21
在线时间
59 小时
发表于 2013-4-3 10:02:06 | 显示全部楼层
呵呵。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-5-28
在线时间
0 小时
发表于 2013-5-28 10:35:38 | 显示全部楼层
原子哥这个SRAM地址线并没有对应芯片管脚地址线。比如说1号管脚是A4,你这里是A0。这样没有影响么?我自己跟着你的电路图做了一下,有问题,是不是要对应芯片的管脚?多谢指点
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-5-28 16:49:57 | 显示全部楼层
回复【3楼】xuefeiying:
---------------------------------
因为地址的唯一性,所以地址线乱也是可以的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-2 22:12:39 | 显示全部楼层
原子哥,我参考你的程序用起来有点问题。我想请教几个问题:
1)引脚用复用功能了,是否要添加这一句RCC->APB2ENR|=1<<0;        
2)我用的CPU是STM32F103ZET6,外扩SRAM是EM681FV16AU-55LF,它的大小是512K*16BIT。我的SRAM.C文件跟你一样的,不一样的是主函数。
int main(void)
{
u8 temp=0XF0,temp1=0;
u32 i=0;
SystemInit(); //时钟配置为72M  
FSMC_SRAM_Init(); //FSMC控制外部SRAM的相关配置
while(1)
{
FSMC_SRAM_WriteBuffer(&temp,0,1);//到这一步会死循环
temp++;
FSMC_SRAM_WriteBuffer(&temp,2,1);
temp++;
FSMC_SRAM_WriteBuffer(&temp,4,1);
temp++;
FSMC_SRAM_ReadBuffer(&temp1,0,1);
temp++;
FSMC_SRAM_ReadBuffer(&temp1,2,1);
temp++;
FSMC_SRAM_ReadBuffer(&temp1,4,1);
temp++;
              }
}
死循环会卡死在
          HardFault_Handler\
                ROC
                EXPORT  HardFault_Handler          [WEAK]
                B    //卡死在这   .
                ENDP
我查了下说是堆栈溢出,我是在添加了倍频函数而出现这个问题的,请问如何解决呢?
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-2 22:35:04 | 显示全部楼层
回复【5楼】feilusia:
---------------------------------
刚才不小心把配置的后半段注释掉了,所以导致堆栈溢出……我现在这个程序的收发数据有问题,我写入了F0~F2至0、2、4的地址里,而读出来的时候却变成三个F7。 而如果改成 
while(1)
 {   
  FSMC_SRAM_WriteBuffer(&temp,0,1);
  FSMC_SRAM_ReadBuffer(&temp1,0,1);  
  temp++;
  FSMC_SRAM_WriteBuffer(&temp,1,1);
  FSMC_SRAM_ReadBuffer(&temp1,1,1);   
  temp++;
  FSMC_SRAM_WriteBuffer(&temp,2,1);
  FSMC_SRAM_ReadBuffer(&temp1,2,1);  
  temp++;
  FSMC_SRAM_WriteBuffer(&temp,3,1);
  FSMC_SRAM_ReadBuffer(&temp1,3,1);
}
数据则是正确的。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-8-3 10:40:00 | 显示全部楼层
回复【5楼】feilusia:
---------------------------------
1,不用.
2,你在5楼的回复是不是解决了这个问题啊?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-3 11:58:33 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我现在要想收发正常,只能一发一收一发一收……如果同时发两个再去同时收两个,数据就出错了。
比如我发0xF0到地址0,这时候收地址0可以收到0xF0;但是,我发0xF0到地址0,发0xF1到地址1,然后再去收地址0收到F7,收地址1都收到0,数据都错了。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-3 17:06:19 | 显示全部楼层
回复【8楼】feilusia:
---------------------------------
终于调好了,我用的开发板是安福莱的,它地址译码用到了A19~A22,所以在原子哥程序的基础上把PE3~PE6也设置为复用推挽输出就正常使用了。这个模块我做了6天,真辛苦。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-5-28
在线时间
0 小时
发表于 2013-8-21 16:14:18 | 显示全部楼层
原子哥我想再问下,如果我想定义两个超大数组,那么还可以用你推荐的(__attribute__((at(0X68000000))))这种格式么,我定义两个320X240的数组,一个是16bit另一个是8bit,编译时它提示空间不足,他说限制在0x6802580.我外扩的sram是25616,想请问原子哥这种该怎么定义呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-8-21 16:24:12 | 显示全部楼层
这种没法定义,你就空间不足了。

你只有30W,想买个100W的房子,你说怎么买?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-4-19
在线时间
0 小时
发表于 2013-10-26 21:57:26 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
原子哥,求救!!!!
为什么你的IS62WV51216的原理图管脚和ISSI提供的不一样???
官方文档:http://www.issi.com/WW/pdf/62WV51216ALL.pdf
我发现你的管脚和IS61LV51216是相同的
但问题是,我发现IS61和IS62的管脚封装是不一样的!
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-4-19
在线时间
0 小时
发表于 2013-10-26 21:58:10 | 显示全部楼层
回复【12楼】wangyue2725:
---------------------------------
我好疑惑,求解答。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-10-26 23:12:18 | 显示全部楼层
回复【12楼】wangyue2725:
---------------------------------
是不一样的,但是不影响使用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-3-17
在线时间
13 小时
发表于 2014-2-26 11:50:15 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥这个可以放下吧?25616容量是512K的16bit和8bit的两个320*240的数组没有512吧
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-2-26 15:25:13 | 显示全部楼层
回复【15楼】ejie+:
---------------------------------
25616=512KB.也就是512K字节.
一个320*240的8位数组是76800字节.
剩下的自己计算了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-3-17
在线时间
13 小时
发表于 2014-2-26 15:59:20 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------
一个320*240的8位数组是76800字节,一个320*240的16位数组是153600字节,两个加一块230400个字节,没有512K大吧,我是哪里理解错了?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-2-27 10:40:31 | 显示全部楼层
回复【17楼】ejie+:
---------------------------------
那就可以用撒.呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-5-4
在线时间
34 小时
发表于 2015-10-27 11:51:13 | 显示全部楼层
原子哥,我想问一下,
//外部内存测试(最大支持1M字节内存测试)      

void fsmc_sram_test(u16 x,u16 y)



       u32 i=0;          

       u8 temp=0;       

       u8 sval=0;      //在地址0读到的数据                                

      LCD_ShowString(x,y,239,y+16,16,"Ex Memory Test:   0KB");

       //每隔4K字节,写入一个数据,总共写入256个数据,刚好是1M字节

       for(i=0;i<1024*1024;i+=4096)

       {

              FSMC_SRAM_WriteBuffer(&temp,i,1);

              temp++;

       }

       //依次读出之前写入的数据,进行校验         

      for(i=0;i<1024*1024;i+=4096)

       {

             FSMC_SRAM_ReadBuffer(&temp,i,1);

              if(i==0)sval=temp;

             else if(temp<=sval)break;//后面读出的数据一定要比第一次读到的数据大.  

              LCD_ShowxNum(x+15*8,y,(u16)(temp-sval+1)*4,4,16,0);//显示内存容量 

      }                                


这个函数中,       //依次读出之前写入的数据,进行校验      FSMC_SRAM_ReadBuffer(&temp,i,1);之后没有temp++,temp不就一直等于0了吗?显示内存容量就是0啊??我哪里理解错了呢?
回复 支持 反对

使用道具 举报

22

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-5-4
在线时间
34 小时
发表于 2015-10-27 12:08:18 | 显示全部楼层
回复【18楼】正点原子:
---------------------------------
原子哥,我想问一下, 
//外部内存测试(最大支持1M字节内存测试)       

void fsmc_sram_test(u16 x,u16 y) 

{  

       u32 i=0;           

       u8 temp=0;        

       u8 sval=0;      //在地址0读到的数据                                 

      LCD_ShowString(x,y,239,y+16,16,"Ex Memory Test:   0KB"); 

       //每隔4K字节,写入一个数据,总共写入256个数据,刚好是1M字节 

       for(i=0;i<1024*1024;i+=4096) 

       { 

              FSMC_SRAM_WriteBuffer(&temp,i,1); 

              temp++; 

       } 

       //依次读出之前写入的数据,进行校验          

      for(i=0;i<1024*1024;i+=4096) 

       { 

             FSMC_SRAM_ReadBuffer(&temp,i,1); 

              if(i==0)sval=temp; 

             else if(temp<=sval)break;//后面读出的数据一定要比第一次读到的数据大.   

              LCD_ShowxNum(x+15*8,y,(u16)(temp-sval+1)*4,4,16,0);//显示内存容量  

      }                                 

}  
这个函数中,       //依次读出之前写入的数据,进行校验      FSMC_SRAM_ReadBuffer(&temp,i,1);之后没有temp++,temp不就一直等于0了吗?显示内存容量就是0啊??我哪里理解错了呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2015-11-1 23:51:41 | 显示全部楼层
回复【20楼】shblh:
---------------------------------
这不是 temp++; 么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-8-25
在线时间
13 小时
发表于 2016-9-6 18:19:35 | 显示全部楼层
正点原子 发表于 2015-11-1 23:51
回复【20楼】shblh:
---------------------------------
这不是&nbsp;temp++;&nbsp;么?

为什么我写入SRAM数据,用这个函数测试时,写进去与读出来的不一致? 比如写入时temp++到4,下面读该位置时,得到的temp值可能是13,这是怎么回事?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 19:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表