程序在F407上,分别用了驱动自带的画点函数和DMA中断+SetWindows函数,都正常跑。
但在H743这里,用驱动画点函数正常,DMA中断SetWindows函数的方法,屏幕会显示异常。
以下是SetWindows
[C] 纯文本查看 复制代码 void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(xStar>>8);
LCD_WR_DATA(0x00FF&xStar);
LCD_WR_DATA(xEnd>>8);
LCD_WR_DATA(0x00FF&xEnd);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(yStar>>8);
LCD_WR_DATA(0x00FF&yStar);
LCD_WR_DATA(yEnd>>8);
LCD_WR_DATA(0x00FF&yEnd);
LCD_WriteRAM_Prepare(); //开始写入GRAM
}
其中LCD_WriteRAM_Prepare函数实际为LCD->LCD_REG=0x2C;
然后这是调用disp_flush函数的,上面被注释掉的部分是驱动自带画点函数
[C] 纯文本查看 复制代码 static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
// if(disp_flush_enabled) {
// /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
// int32_t x;
// int32_t y;
// for(y = area->y1; y <= area->y2; y++) {
// for(x = area->x1; x <= area->x2; x++) {
// /*Put a pixel to the display. For example:*/
// /*put_px(x, y, *color_p)*/
// GUI_DrawPoint(x,y,*(uint16_t*)color_p);
// color_p++;
// }
// }
// }
// /*IMPORTANT!!!
// *Inform the graphics library that you are ready with the flushing*/
// lv_disp_flush_ready(disp_drv);
//启用DMA
if(disp_flush_enabled) {
disp_drv1 = disp_drv;
LCD_SetWindows(area->x1,area->y1,area->x2,area->y2); //设置LCD屏幕的扫描区域
HAL_DMA_Start_IT(&hdma_memtomem_dma1_stream0, (uint32_t)color_p, (uint32_t)&LCD->LCD_RAM,
((area->x2+1) - area->x1) * ((area->y2+1) - area->y1));
}
}
然后DMA回调函数是
[C] 纯文本查看 复制代码 void LVGL_LCD_FSMC_DMA_pCallback(DMA_HandleTypeDef *_hdma)
{
lv_disp_flush_ready(disp_drv1);
}
在CubeMX中DMA配置如下:
并且根据网上查到的资料,需要开启MPU才行,我怀疑是开启MPU的配置问题?MPU+DMA有问题,MPU+驱动画点函数又没有问题。MPU配置如下:
最后附上出现问题的屏幕画面(使用DMA)和正常状态的屏幕画面(使用驱动画点函数)
排问题排了好久了,排下来感觉是MPU那块设置问题,因为从F4到H7其他的基本没变,就多了MPU设置这块,试过若不配置MPU屏幕就不显示。
求大佬们指点!感激!
|