ST意法半导体
直播中

张玉兰

7年用户 1338经验值
私信 关注
[问答]

RM0433手册h742/743/750/753 stm32 MCU上的FMC内存访问是否存在勘误?

我目前正在使用带有STM32h743 MCU Nucleo板的外部16位SRAM芯片,使用FMC对外部SRAM进行内存操作。在表 154(NOR/PSRAM 外部存储器地址,第 806 页)和随附的脚注中,指出发布到外部存储器的地址将向右移动一位。我在一些与外部 SRAM 访问相关的论坛帖子中也看到了这一点。但是,通过尝试一些操作,我可以确认这似乎不是真的。

请参阅下面的代码:
```
   uint32_t 数据 = 0x45674567;
   *(uint32_t *) (MRAM_BANK_ADDR | 0x10<<1) = 数据;
   HAL_延迟(1000);
   printf("前 2 个字节:0x%4xn", *(uint16_t *) (MRAM_BANK_ADDR | 0x10<<1));
   printf("最后 2 个字节:0x%4xn", *(uint16_t *) (MRAM_BANK_ADDR | 0x10 <<1 | 0x02));
   printf("带位移的最后 2 个字节:0x%4xn", *(uint16_t *) (MRAM_BANK_ADDR | 0x12 <<1));
   printf("整个读取:0x%8lxn", *(uint32_t *) (MRAM_BANK_ADDR | 0x10<<1));
   数据 = 0x78907890;
   *(uint32_t *) (MRAM_BANK_ADDR | 0x10<<1 | 0x04) = 数据;
   printf("前 2 个字节:0x%4xn", *(uint16_t *) (MRAM_BANK_ADDR | 0x10 <<1 | 0x04));
   printf("最后 2 个字节:0x%4xn", *(uint16_t *) (MRAM_BANK_ADDR | 0x10 <<1 | 0x06));
```

输出:
```
前 2 个字节:0x4567
最后 2 个字节:0x4567
带位移的最后 2 个字节:0x7890
整个读取:0x45674567
前 2 个字节:0x7890
最后 2 个字节:0x7890
```

当应用手册中描述的移位时,输出不正确。事实上,访问第二组 2 个字节不需要移位。这似乎也适用于写作。
这是手册中的错误,还是我误解了所写的内容?








回帖(1)

李华

2022-12-2 14:54:06
> 是的,脚注指出内存芯片上的 A0 应该始终连接到 MCU FMC_A0,对吗?
是的。
> 然而,我的问题是表本身表示用于访问内存的内存地址在实际访问内存之前向右移动了 1 位。
是的,这就是硬件为您所做的。
> IE 如果我写入最后一个字节为:0000 0000 0000 0001 的地址,它实际上会访问内存 0x0 地址,因为 1 被移出,不是吗?
在 16 位内存的情况下,它将地址位 1..N 输出到引脚 A0..N-1,它将地址位 0 解码为字节通道信号。因此,在这种特殊情况下,所有地址引脚都将为 0,NBL0=1 和 NBL1=0(请注意字节通道信号为低电平有效,这就是它们的标记以 N 开头的原因)。
阅读内存的数据表。字节通道信号可以称为/UB/LB 或类似名称。
举报

更多回帖

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