使用显示总线接口将TFT屏幕与STM32F446接口
我试图了解如何在定制 PCB 上将 TFT 屏幕模块与 STM32F4 芯片连接起来。
这是模块及其基本信息。
为了将命令和数据写入屏幕,屏幕模块上的 ILI9481 驱动程序使用显示总线接口 (DBI),其中数据通过数据线发送 8 位或 16 位。
查看库示例,我明白(如果我错了,请纠正我),为了发送一个字节的命令,它只是根据命令将芯片的数字引脚设置为高电平或低电平。例如,8 位通信中的命令 0x2 将是 00000010,其中 0 将是芯片 GPIO 引脚上的数字低电平,1 将是数字高电平,这意味着 8 条线中的 1 条处于活动状态(逻辑高)。我希望,我理解正确。
现在,当我查看示例时,通常这些数字引脚位于同一个 GPIO 端口上。如果我理解正确的话,GPIO 端口有一个寄存器,称为 BSRR,您可以在其中操作 GPIO 端口引脚的逻辑电平。如果数据引脚都在同一个 GPIO 端口上,我认为这会起作用(从示例中,其中 c 是命令字节):
void STM32_TFT_8bit::write8(uint8_t c) {
// BRR or BSRR avoid read, mask write cycle time
// BSRR is 32 bits wide. 1's in the most significant 16 bits signify pins to reset (clear)
// 1's in least significant 16 bits signify pins to set high. 0's mean 'do nothing'
TFT_DATA->regs->BSRR = ((~c)<<16) | (c); //Set pins to the 8 bit number
WR_STROBE;
}
但是,在我的PCB板上,屏幕模块的数据引脚在不同的端口上是分开的。所以,我的问题是,我将如何做同样的事情,在操纵逻辑级别的同时发送命令?我假设,我可以根据命令一个一个地写入设置/重置我的引脚,但是它会如何与 BSRR 寄存器一起使用?
如果我的数据引脚如下:
- D0 -> PC12
- D1 -> PC11
- D2 -> PC10
- D4 -> PA12
- D5 -> PA11
- D6 -> PA10
- D7 -> PA9
通过寄存器的 0x9D (0b10011101) 命令会像这样吗?:
GPIOA->regs->BSRR = 0b0001101000000000; // A port: turn on PA9, PA11, PA12
GPIOC->regs->BSRR = 0b0001010000000000; // C port: turn on PC10 and PC12