OpenEdv-开源电子网

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

sram

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-7-26
在线时间
0 小时
发表于 2013-7-26 10:11:16 | 显示全部楼层 |阅读模式
我是新手,想问一下sram例程里的FSMC_SRAM_WriteBuffer()程序里WriteAddr+=2,这是为什么,不都是8位,为什么加2呢?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-26 10:16:10 | 显示全部楼层
//在指定地址(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++;
}   
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-7-26
在线时间
0 小时
 楼主| 发表于 2013-7-26 10:21:11 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
是加1,不是加2呗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-26 10:55:19 | 显示全部楼层
回复【3楼】xiaoyuwxy:
---------------------------------
看你的代码,如果是(vu16),那就是加2
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-7-26
在线时间
0 小时
 楼主| 发表于 2013-7-26 11:24:22 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
多谢原子哥
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-7-26
在线时间
0 小时
 楼主| 发表于 2013-7-26 13:40:48 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我写sram,怎么知道写进去没。是不是只能靠液晶显示啊?
回复 支持 反对

使用道具 举报

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
发表于 2013-7-26 14:37:17 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,我也碰到了这个疑惑,在你的《STM32开发指南-库函数版本V1.2》中,“第四十二章 外部SRAM实验”中,写着这样的代码:
 //在指定地址开始,连续写入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+=2;//这里需要加2,是因为STM32的FSMC 
//地址右移一位对齐.加2相当于加1. 
    pBuffer++; 
  }      
}                                           
//在指定地址开始,连续读出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+=2;//这里需要加2,是因为STM32的FSMC地 
//址右移一位对齐.加2相当于加1. 
  }    
}  

请问是写错了吗?
回复 支持 反对

使用道具 举报

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
发表于 2013-7-26 14:39:18 | 显示全部楼层
 


回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-7-26
在线时间
0 小时
 楼主| 发表于 2013-7-26 15:06:16 | 显示全部楼层
回复【8楼】hexiaolong2008:
---------------------------------
应该加1,u16的话是加2
回复 支持 反对

使用道具 举报

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
发表于 2013-7-26 15:14:06 | 显示全部楼层
回复【9楼】xiaoyuwxy:
---------------------------------
你有试过把代码修改成加1然后下载到板子上看现象吗?
我觉得这块虽然代码上是有点让人误解,但是有可能实际开发板上是能正确运行的,因为之前有人曾提过战舰的原理图SRAM接线画的有问题,当时原子哥的回答是战舰的原理图SRAM的封装是按照25616画的,而实际战舰用的SRAM是51216,然而这两个型号的芯片管脚是不一样的,实际上原子的战舰板SRAM接线可能就像代码里说的,将FSMC的地址总线向右移了一位,然后接到了SRAM的A0上,所以代码里要加2。
我只是刚刚在坛子里搜了一些关于SRAM的问题,目前还没有进行实际验证,不好说。。。。。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-7-26
在线时间
0 小时
 楼主| 发表于 2013-7-26 15:21:05 | 显示全部楼层
回复【10楼】hexiaolong2008:
---------------------------------
没有,要是有答案通知我一下
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-26 16:12:59 | 显示全部楼层
你看的库函数版本吧?
寄存器版本代码是:
//在指定地址(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++;
}   
}
实际上仿真结果也是正确的:


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

使用道具 举报

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
发表于 2013-7-26 17:31:01 | 显示全部楼层
多谢原子哥回复【12楼】正点原子:
---------------------------------
多谢原子哥回复!
事实证明,库函数版本的代码是有误的,不应该加2。
本人代码实测,测试代码如下:
u8 testsram[4] __attribute__((at(0X68000000)));//测试用数组

int main(void)
{  
u8 rbuf[4] = {0};
char str[50];

delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);   //串口初始化为9600
LCD_Init();
   FSMC_SRAM_Init(); //初始化外部SRAM  
  POINT_COLOR=BLUE;//设置字体为蓝色  

testsram[0] = 0x00;
testsram[1] = 0x01;
testsram[2] = 0x02;
testsram[3] = 0x03;
 
FSMC_SRAM_ReadBuffer(rbuf, 0, 4);

sprintf(str, "byte0:%02x", rbuf[0]); 
LCD_ShowString(60,100,300,16,16,str);
sprintf(str, "byte1:%02x", rbuf[1]); 
LCD_ShowString(60,120,300,16,16,str);
sprintf(str, "byte2:%02x", rbuf[2]); 
LCD_ShowString(60,140,300,16,16,str);
sprintf(str, "byte3:%02x", rbuf[3]); 
LCD_ShowString(60,160,300,16,16,str);

   while(1);
}

当把FSMC_SRAM_ReadBuffer中的ReadAddr改成加1时,程序运行结果正确;当改成加2时,程序运行结果错误!
看来原子哥要在PDF勘误表中添上这一笔了。。。。。
回复 支持 反对

使用道具 举报

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
发表于 2013-7-26 17:32:45 | 显示全部楼层
测试文件如下:

main.c

1.08 KB, 下载次数: 459

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-26 18:18:06 | 显示全部楼层
嗯,谢谢指出
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-7-1
在线时间
28 小时
发表于 2014-9-9 17:32:52 | 显示全部楼层
回复【4楼】正点原子:
--------------------------------
原子哥,你的液晶屏的地址线A10与SRAM的地址线A10是接在一起的,会不会冲突啊?我两个同时用的时候
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-9 21:18:41 | 显示全部楼层
回复【16楼】zengan007:
---------------------------------
分时复用,不会冲突
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-10-4
在线时间
2 小时
发表于 2014-10-4 17:06:12 | 显示全部楼层
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)  
{     
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;   
WriteAddr++;
pBuffer++;
}   
}
16位的SRAM  每次强制以8为写入 那fscm的高低节怎么运作的
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-10-4
在线时间
2 小时
发表于 2014-10-4 17:07:21 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)  
{     
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;   
WriteAddr++;
pBuffer++;
}   
}
16位的SRAM  每次强制以8为写入 那fscm的高低节怎么运作的
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-4 23:08:14 | 显示全部楼层
回复【19楼】veale:
---------------------------------
UB,LB自动控制。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 15:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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