|
本帖最后由 LHYLiuWilliam 于 2024-9-23 23:56 编辑
写GRAM指令后循环写LCD_RAM可以正常显示图片
void LCD_ShowImage(LCD *lcd, uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *image) {
LCD_SetWindow(lcd, x, y, width, height);
LCD_WriteGRAM(lcd);
uint32_t totalPoint = width * height;
for (uint32_t i = 0; i < totalPoint; i++) {
LCD_WriteDATA((image[i * 2 + 1] << 8) | image[i * 2]);
}
}
但是换用DMA从image向LCD_RAM搬运数据就会出问题,图片只能显示上部分 五分之一 左右
void LCD_ShowImage(LCD *lcd, uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *image) {
LCD_SetWindow(lcd, x, y, width, height);
LCD_WriteGRAM(lcd);
HAL_DMA_Start(&dma.Handler, (uint32_t)image, (uint32_t)&LCD1->LCD_RAM,
width * height);
while (HAL_DMA_PollForTransfer(&dma.Handler, HAL_DMA_FULL_TRANSFER,
HAL_MAX_DELAY) != HAL_OK)
;
}
使用DMA时图片有部分可以正常显示,DMA的配置应该没问题
目前疑问如下:
1. 使用DMA调用 HAL_DMA_Start 时,如果将 width * height 改为 width * height * 2,图片的显示范围会扩大到上部分 五分之二 左右,
但改为 width * height * 4,图片显示范围反而缩小回 五分之一 左右。
2. 图片数组为高位在后的模式,所以使用循环写LCD_RAM方法时,需要将高位移至前面: (image[i * 2 + 1] << 8) | image[i * 2]
但使用DMA时,没有做高位调整的操作,直接将16位数据搬运至LCD_RAM,图片色彩正常,调整后反而色彩不正常
求大佬解答,大学牲要睡不着觉了
|
|