Stm32 将STemWin配置为正确,以便将FlexColor驱动程序与ST7735显示驱动程序一起使用
我试图让STM32F446ZE和STemWin库在Keil项目中运行。 使用的操作系统是Segger的embOS。 我试图按照ST的指示在显示器上显示“hello world”。 我使用FlexColor驱动程序应支持的显示驱动程序ST7735S。 我的问题是显示器不是显示“hello world”,而是保持白色。 我将GUIConf.h配置为:Stm32 将STemWin配置为正确,以便将FlexColor驱动程序与ST7735显示驱动程序一起使用,stm32,stm32f4,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()中添加了以下内容: 在UC_ST7735_in
#define GUI_NUMBYTES 0x8000
在GUI_x中,我在GUI_x_init()中添加了以下内容:
在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()
我运行的代码是:
没有编译错误,看门狗也不会引起问题
问题是显示屏保持白色
我注意到flexchain驱动程序通过spi发送的命令编号与St7735数据表中的例外编号不匹配。
我调试了SPI方法。已发送以下命令和数据
- 以0x00作为高位字节的命令
- 以0x03作为低位字节的命令。据我所知,TT7735没有3号命令
- 高字节为0x00的数据
- 以0x00作为低位字节的数据
- 以0x00作为高位字节的命令
- 以0x50('P')作为低位字节的命令
- 高字节为0x00的数据
- 以0x00作为低位字节的数据
- 以0x00作为高位字节的命令
- 以0x51('Q')作为低位字节的命令
- 高字节为0x00的数据
- 以0x63作为低字节的数据
- 以0x00作为高位字节的命令
- 以0x52作为低位字节的命令
- 高字节为0x00的数据
- 以0x00作为低字节的数据
- 一段时间后,使用更多交替命令和数据,只有0x00的数据
更新: 更改GUIDRV_FLEXCOLOR_F66708 为了获得ST7735显示驱动程序的正确命令号,帮助GUIDRV_FLEXCOLOR_F667089 更改GUIDRV_FLEXCOLOR_M16C0B16 至GUIDRV_FLEXCOLOR_M16C1B8 不。我的设备在任何SPI通信发生之前重新启动 我对程序进行了调试,以确定错误发生的时间 我在没有崩溃的情况下运行了以下方法,但在最后一个方法之后,我在Keil的disassmbly窗口中没有看到其他方法的名称 emwin\u LCD\u init 液晶显示器颜色指数 LCD\u设置\u ClipRectMax GUI\u Alloc\u getFixedBlock GUI\u设备\u GetpDriver GUIDRV_Flexcolor_InitOnce GUI\u Alloc\u getFixedBlock 液晶显示器驱动程序 到了LCD\u X\u显示器驱动程序的末尾 但决不向LcdWriteReg发送, LcdWriteData, LcdWriteDataMultiple 或LCR数据多个. 有什么问题吗
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);
}
}
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
}