STM32F429-DISC1 LCD打印双像素

Posted

技术标签:

【中文标题】STM32F429-DISC1 LCD打印双像素【英文标题】:STM32F429-DISC1 LCD prints double pixels 【发布时间】:2021-09-10 08:26:19 【问题描述】:

我正在尝试通过直接写入 ARGB4444 配置中的 SDRAM 来在STM32F429-DISC1 的 LCD 上打印像素。

stm32f429i_discovery_lcd.c 文件中,我更改了以下行:

LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565

LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_ARGB4444;

在我的 main 中,我调用了以下初始化程序:

LCD_Init();
LCD_LayerInit();
LTDC_Cmd(ENABLE);

最后我尝试打印red the 60500th pixel on Layer 1。我乘以 2,因为地址是 32 位。

*(uint32_t *) (SDRAM_BANK_ADDR + 60500 * 2) = 0xFF00;

附注:

uint32_t SDRAM_BANK_ADDR = 0xD0000000 //Beginning of Layer 1

红色像素被打印出来,但除此之外还有一个黑色像素。 这是一张图片:

怎么了?

谢谢

【问题讨论】:

像素以什么格式存储? @Lundin ARGB4444 这不是一种格式。这是 DMA 缓冲区吗?如果是这样,每个像素是如何存储的?每个像素有多少字节/位,颜色分辨率是多少等等。 【参考方案1】:

这个:

LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_ARGB4444;

似乎暗示像素是 16 位的。由于这是在微控制器上,我会假设帧缓冲区被打包,即每像素 16 位。

但是这个:

*(uint32_t *) (SDRAM_BANK_ADDR + 60500 * 2) = 0xFF00;

写入 32 位,即它也会破坏相邻像素。请注意,上面在计算时不会转换实际地址,这是通过在右括号内完成的。进行计算的确切类型取决于SDRAM_BANK_ADDR 的类型,即uint32_t。然后需要在写入之前将该整数值转换为指向像素的指针,这是通过向左转换来完成的。

解决方法就是:

*(uint16_t *) (SDRAM_BANK_ADDR + 60500 * 2) = 0xFF00;

【讨论】:

谢谢!这解决了问题!我使用 uint32_t 因为地址是 32 位,但像素是 16 位。请您详细说明为什么会这样?

以上是关于STM32F429-DISC1 LCD打印双像素的主要内容,如果未能解决你的问题,请参考以下文章

STM32 LCD和触摸屏

硬件\_8080接口LCD时序分析

STM32F429 LCD程序移植

ALIENTEK 战舰 STM32F103 板载的 LCD 模块是多少位?

STM32F4-Discovery Board:在 PC 屏幕上从连接的传感器打印数据

在 STM32F411 Discovery 上实现 HD44780 LCD 时调试 HardFault