C++ TFT LTDC显示器-像素未写入正确位置
因此,我一直在使用定制的alientek板将LVGL移植到STM32H743II,但一直面临与像素放置相关的问题。以前,我能够缩小区域并使LVGL显示正确,但任何将其放大到屏幕全宽(1024x600)的尝试都会导致所有内容变得混乱且无法读取 起初,我认为这是因为我没有正确设置HBP、VBP等值,但在这里找到屏幕的正确值,并使用相同的公式设置活动宽度/高度(包括在一些演示代码中)来更新所有值后,我仍然得到一个相当混乱的显示 我面临的问题的一个很好的例子可以在下图中看到, 这是我用来实际定义屏幕值的代码,这些值是根据这个特定屏幕的规范来定义的C++ TFT LTDC显示器-像素未写入正确位置,c++,user-interface,embedded,stm32,display,C++,User Interface,Embedded,Stm32,Display,因此,我一直在使用定制的alientek板将LVGL移植到STM32H743II,但一直面临与像素放置相关的问题。以前,我能够缩小区域并使LVGL显示正确,但任何将其放大到屏幕全宽(1024x600)的尝试都会导致所有内容变得混乱且无法读取 起初,我认为这是因为我没有正确设置HBP、VBP等值,但在这里找到屏幕的正确值,并使用相同的公式设置活动宽度/高度(包括在一些演示代码中)来更新所有值后,我仍然得到一个相当混乱的显示 我面临的问题的一个很好的例子可以在下图中看到, 这是我用来实际定义屏幕值
void PutPixel(uint16_t x, uint16_t y, uint32_t color)
{
*((uint32_t *) (Bank5_SDRAM_ADDR + (x * PIXELWIDHT) + (y * (LCD_WIDTH * PIXELWIDHT)))) = color;
}
这就是我用来将值写入SDRAM的函数
如果有人能够澄清为什么这不起作用,这将是一个很大的帮助,因为我已经面临这个问题不是几个星期了,它让我发疯
编辑:为了回应下面的评论,我更新了循环使用LCD_宽度,这使它看起来更干净,但它仍然溢出和抖动
编辑2:
因此,经过一点修改,我能够解决最初的闪烁问题,现在我所有的配置值都应该是正确的。我仍然面临奇怪的溢出错误,因为用户yeputons似乎正确地认为某些内存地址正在被覆盖。在初始循环中,您运行
j
到ACTIVE\u W
像素,但PutPixel
代码假设扫描线宽度为LCD\u width
像素。这让我觉得其中一个或两个都是错误的。很好,我刚刚更新使用LCD_宽度,它看起来更干净,但我仍然看到相同的问题。请参阅我更新的帖子。VFP
不应该是12
?我正在看你链接的页面上的以下公式:(VSPW+VBP+LINE+VFP)*(HSPW+HBP+HOZVAL+HFP)=(3+20+600+12)*(20+140+1024+160)
另外,我对你的活动的-1
/活动的/总宽度/总高度/code>。这可能是最后一行/列的从零开始的索引,但我怀疑这是实际的行/列数,这是索引所需的。啊,实际上您使用的是段而不是半个间隔,因此您的活动\u W
应该是最后一个索引。很少看到这种情况。下一个想法:实际上你应该乘以<代码> ToeSuthField+1 (请考虑把名字改成“代码> LastIdSt++/<代码>”,而不是按<代码> LCDWixWiels。此外,您应该相应地偏移所有坐标。否则,循环中的一些PutPixel
调用显然会修改相同的内存,这很奇怪。
#define LCD_WIDTH 1024
#define LCD_HEIGHT 600
#define HFP 160
#define HSYNC 20
#define HBP 140
#define VFP 120
#define VSYNC 3
#define VBP 20
//=================================================================================================
// Areas computation
//=================================================================================================
#define ACTIVE_W (HSYNC + LCD_WIDTH + HBP - 1)
#define ACTIVE_H (VSYNC + LCD_HEIGHT + VBP - 1)
#define TOTAL_WIDTH (HSYNC + HBP + LCD_WIDTH + HFP - 1)
#define TOTAL_HEIGHT (VSYNC + VBP + LCD_HEIGHT + VFP - 1)
/* Pixel width in bytes */
#define PIXELWIDHT 4
void PutPixel(uint16_t x, uint16_t y, uint32_t color)
{
*((uint32_t *) (Bank5_SDRAM_ADDR + (x * PIXELWIDHT) + (y * (LCD_WIDTH * PIXELWIDHT)))) = color;
}