正确配置STemWin以将FlexColor驱动程序与ST7735显示驱动程序一起使用

时间:2019-06-28 11:08:59

标签: stm32 stm32f4

我试图让STM32F446ZE和STemWin库在Keil项目中运行。 使用的操作系统是Segger的embOS。 我试图按照ST的指示在显示屏上显示“ hello world”。 我使用了FlexColor驱动程序应支持的显示驱动程序ST7735S。 我的问题是,显示器保持白色而不是“ hello world”。 我这样配置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作为低字节的命令。据我所知,STt7735没有命令号3
  • 以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

GUI_Device_GetpDriver

GUIDRV_Flexcolor_InitOnce

GUI_Alloc_getFixedBlock

LCD_X_DisplayDriver

它到达LCD_X_DisplayDriver的末尾,但永远不会到达LcdWriteReg,LcdWriteData,LcdWriteDataMultiple或LcdReadDataMultiple。

可能是什么问题?

0 个答案:

没有答案