Я попытался запустить STM32F446ZE и библиотеку STemWin в проекте Keil.Используемая ОС - это EmbOS от Segger.Я пытался следовать инструкциям ST, чтобы отобразить на экране «привет мир».Я использую драйвер дисплея ST7735S, который должен поддерживаться драйвером FlexColor.Моя проблема в том, что вместо «Привет мир» дисплей остается белым.Я настроил GUIConf.h так:
#define GUI_NUMBYTES 0x8000
В GUI_x я добавил следующее в GUI_X_init ():
void GUI_X_Init(void) {
UC_ST7735_init();
USInt current = Sopas_usiGet_IOLink14360ST7735DisplayBacklightCurrent();
LITA_setDisplayCurrent((uint8_t)current);
}
В UC_ST7735_init () SPI-порт инициируется.Эта часть должна работать, потому что она уже используется с датчиком того же типа.Разница лишь в том, что я удалил библиотеку GraphCIS, которую мы использовали ранее.Строки добавления активируют дисплей и его подсветку.
В LCDConf_FlexColor_Template.c я установил разрешение следующим образом:
#define XSIZE_PHYS 100 // To be adapted to x-screen size
#define YSIZE_PHYS 40 // To be adapted to y-screen size
Следующие три метода, которые я заполнил следующим образом: Следует отметить, чтоUC_ST7735_writeSPI4Wire также использовался ранее и должен работать.Он посылает один байт один за другим вместо 16-битного сразу.Я пытался отправить старший и младший байты в разных порядках.
static void LcdWriteReg(U16 Data) {
uint8_t data[2];
UC_ST7735_dcFLAG_t dcFlag = UC_ST7735_COMMAND;
data[0] = (uint8_t)UTIL_HLP_LOW_BYTE_OF_INT16(Data);
data[1] = (uint8_t)UTIL_HLP_HIGH_BYTE_OF_INT16(Data);
UC_ST7735_writeSPI4Wire(&data[1], 1, dcFlag);
UC_ST7735_writeSPI4Wire(&data[0], 1, dcFlag);
}
static void LcdWriteData(U16 Data) {
UC_ST7735_dcFLAG_t dcFlag = UC_ST7735_DATA;
uint8_t data[2];
data[0] = (uint8_t)UTIL_HLP_LOW_BYTE_OF_INT16(Data);
data[1] = (uint8_t)UTIL_HLP_HIGH_BYTE_OF_INT16(Data);
UC_ST7735_writeSPI4Wire(&data[1], 1, dcFlag);
UC_ST7735_writeSPI4Wire(&data[0], 1, dcFlag);
}
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
UC_ST7735_dcFLAG_t dcFlag = UC_ST7735_DATA;
uint8_t data[2];
int start_size = NumItems;
while (NumItems--) {
data[0] = (uint8_t)UTIL_HLP_LOW_BYTE_OF_INT16(pData[start_size-NumItems]);
data[1] = (uint8_t)UTIL_HLP_HIGH_BYTE_OF_INT16(pData[start_size-NumItems]);
UC_ST7735_writeSPI4Wire(&data[1], 1, dcFlag);
UC_ST7735_writeSPI4Wire(&data[0], 1, dcFlag);
}
}
Я не менял LCD_X_Config ()
void LCD_X_Config(void) {
GUI_DEVICE * pDevice;
CONFIG_FLEXCOLOR Config = {0};
GUI_PORT_API PortAPI = {0};
//
// Set display driver and color conversion
//
pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
//
// Display driver configuration, required for Lin-driver
//
LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
//
// Orientation
//
Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;
GUIDRV_FlexColor_Config(pDevice, &Config);
//
// Set controller and operation mode
//
PortAPI.pfWrite16_A0 = LcdWriteReg;
PortAPI.pfWrite16_A1 = LcdWriteData;
PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
PortAPI.pfReadM16_A1 = LcdReadDataMultiple;
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);
}
Код, который я запускаю:
GUI_Init();
int xPos, yPos;
//__HAL_RCC_CRC_CLK_ENABLE();
xPos = LCD_GetXSize() / 2;
yPos = LCD_GetYSize() / 3;
GUI_SetFont(GUI_FONT_COMIC24B_ASCII);
GUI_DispStringHCenterAt("Hello world!", xPos, yPos);
// Endless loop:
while(true)
{
OS_TASK_Delay(100);
MW_TWD_arm(); // Arm the watchdog
}
Ошибка компиляции отсутствует, и сторожевая собака не вызывает проблем.Проблема в том, что дисплей остается белым.Я заметил, что номер команды, который драйвер flexchain отправляет через spi, не соответствует исключенным числам из таблицы данных St7735.Я отладил метод SPI.Следующие команды и данные были отправлены.
- команда с 0x00 в качестве старшего байта
- команда с 0x03 в качестве младшего байта.Насколько я знаю, нет команды № 3 для данных STt7735
- с 0x00 в качестве старшего байта
- данных с 0x00 в качестве младшего байта
- команды с 0x00 в качествестарший байт
- команда с 0x50 ('P') в качестве младшего байта.
- данные с 0x00 в качестве старшего байта
- данные с 0x00 в качестве младшего байта
- команда с 0x00 в качестве старшего байта
- команда с 0x51('Q') как младший байт.
- данные с 0x00 в качестве старшего байта
- данные с 0x63 в качестве младшего байта
- команда с 0x00 в качестве старшего байта
- команда с 0x52как младший байт.
- данные с 0x00 в качестве старшего байта
- данные с 0x00 в качестве младшего байта ...
- через некоторое время с более чередующимися командами и данными есть только данные с 0x00
Я забыл что-то настроить?
Обновление: изменение GUIDRV_FLEXCOLOR_F66708 на GUIDRV_FLEXCOLOR_F667089 помогло получить правильные номера команд для драйвера дисплея ST7735.
Изменение GUIDRV_FLEXCOLOR_M16C0B16 на GUIDRV_FLEXCOLOR_M16C1B8 не имеет.Мое устройство перезагружается до того, как произойдет какая-либо связь SPI.
Я отладил программу, чтобы узнать, когда произошла ошибка.
Я запускаю следующие методы без сбоев, но после последнего я не вижудругое имя метода в окне разборки Keil.
emwin_LCD_init
LCD_SETBk_ColorIndex
LCD_set_ClipRectMax
GUI_Alloc_getFixedBlock * 10 1080 * GUI
GUI
GUIDRV_Flexcolor_InitOnce
1083 * GUI_Alloc_getFixedBlock 1085 * LCD_X_DisplayDriver 1087 * Это получить, чтобы в конце LCD_X_DisplayDriver, но никогда в LcdWriteReg, LcdWriteData, LcdWriteDataMultiple или LcdReadDataMultiple.
В чем может быть проблема?