我试图让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方法。以下命令和数据已发送。
我忘了配置一些东西吗?
更新: 将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。
可能是什么问题?