OpenEdv-开源电子网

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

外部SRAM读写函数的疑问

[复制链接]

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-7-23
在线时间
1 小时
发表于 2013-8-20 12:15:43 | 显示全部楼层 |阅读模式
发现寄存器版本和库函数版本关于外部SRAM的实验,读写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++;
    }  
}                        


寄存器:
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
    for(;n!=0;n--) 
    {                                           
        *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;     
        WriteAddr++;
        pBuffer++;
    }  
}                                                                               

设置是一样的:mode A, 16bit位宽。问题来了,位宽是16位,每次写操作数据总线送出的是16bit,应该将地址和数据强制转换为指向16bit数据的指针吧?
        *(vu16*)(Bank1_SRAM3_ADDR+WriteAddr)=*(u16*)pBuffer;
后面的地址+2,
这样操作才对吧。
pdf手册有一段话,寄存器和库函数版本均一样,也不是很理解:如何操作UB和LB来控制高低字节位??FSMC控制器自动操作吗??貌似在RM里面没找到相关操作。
这里需要注意的是:FSMC 当位宽为 16 位的时候,HADDR 右移一位同地址对其,但是 ReadAddr 我
们这里却没有加 2,而是加 1,是因为我们这里用的数据为宽是 8 位,通过 UB 和 LB 来控制高
低字节位,所以地址在这里是可以只加 1 的。   
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-20 12:48:43 | 显示全部楼层
库函数多了个+2.
改为u8后,+1就可以了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-7-23
在线时间
1 小时
 楼主| 发表于 2013-8-20 13:15:53 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
库函数+2,寄存器+1啊,不是“库函数多了个+2”啊
改为u8后,数据总线读写也变成8bit?总线如何操作的?
回复 支持 反对

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-7-23
在线时间
1 小时
 楼主| 发表于 2013-8-20 13:27:55 | 显示全部楼层
看了参考手册,明白了。库函数版本的读写函数错了,地址应该改为+1
void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
{
for(;n!=0;n--)  
{     
*pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);    
ReadAddr+=1;//这里需要加2,是因为STM32的FSMC地址右移一位对其.加2相当于加1.
}  



手册相关内容:
●       AHB transaction size is smaller than the memory size
Asynchronous transfers may or not be consistent depending on the type of external 
device.
–     Asynchronous accesses to devices that have the byte select feature (SRAM, 
ROM, SRAM).
a) FSMC allows write transactions accessing the right data through its byte lanes 
NBL[1:0]
b) Read transactions are allowed. All memory bytes are read and the useless 
ones are discarded. The NBL[1:0] are driven low during read transactions. 
–     Asynchronous accesses to devices that do not have the byte select feature (NOR 
and NAND Flash 16-bit).
This situation occurs when a byte access is requested to a 16-bit wide Flash 
memory. Clearly, the device cannot be accessed in byte mode (only 16-bit words 
can be read from/written to the Flash memory) therefore:
a)    Write transactions are not allowed
b)    Read transactions are allowed (the controller reads the entire 16-bit memory word 
and uses the needed byte only).
回复 支持 反对

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-7-23
在线时间
1 小时
 楼主| 发表于 2013-8-20 13:38:51 | 显示全部楼层
貌似宣传口号“所以代码都经过严格测试,并在开发板上面验证”要打折扣啊。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-20 15:03:31 | 显示全部楼层
回复【5楼】justsun:
---------------------------------
这个需要慢慢完善,有些地方不足的,希望大家多多指出。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-7-23
在线时间
1 小时
 楼主| 发表于 2013-8-20 20:14:50 | 显示全部楼层
回复【6楼】正点原子:

回复【5楼】justsun:
---------------------------------
这个需要慢慢完善,有些地方不足的,希望大家多多指出。

---------------------------------
原子的开发板很不错,信息量非常大,值得学习的内容非常多。瑕不掩瑜!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-20 22:40:58 | 显示全部楼层
谢谢支持
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-4-25
在线时间
31 小时
发表于 2016-8-23 17:14:50 | 显示全部楼层
正点原子 发表于 2013-8-20 12:48
库函数多了个+2.
改为u8后,+1就可以了。

原子哥,问您几个问题。
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++;
    }  
}   
读写函数 WriteAddr+=2;还有READaddr+=2;这里注释的没看明白,能详细的解释一下吗,谢谢,原子哥。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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