地址,数据位的一些理解:战舰板子
关于STM32映射地址空间,以及战舰板子的外加SRAM地址等有些不解,论坛和原子讨论了一下,稍微明白了一些,记录在此,不一定正确
http://openedv.com/posts/list/0/13394.htm?privmsg=1#73668
原子哥,还有一个小问题,也是关于地址的,在手册4.6节,讲MDK中地址映射,两个相邻寄存器之间的偏移都是0X04,这是因为寄存器都是32位,32/8=4byte么?
在sram中地址都是偏移0x01,这是因为512k*16位=1MB,我们寻址时候只寻址512k的数据量。而上面寄存器映射的寻址如果也是1MB空间,我们就相当于寻址1MB的数据量。
这样理解对么?
里是因为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去控制了。
回复【3楼】 wwjdwy :
---------------------------------
32位就是占4字节的。
1,地址映射里的地址偏移每个寄存器都是便宜0x04,是因为每个寄存器32位四字节。
2,那我的SRAM要在地址1写入呢?写入地址1的低字节就是*(vu8*)(Bank1_SRAM3_ADDR+2),写入地址1的高字节就是*(vu8*)(Bank1_SRAM3_ADDR+3)???
一次写入一个16位的数据呢?
回复【6楼】 正点原子 :
---------------------------------
那写入的是8位数据,就相当于把地址从512k变成了1M,可以连续的写地址0,1,2,3,。。。。,512,。。。。1023,1024
写入16位数据时候,地址0,2,4,6,8,10.....512,。。。。1024。也就可以理解为0,1,2,3.。。512连续地址左移一位变成了0,2,4,6,8,.....512,。。。。1024
那这个地址+1或者+2要根据写入数据是8位还是16位来确定喽?
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++;
}
}
这里u8* pBuffer,所以WriteAddr++才对,是这么理解吧
其实两个寻址一个意思,只是一个寄存器32位,一个是8或16位。一个地址加数据,一个只是地址。真是悟,不知道对不对