原子的写操作代码(此处我们暂时不讨论WriteAddr+1还是+2问题):
[mw_shl_code=c,true]//在指定地址开始,连续写入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++;
}
}[/mw_shl_code]
我们发现地址被强制的转换成了8位,但是我们知道,FSMC的Bank1第三区地址范围是 0x68000000~0x6BFFFFFF,这些地址都是32位的
当我们进行SRAM操作的时候,这些地址出现AHB上面,其中[25:1]对应FSMC地址的[24:0](16位数据宽度),也就是说AHB上面的[25:1]出现在FSMC地址的[24:0]上面,AHB上面的[26:27]是进行片选控制的。[31:28]这四位,在第三区是6。这些地址在STM32中都是唯一的(我自己的理解,如有错误,不要笑话)。举个例子:比如我们在 地址0X68000020所标识的存储区写入一个数据,当我们强制转换成8位的,也就是只取底8位(自己的理解,有错请不要嘲笑),那么地址就变成了0x20,那问题就来了,这个0X20对应的地址太多了,例如:
0x68111120,0x38001120,0x58110120,.........................这些地址经过强制转换都变成了0x20..................那岂不是乱套了吗?????
这个问题可能问得比较SB,但是我思考了很久,感觉有点眩晕,请大家不吝赐教,谢谢大家 |