Config STemWin правильно использовать драйвер FlexColor с драйвером дисплея ST7735 - PullRequest
1 голос
/ 28 июня 2019

Я попытался запустить 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.

В чем может быть проблема?

...