本帖最后由 jackjeanxp 于 2026-4-24 14:44 编辑
大家好,上面是屏幕照片和出问题的截图的对比
PCB上CPU和SDRAM部分是参考V7画的,SDRAM在内容取反测试里零报错,移植emWin后显示也正常
emWin是CubeMX H7器件包里的STemWin,2018年的V5.44
V5.44 / 22-March-2018
使用了FreeRTOS
USB驱动和FatFS是用CubeMX直接添加的,向U盘写入txt和csv文件,在电脑上打开,都正常
但是emWin截屏再写入U盘一直花屏,尝试了 GUI_BMP_Serialize 和 GUI_BMP_SerializeExBpp 两个函数都是这样,折腾两天了 ,求解……
以下是截屏代码:
[C] 纯文本查看 复制代码 FRESULT Udisk_Result;
FATFS Udisk_fs;
FIL Udisk_file;
DIR Udisk_DirInf;
UINT Udisk_bw;
extern USBH_HandleTypeDef hUsbHostFS;
extern ApplicationTypeDef Appli_state;
static void _WriteByte2File(U8 Data, void * p)
{
#if 1
f_write(p, &Data, 1, &Udisk_bw);
#else
FIL *File = (FIL *)p;
f_putc(Data, File);
#endif
}
uint8_t Udisk_PrintScreen(void)
{
char str[128];
USBH_Stop(&hUsbHostFS);
osDelay(100);
FATFS_UnLinkDriver(USBHPath);
osDelay(600);
retUSBH = FATFS_LinkDriver(&USBH_Driver, USBHPath);
osDelay(100);
USBH_Start(&hUsbHostFS);
osDelay(100);
f_mount(NULL, NULL, 0);
osDelay(1000);
// to be opt
// can we get new state?
if (Appli_state != APPLICATION_READY)
return 0;
Udisk_Result = f_mount(&Udisk_fs, "0:", 1);
if (Udisk_Result != FR_OK)
goto exit_error;
Udisk_Result = f_opendir(&Udisk_DirInf, "0:/EDT_PrintScreen");
if (Udisk_Result == FR_OK)
{
}
else if (Udisk_Result == FR_NO_PATH)
{
Udisk_Result = f_mkdir("0:/EDT_PrintScreen");
if (Udisk_Result == FR_OK)
{
}
else if (Udisk_Result == FR_EXIST)
{
}
Udisk_Result = f_opendir(&Udisk_DirInf, "0:/EDT_PrintScreen");
if (Udisk_Result != FR_OK)
goto exit_error;
}
else
{
goto exit_error;
}
sprintf(str, "0:/EDT_PrintScreen/EDT_20%02d%02d%02d_%02d%02d%02d.bmp",
RtcNow.Year,
RtcNow.Month,
RtcNow.Date,
RtcNow.Hour,
RtcNow.Minute,
RtcNow.Second);
Udisk_Result = f_open(&Udisk_file, str, FA_CREATE_ALWAYS | FA_WRITE);
if (Udisk_Result != FR_OK)
goto exit_error;
GUI_LOCK();
// GUI_BMP_Serialize(_WriteByte2File, &Udisk_file);
GUI_BMP_SerializeExBpp(_WriteByte2File, 0, 0, 1024, 600, &Udisk_file, 16);
GUI_UNLOCK();
Udisk_Result = f_close(&Udisk_file);
if (Udisk_Result != FR_OK)
goto exit_error;
f_mount(NULL, NULL, 0);
return 1;
exit_error:
return 0;
}
GUI_X.c:
[C] 纯文本查看 复制代码 void GUI_X_InitOS(void) { _Semaphore = xSemaphoreCreateCountingStatic (1, 0, &_Semaphore_Memory); }
void GUI_X_Unlock(void) { xSemaphoreGive(_Semaphore); }
void GUI_X_Lock(void) { xSemaphoreTake(_Semaphore, 0); }
U32 GUI_X_GetTaskId(void) { return (U32)xTaskGetCurrentTaskHandle(); }
V5.44 / 22-March-2018
|