STM32
直播中

陈刚

8年用户 162经验值
私信 关注
[问答]

FSMC外扩51216SRAM时,操作数位宽为8位时,请问是这样存放吗

手册上提到“与具有字节选择功能的存储器(SRAM、ROM、PSRAM等)进行异步传输时,FSMC 执行读写操作并通过它的字节通道BL[1:0]访问正确的数据。 ”
如下图所示:

SRAM挂到FSMC的NOR/PSRAM 1上,
现在定义一个8位和一个16位的变量temp_8 temp_16:
#define Bank1_SRAM1_ADDR    ((uint32_t)0x60000000)
#define temp_8 (*(u8 *)(Bank1_SRAM1_ADDR+0x0))
#define temp_16 (*(u16 *)(Bank1_SRAM1_ADDR+0x1))
赋值
temp_8=0x12;
temp_16=0x3456;
---------------------------------------------------------------------------------------   
1.两个变量在FSMC存储块中的存放位置应该如上图所示吧
2.而在SRAM中呢,temp_8会放在00000中的低8位,然后temp_16中的0x56会放在00000中的高8位,而0x34会放在00001中的低8位
  还是temp_8直接放在00000的低8位,而高8位空,temp_16高低8位对应该放入00001中呢?应该不会是第二种情况吧,不明NBL0、NBL1的控制时序

回帖(10)

孙翼飞

2020-6-3 09:00:41
这个研究,可以直接在mdk硬件仿真里面看.
在memory窗口,输入0X68000000,即可看到这个地址以后的数据.
怎么排列的,一目了然了.
举报

卞俱传

2020-6-3 09:13:25
还要注意硬件脚位 A0 A1
举报

施敏

2020-6-3 09:29:56
现在发现先对两个不同的地址写入数据,再把数据读出时就会出错了,读出的都是最后写入的那一个数,如下面程序
#define Bank1_SRAM3_ADDR    ((uint32_t)0x68000000)
#define temp1 (*(vu8 *)(Bank1_SRAM3_ADDR+0x1000))
#define temp2 (*(vu8 *)(Bank1_SRAM3_ADDR+0x2000))
temp1=0x12;                              //对偏移地址1000写入0x12
temp2=0x34;;                            //对偏移地址2000写入0x34
USART1_Transmit(temp1);          //串口读出0x1000地址
USART1_Transmit(temp2);          //串口读出0x2000地址
读出的都是0x34
如果换成以下程序
temp1=0x12;                              //对偏移地址1000写入0x12
USART1_Transmit(temp1 );           //串口读出0x1000地址
temp2=0x34;;                             //对偏移地址2000写入0x34
USART1_Transmit(temp2);            //串口读出0x2000地址
这样的话,输出又正确了,不明白那里出问题了
举报

邱敏

2020-6-3 09:36:37
确定你的硬件无问题?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分