OpenEdv-开源电子网

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

STM32旗舰版 外部内存问题

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-6-13
在线时间
0 小时
发表于 2014-6-13 21:50:54 | 显示全部楼层 |阅读模式
5金钱
对于IS62WV51216 内存采用FSMC16位,那么为什么例程中采用的是
void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
{
  u32 i;
  for(i=0;i<n;i++)
   {
*pBuffer=*(vu8*)(ReadAddr+Bank1_SRAM3_ADDR);
ReadAddr+=2;
pBuffer++;
   }
}
而不采用
void FSMC_SRAM_WriteBuffer16(u16* pBuffer,u32 WriteAddr,u32 n)
{
*(vu16*)(WriteAddr+Bank1_SRAM3_ADDR)=*pBuffer;
WriteAddr+=2; //FSMC 数据操作16位 加 2  数据操作操作8位加 1  而内存IS62 是16位的
pBuffer++;
}

采用上面这个函数不是相对于1MB的内存空间 只能使用512KB嘛 不是相对浪费了啊?

最佳答案

查看完整内容[请看2#楼]

库函数代码的bug 请参考寄存器版本的代码.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-13 21:50:55 | 显示全部楼层
库函数代码的bug
请参考寄存器版本的代码.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-13 21:50:55 | 显示全部楼层
回复【6楼】nilianghua2008:
---------------------------------
你可以这么理解,实际上,FSMC是通过UB,LB来控制高低字节的方式,来实现u8类型的1M地址范围访问的.
也就是每个16位地址,通过UB,LB控制,可以看成2个u8地址.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-6-13
在线时间
0 小时
 楼主| 发表于 2014-6-15 08:22:10 | 显示全部楼层
回复【2楼】正点原子:
谢谢 原子哥
---------------------------------
那为什么 LCD屏采用的也是FSMC16位方式 ,对命令写入是8位而对数据写入可以是16位
然而大家都用的是库函数啊
//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号
LCD->LCD_RAM = LCD_RegValue;//写入数据     
}
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-6-13
在线时间
0 小时
 楼主| 发表于 2014-6-15 09:17:49 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
还有一个问题  这个测试程序 

//外部内存测试(最大支持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);//显示内存容量  
  }  
用了1M字节的地址   但是按照FSMC的地址线从A0到A18那么只有512KB 的地址范围
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-15 10:16:54 | 显示全部楼层
回复【3楼】nilianghua2008:
---------------------------------
8位命令的时候,高8位无效.LCD控制器自动忽略. 你写0X33和0X0033,其实是一个意思.

回复【4楼】nilianghua2008:
---------------------------------
一个地址2个字节,512K*2是多少?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-6-13
在线时间
0 小时
 楼主| 发表于 2014-6-15 14:40:37 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
谢谢  地址范围是0~512KB ,如果是16位的操作那么是 1MB,但是我们FSMC都是8为操作的,所以地址是0~1  MB  才对啊
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-6-13
在线时间
0 小时
 楼主| 发表于 2014-6-17 18:38:57 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
明白了,谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 05:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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