STM32F429-DISC1 LCD打印双像素
STM32F429-DISC1 LCD prints double pixels
我正在尝试通过直接写入 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
打印出红色像素,但除此之外还有一个黑色像素。
这是一张照片:
怎么了?
谢谢
这个:
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;
我正在尝试通过直接写入 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
打印出红色像素,但除此之外还有一个黑色像素。
这是一张照片:
怎么了?
谢谢
这个:
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;