OpenEdv-开源电子网

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

外部SRAM(IS61LV51216)问题(C语言方面)

[复制链接]

9

主题

44

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-15
在线时间
0 小时
发表于 2014-10-4 21:11:40 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组,配置起始地址为0X68000000 int main(void) { u16 ts=0,temp; FSMC_SRAM_Init(); //初始化外部SRAM USART1_Config();//串口1初始化 // fsmc_sram_test(60,170);//▓注释1 for(ts=0;ts<256;ts++)FSMC_SRAM_WriteBuffer((u8*)&ts,ts,1);//显示测试数据 for(ts=0;ts<256;ts++) { printf(" %d ",(u16)testsram[ts]);//显示内存容量 } while(1); }[/mw_shl_code]
以上是原子大哥的程序经过我改造之后的模样。原子大哥用的是注释1的函数测试。里面有分别用了FSMC_SRAM_WriteBuffer和FSMC_SRAM_ReadBuffer测试SRAM,后来我想既然FSMC_SRAM_WriteBuffer之后那testsram数组里不就已经有了么。没必要用FSMC_SRAM_ReadBuffer再次读取,然后我就进行了尝试,将程序改成上面的样子,但是printf输出错误,然后我就把u32 testsram[250000] __attribute__((at(0X68000000)));的u32改成u8测试成功。但是改成u16后我就把
[mw_shl_code=c,true]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地址右移一位对齐(16b数据规则). //加2相当于实际地址+1. pBuffer++; } }[/mw_shl_code]
改成了这样:
[mw_shl_code=c,true]void FSMC_SRAM_WriteBuffer(u16* pBuffer,u32 WriteAddr,u32 n) { for(;n!=0;n--) { *(vu16*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer; WriteAddr+=4; pBuffer++; } [/mw_shl_code] [mw_shl_code=c,true]} [/mw_shl_code] [mw_shl_code=c,true]主函数里的 [mw_shl_code=c,true]for(ts=0;ts<256;ts++)FSMC_SRAM_WriteBuffer((u8*)&ts,ts,1);[/mw_shl_code] [mw_shl_code=c,true]改成[/mw_shl_code] [mw_shl_code=c,true] [mw_shl_code=c,true]for(ts=0;ts<256;ts++)FSMC_SRAM_WriteBuffer((u16*)&ts,ts,1);[/mw_shl_code]
[/mw_shl_code] [/mw_shl_code]
以前从来没接触过直接地址赋值,C语言只是也不充足,这也是我第一次尝试所以胡乱改的不成功。printf出错。
想请教各位大神应该怎么改才能对
u16 testsram[250000] __attribute__((at(0X68000000)));有效,u32呢?

最佳答案

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

你明显改错了。 FSMC_SRAM_WriteBuffer函数不要随便改。 u8的时候,+1才对。 u16的时候,+2对。 u32的时候,+4对。 否则,都错。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-4 21:11:41 | 显示全部楼层
你明显改错了。
FSMC_SRAM_WriteBuffer函数不要随便改。
u8的时候,+1才对。
u16的时候,+2对。
u32的时候,+4对。
否则,都错。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-4 21:11:41 | 显示全部楼层
回复【3楼】Austin:
---------------------------------
u8数据的时候,由UB,LB控制,不需要加2。
加2是u16的时候,才加2.
这个很好理解:u16,按8位地址的概念,本就应该加2.
而u8,一个地址就是一个数据,自然不用加2.(实际上是通过UB/LB控制高低字节来实现的)。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

44

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-15
在线时间
0 小时
 楼主| 发表于 2014-10-5 09:49:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
可能原子大哥忘记了famc 16位数据的时候地址右移一位的事情了。上面WriteAddr+=2;也是你的源程序。我测试u16 +4也出错。我考虑了一下改函数
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)  
{
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;   
WriteAddr+=2;

//▓以下为自己添加的     
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=0;   
WriteAddr+=2;

pBuffer++;
}   
}
主函数改为for(ts=0;ts<256;ts++)FSMC_SRAM_WriteBuffer((u8*)&ts,ts*2,1);也就是把地址ts,变成ts*2。
也不行。输出数据为 256  770  1284  1798  2312  2826  3340  3854  4368  4882  5396  5910  6424...
也就是低8位为正常数据0,1,2,3,4,5,6...但高8位也有数据(1,3,4,5,6,7,8,9...没有2),我明明在高8位*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=0;   赋值为0了。还请教怎么回事
回复

使用道具 举报

9

主题

44

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-15
在线时间
0 小时
 楼主| 发表于 2014-10-5 10:24:07 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
这是您的源程序
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++;
}   
}
这样的话,ReadAddr应该最少+2.请问+1是怎么来的..
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-5 23:14:03 | 显示全部楼层
回复【5楼】Austin:
---------------------------------
所以这代码有bug。
寄存器版本的是+1的了。库函数这个还没改过来,最新的应该改过来了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

44

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-8-15
在线时间
0 小时
 楼主| 发表于 2014-10-6 10:47:43 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原来如此。我明白了,非常感谢原子哥。

u16只需要改两个地方即可:
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n) 

for(;n!=0;n--)   
{       
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;    
WriteAddr+=1;
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=0;//高位赋值0
WriteAddr+=1;
pBuffer++; 
}    
}

还有主函数for(ts=0;ts<256;ts++)FSMC_SRAM_WriteBuffer((u8*)&ts,ts*2,1);  u16*2
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 18:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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