ST意法半导体
直播中

徐磊

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

STM32H743II如何避免bitbanging LCD信号或改变硬件设计?


  我正在将 STM32H743II 与 8080 并行总线 LCD 接口。我在 CubeMX 中将 FMC 配置为具有 16 位总线的 LCD 接口,并将 A11 配置为 R/S 引脚。但是,我在将命令/数据写入 LCD 时遇到了问题。在 0x68000000 地址下的单个 uint16_t 写入导致 4 次写入内存,其中第一次写入是有效数据,其余为 0,如逻辑分析仪快照所示。

  
  写入由以下代码执行:

  
  • #define COMMAND_POINTER 0x68000000
  • #define DATA_POINTER 0x68001000
  • ...
  • static uint16_t * command = (uint16_t *) COMMAND_POINTER;
  • static uint16_t * data = (uint16_t *) DATA_POINTER;
  • ...
  • *command = ILI9341_SWRESET; //software reset‍‍‍‍‍‍‍‍‍‍‍


  我也尝试了 HAL_SRAM_Write_16b(),但结果是一样的。

  这些写入基本上编译为 strh(存储寄存器半字)指令,执行这条指令会导致 4 次对 LCD 的写入访问。经过一番调查,我注意到,在递增地址下写入,例如 0x68000002 仅在第二次写入操作中导致有效数据,在 0x68000004 下写入仅在第三次写入操作中导致有效数据,依此类推。这就像 FMC 试图一次写入整个 64 位内存块。

  ICache 和 DCache 被禁用,我尝试禁用 FMC 写入 FIFO,但它并没有太大变化。不用说,这种 FMC 行为会中断与 LCD 的通信

  我没有考虑到一些细节吗?我想避免 bitbanging LCD 信号或改变硬件设计。





回帖(1)

高媛

2022-12-28 15:38:38
我通过将 fmc SRAM 重新映射到 0xC0000000 解决了这个问题;
HAL_SetFMCMemorySwappingConfig(FMC_SWAPBMAP_SDRAM_SRAM);
为什么这有效?0xC0000000 以下的内存作为设备内存访问,而不是以下的内存

0x60000000
作为普通内存访问。“普通内存允许 CPU 以高效方式安排字节、半字和字的加载和存储(编译器不知道内存区域类型)”。
举报

更多回帖

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