OpenEdv-开源电子网

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

关于fsmc的几点问题,求指教

[复制链接]

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-3-26 10:01:18 | 显示全部楼层 |阅读模式
5金钱
1.FSMC支持8/16/32位数据宽度,请问是8位数据宽度就用8根数据线吗?16位数据宽度就用16根数据线吗?还是不论多少宽度(8/16/32)都用16根数据线?
2.原子哥的外部SRAM实验例程用的是IS62WV51216,16位宽度的SRAM,在指定地址开始,连续写入n个字节的函数FSMC_SRAM_WriteBuffer() 为什么要讲地址转换为*(vu8*)类型?
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
    for(;n!=0;n--)  
    {                                            
        *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;      
        WriteAddr+=1;
        pBuffer++;
    }   
}  
3.IS62WV51216是16位宽度的SRAM,那么FSMC一定要用16位数据宽度吗?8位/32位的可以吗?原子哥的例程STM32用的是多少位的数据宽度?
本人小白,希望各路大神帮忙,可能问的问题很傻,别见怪  

最佳答案

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

1,8位模式下,可以只使用8位数据线. 2,因为u8是最小存储单位,更通用. 3,8位也可以.
Good good study , day day up...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-3-26 10:01:19 | 显示全部楼层
1,8位模式下,可以只使用8位数据线.
2,因为u8是最小存储单位,更通用.
3,8位也可以.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-3-26 10:01:19 | 显示全部楼层
回复【7楼】Just Beat It:
---------------------------------
你这是地址0,写0XAA
所以就是低8位有效.
高八位忽略.
具体状态,你可以用示波器看下波形.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-3-26 10:01:19 | 显示全部楼层
回复【9楼】Just Beat It:
---------------------------------
1,不对
2,也不对.
回复【10楼】Just Beat It:
---------------------------------
1,这个是可以随意选择的.
2,你这是u32的数组...我写的值是u8.只写了u32里面的1个字节,而且地址也不是你说的4096了.实际上,我在testsram[4096]这里写入的就是数字4而已.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
 楼主| 发表于 2015-3-26 10:06:05 | 显示全部楼层
这是原子哥回复别人的,有些问题,直接问了 
这里是因为SRAM用了FSMC的UB/LB信号,控制字节高地位了。
因为SRAM是16位的,当你要读写8位数据的时候,UB/LB就发挥作用了,比如在SRAM的地址0写入1个8位的字节,那么LB会输出有效,而UB则保持不变(高电平),表示写入地址0的低8位,写法就是:
*(vu8*)(Bank1_SRAM3_ADDR+0)=0Xaa;//0XAA是你想写入的字节。
而如果要在SRAM地址0写入高8位,那么对于STM32来说,地址就相应加1即可,即:
*(vu8*)(Bank1_SRAM3_ADDR+1)=0XAA;
此时LB会输出高电平,UB会输出有效电平(低电平),表示写入地址0,的高字节。
这样,对STM32来说,地址就是连续的了,0,1,2,3,4,5,都是合法的了,自然就不需要你的地址右移对齐了,硬件通过UB/LB去控制了。

比如说我在程序中写了*(vu8*)(Bank1_SRAM3_ADDR+0)=0Xaa;这句话,那么16位的数据线D[0到15]上的电平状态是什么样的?请原子哥及各路大神指教
Good good study , day day up...
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-12-22
在线时间
0 小时
发表于 2015-3-26 16:13:55 | 显示全部楼层
mark...
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
 楼主| 发表于 2015-3-26 23:17:34 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
首先感谢原子哥这么晚还回答我的问题,十分感谢,我还有以下几个疑问:
1.   16位数据宽度就用16根数据线吗?原子哥你的外部存储sram程序stm32用的是8位宽度的对吗?那为什么还用16根数据线,用8根不就可以了吗?
2.    stm32的AHB总线上的数据宽度是多少?是32位的吗?然后fsmc请求对数据宽度进行分割变成8位的?  还是AHB总线上的数据就是8位的?
Good good study , day day up...
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-3-26 23:36:38 | 显示全部楼层
回复【5楼】Just Beat It:
---------------------------------
1,是的,我们用的16位数据线,不是8位,你别搞错了.8位不行,我们的sram就是16位的.
2,这个你自己看数据手册. 我也没有注意过.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
 楼主| 发表于 2015-3-26 23:40:48 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥这是你回复别人的,我还有些疑问, 
这里是因为SRAM用了FSMC的UB/LB信号,控制字节高地位了。
因为SRAM是16位的,当你要读写8位数据的时候,UB/LB就发挥作用了,比如在SRAM的地址0写入1个8位的字节,那么LB会输出有效,而UB则保持不变(高电平),表示写入地址0的低8位,写法就是:
*(vu8*)(Bank1_SRAM3_ADDR+0)=0Xaa;//0XAA是你想写入的字节。
而如果要在SRAM地址0写入高8位,那么对于STM32来说,地址就相应加1即可,即:
*(vu8*)(Bank1_SRAM3_ADDR+1)=0XAA;
此时LB会输出高电平,UB会输出有效电平(低电平),表示写入地址0,的高字节。
这样,对STM32来说,地址就是连续的了,0,1,2,3,4,5,都是合法的了,自然就不需要你的地址右移对齐了,硬件通过UB/LB去控制了。

比如说我在程序中写了*(vu8*)(Bank1_SRAM3_ADDR+0)=0Xaa;这句话,那么16位的数据线D[0到15]上的电平状态是什么样的?0xaa难道不是只用了8根数据线吗?
Good good study , day day up...
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
 楼主| 发表于 2015-3-26 23:54:03 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
奥奥,我好像明白了,原子哥你看看我下面的这两条说法对吗?
1.就是说因为外部存储sram程序用的是8位宽度,所以就前8位数据线有用的,但是由于IS62WV51216是16位宽度的,所以程序可以用16为宽度的方式写sram,所以后8位还是有用的,只不过是外部存储sram那个例程没用到后8根数据线
2.外部存储sram程序用16位宽度比8位的速度快,但是不能字节控制,对吗?
Good good study , day day up...
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
 楼主| 发表于 2015-3-27 00:23:40 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
oid 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);//显示内存容量  
  }  
}
1.每隔4K字节,写入一个数据,总共写入256个数据,刚好是1M字节,原子哥你的这个程序为什么每隔4k写入一个数据,这个4k是随意选的吗?
2.原子哥你这个函数是不是在地址0写入0,在testsram[4096]处写入4096,可我单步调试却发现testsram[4096] = 4100,不知道为什么?
下面是我用的测试程序,我用j-link单步调试发现程序走完LCD_ShowxNum(60,190,testsram[4096],6,16,0);//显示测试数据  这句话发现lcd上显示的是4100?难道不应该是4096吗这是为什么?
while(1)
{
        fsmc_sram_test(60,170);//测试SRAM容量
        for(ts=0;ts<(4*1024-1);ts++)LCD_ShowxNum(60,190,testsram[ts],6,16,0);//显示测试数据  
       LCD_ShowxNum(60,190,testsram[4095],6,16,0);//显示测试数据  
       LCD_ShowxNum(60,190,testsram[4096],6,16,0);//显示测试数据
       LCD_ShowxNum(60,190,testsram[4097],6,16,0);//显示测试数据
       LCD_ShowxNum(60,190,testsram[4098],6,16,0);//显示测试数据
       LCD_ShowxNum(60,190,testsram[4099],6,16,0);//显示测试数据
}



上面两张图片分别是对应的lcd显示的内容单步调试程序,下面两个附件就是这两张图片,麻烦原子哥看一下。。。
单步调试程序.png
单步调试lcd显示内容.jpg
Good good study , day day up...
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
 楼主| 发表于 2015-3-27 13:02:17 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
求解答呀,原子哥
Good good study , day day up...
回复

使用道具 举报

21

主题

52

帖子

0

精华

高级会员

Rank: 4

积分
583
金钱
583
注册时间
2015-2-2
在线时间
76 小时
发表于 2015-3-27 13:12:25 | 显示全部楼层
帮顶。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
 楼主| 发表于 2015-3-28 19:57:17 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
奥奥,终于明白了,十分感谢原子哥的耐心解答,这个网站真心不错,祝原子哥的网站蒸蒸日上,越办越好,结贴。。。
Good good study , day day up...
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-3-28 22:34:19 | 显示全部楼层
回复【14楼】Just Beat It:
---------------------------------
谢谢支持
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-5-1
在线时间
25 小时
发表于 2016-11-8 16:24:27 | 显示全部楼层
懂了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 21:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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