硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2576|回复: 21
收起左侧

[emWin] st7789 spi emwin

[复制链接]

16

主题

33

回帖

81

积分

初级会员

积分
81
发表于 2018-4-18 16:52:27 | 显示全部楼层 |阅读模式
请问下版主:    st7789 spi的屏emwin移植好了,在显示控件的时候有点慢,_DrawBitLine16BPP这个函数用SPI方式不知道怎么优化。困扰好久了。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-18 17:09:17 | 显示全部楼层
SPI接口的只能简单化下SPI的写函数了,越简单越好。

像RA8875有个硬件的2D加速,使用SPI接口也可以使用,所以稍好点。
回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2018-4-18 17:33:09 | 显示全部楼层
eric2013 发表于 2018-4-18 17:09
SPI接口的只能简单化下SPI的写函数了,越简单越好。

像RA8875有个硬件的2D加速,使用SPI接口也可以使用 ...

打点函数已经很精简了。我想应该有两种方法。
1.自定义驱动,优化_DrawBitLine16BPP这个函数。
2.采用emwin内部驱动(st7789有支持)。

能给点参考吗,谢谢了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-18 17:39:29 | 显示全部楼层
wangjun110 发表于 2018-4-18 17:33
打点函数已经很精简了。我想应该有两种方法。
1.自定义驱动,优化_DrawBitLine16BPP这个函数。
2.采用e ...

我看下你当前_DrawBitLine16BPP是如何实现。
回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2018-4-18 17:46:57 | 显示全部楼层
eric2013 发表于 2018-4-18 17:39
我看下你当前_DrawBitLine16BPP是如何实现。

static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
  for (;xsize > 0; xsize--, x++, p++) {
    _SetPixelIndex(pDevice, x, y, *p);
  }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-18 17:51:37 | 显示全部楼层
wangjun110 发表于 2018-4-18 17:46
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int x ...

把打点函数在里面展开。
另外就是你的这个控制器是否支持设置坐标后,在水平方向可以地址自增,这样就可以直接写数据即可,无需每次都设置坐标后再打点。
回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2018-4-18 17:55:11 | 显示全部楼层
eric2013 发表于 2018-4-18 17:51
把打点函数在里面展开。
另外就是你的这个控制器是否支持设置坐标后,在水平方向可以地址自增,这样就可 ...

st7789支持设置坐标的。这种方法我也试过,好像没什么变化。刷控件还是慢。st7789 spi和9341 spi 差不多。我看过它们的指令。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-18 17:59:37 | 显示全部楼层
wangjun110 发表于 2018-4-18 17:55
st7789支持设置坐标的。这种方法我也试过,好像没什么变化。刷控件还是慢。st7789 spi和9341 spi 差不多 ...

按我说的先测试下,一定要展开,直接寄存器方式的。做好后,我看下你写的代码。
回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2018-4-19 09:41:24 | 显示全部楼层
eric2013 发表于 2018-4-18 17:59
按我说的先测试下,一定要展开,直接寄存器方式的。做好后,我看下你写的代码。

void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
        LCD_WR_REG(0x2a);
        LCD_WR_DATA8(x1>>8);
        LCD_WR_DATA8(x1);
        LCD_WR_DATA8(x2>>8);
        LCD_WR_DATA8(x2);

        LCD_WR_REG(0x2b);
        LCD_WR_DATA8(y1>>8);
        LCD_WR_DATA8(y1);
        LCD_WR_DATA8(y2>>8);
        LCD_WR_DATA8(y2);

        LCD_WR_REG(0x2C);                                                                                          
}

void LCD_DrawPoint(u16 x,u16 y)
{
        Address_set(x,y,x,y);//设置光标位置
        LCD_WR_DATA(POINT_COLOR);             
}          


static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U32 const GUI_UNI_PTR * p, int xsize) {
//  for (;xsize > 0; xsize--, x++, p++) {
//    _SetPixelIndex(pDevice, x, y, *p);
//  }

  Address_set(x,y,x,y);
  for (;xsize > 0; xsize--, x++, p++)
  {
    LCD_WR_DATA(POINT_COLOR);
  }  
}
请版主帮忙看下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-19 09:48:12 | 显示全部楼层
wangjun110 发表于 2018-4-19 09:41
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
        LCD_WR_REG ...

16bpp里面的

Address_set(x,y,x,y);
  for (;xsize > 0; xsize--, x++, p++)
  {
    LCD_WR_DATA(POINT_COLOR);
  }  

继续展开,最好可以直接寄存器的形式填进来。填好后,方便的话,我看下。
回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2018-4-19 09:56:06 | 显示全部楼层
本帖最后由 wangjun110 于 2018-4-19 10:53 编辑
eric2013 发表于 2018-4-19 09:48
16bpp里面的

Address_set(x,y,x,y);

void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
        LCD_WR_REG(0x2a);
        LCD_WR_DATA8(x1>>8);
        LCD_WR_DATA8(x1);
        LCD_WR_DATA8(x2>>8);
        LCD_WR_DATA8(x2);

        LCD_WR_REG(0x2b);
        LCD_WR_DATA8(y1>>8);
        LCD_WR_DATA8(y1);
        LCD_WR_DATA8(y2>>8);
        LCD_WR_DATA8(y2);

        LCD_WR_REG(0x2C);                                                                                          
}

void LCD_DrawPoint(u16 x,u16 y)
{
        Address_set(x,y,x,y);//设置光标位置
        LCD_WR_DATA(POINT_COLOR);            
}         

void LCD_WR_DATA(int da)
{
    OLED_DC_Set();
        LCD_Writ_Bus(da>>8);
    LCD_Writ_Bus(da);
}         

void LCD_Writ_Bus(char dat)   //串行数据写入
{        
        u8 i;                          
        for(i=0;i<8;i++)
        {                          
                OLED_SCLK_Clr();
                if(dat&0x80)
                   OLED_SDIN_Set();
                else
                   OLED_SDIN_Clr();
                OLED_SCLK_Set();
                dat<<=1;   
        }                        
}



static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U32 const GUI_UNI_PTR * p, int xsize) {
//  for (;xsize > 0; xsize--, x++, p++) {
//    _SetPixelIndex(pDevice, x, y, *p);
//  }

  Address_set(x,y,x,y);
  for (;xsize > 0; xsize--, x++, p++)
  {
       OLED_DC_Set();
        LCD_Writ_Bus(POINT_COLOR>>8);
        LCD_Writ_Bus(POINT_COLOR);
  }  
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-19 11:54:05 | 显示全部楼层
wangjun110 发表于 2018-4-19 09:56
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
        LCD ...

你这个还是模拟SPI接口刷? 的确效率低。

可以的话,直接在_DrawBitLine16BPP里面展开。
回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2018-4-19 12:33:44 | 显示全部楼层
eric2013 发表于 2018-4-19 11:54
你这个还是模拟SPI接口刷? 的确效率低。

可以的话,直接在_DrawBitLine16BPP里面展开。

我的屏只有240*240
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-20 03:08:31 | 显示全部楼层

屏不大,应该还可以再提升下。
回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2018-4-21 15:37:07 | 显示全部楼层
本帖最后由 wangjun110 于 2018-4-21 15:47 编辑
eric2013 发表于 2018-4-20 03:08
屏不大,应该还可以再提升下。

改用硬件SPI。速度只快一点点。帮忙检查下代码是否有问题。全部展开了。

                LCD_PIXELINDEX pixel;
                u8 TxData[2],Rxdata[2];


                LCD_WR_REG(0x2a);
                OLED_DC_Set();
                TxData[0]=x>>8;
                TxData[1]=x;
                HAL_SPI_TransmitReceive(&SPI1_Handler,TxData,Rxdata,2, 1000);

                LCD_WR_REG(0x2b);
                OLED_DC_Set();
                TxData[0]=y>>8;
                TxData[1]=y;
                HAL_SPI_TransmitReceive(&SPI1_Handler,TxData,Rxdata,2, 1000);               
                LCD_WR_REG(0x2C);
        
        
    for (;xsize > 0; xsize--,x++, p++)
    {
                        pixel = *p;
                        OLED_DC_Set();
                        TxData[0]=pixel>>8;
                        TxData[1]=pixel;
                        HAL_SPI_TransmitReceive(&SPI1_Handler,TxData,Rxdata,2, 1000);        
    }               

1.mp4

4.66 MB, 下载次数: 107

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-22 01:58:54 | 显示全部楼层
wangjun110 发表于 2018-4-21 15:37
改用硬件SPI。速度只快一点点。帮忙检查下代码是否有问题。全部展开了。

                LCD_PIXELIN ...

看来性能提升的空间不大了。
回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2018-4-22 11:55:29 | 显示全部楼层
本帖最后由 wangjun110 于 2018-4-22 12:01 编辑
eric2013 发表于 2018-4-22 01:58
看来性能提升的空间不大了。
库函数调用改为寄存器方式,提高了不少速度。
1.帮忙看下视频,鱼游动的时候背景不对。是不是读点函数没实现呢?
2.参考下DMA的传输方式好吗?(我用DMA传输的话可能是因为太快显示不正常了)
3.SPI方式的读点函数一直没成功过。
4.附件为视频

static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize)
{
//    for (;xsize > 0; xsize--, x++, p++)
//    {
//        _SetPixelIndex(pDevice, x, y, *p);
//                                //lcd_SetPixelIndex(x,y,*p);
//                                //LCD_SetCursor(x,y);
//                                //LCD_WR_DATA8(*p);
//                                //LCD_WR_DATA(*p);
//    }
        
                LCD_PIXELINDEX pixel;
                u8 TxData[256],Rxdata[256],i=0;

                OLED_DC_Clr();
                TxData[0]=0x2a;
                //HAL_SPI_TransmitReceive(&SPI1_Handler,TxData,Rxdata,1, 1000);
                SPI1_Write_N_Byte(TxData,1);

                OLED_DC_Set();
                TxData[0]=x>>8;
                TxData[1]=x;
                //HAL_SPI_TransmitReceive(&SPI1_Handler,TxData,Rxdata,2, 1000);
                SPI1_Write_N_Byte(TxData,2);

                OLED_DC_Clr();
                TxData[0]=0x2B;
                //HAL_SPI_TransmitReceive(&SPI1_Handler,TxData,Rxdata,1, 1000);
                SPI1_Write_N_Byte(TxData,1);
               
                OLED_DC_Set();
                TxData[0]=y>>8;
                TxData[1]=y;
                //HAL_SPI_TransmitReceive(&SPI1_Handler,TxData,Rxdata,2, 1000);        
                SPI1_Write_N_Byte(TxData,2);        
               
                OLED_DC_Clr();
                TxData[0]=0x2C;
                //HAL_SPI_TransmitReceive(&SPI1_Handler,TxData,Rxdata,1, 1000);
                SPI1_Write_N_Byte(TxData,1);

        
        
    for (;xsize > 0; xsize--,x++, p++)
    {
//                                pixel = *p;
//                                TxData=pixel>>8;
//                                TxData[i+1]=pixel;
//                                i++;
                        
                        pixel = *p;
                        OLED_DC_Set();
                        TxData[0]=pixel>>8;
                        TxData[1]=pixel;
                        SPI1_Write_N_Byte(TxData,2);
                        //HAL_SPI_TransmitReceive(&SPI1_Handler,TxData,Rxdata,2, 1000);        
                        //HAL_SPI_TransmitReceive_DMA(&SPI1_Handler, TxData, Rxdata, 2);
    }        
}

2.mp4

6.76 MB, 下载次数: 103

视频

回复

使用道具 举报

0

主题

159

回帖

159

积分

初级会员

积分
159
发表于 2018-6-14 16:28:41 | 显示全部楼层
正在使用ST7789 遇到不少问题,楼主能否帮忙发贴出来一下 其初始化部分代码啊·· 谢谢啦
回复

使用道具 举报

0

主题

159

回帖

159

积分

初级会员

积分
159
发表于 2018-6-15 16:32:30 | 显示全部楼层
搞定了,原来是FMSC的问题,不知道哪儿不对,用GPIO模拟就OK了,还是谢谢楼主``
回复

使用道具 举报

8

主题

18

回帖

120

积分

初级会员

积分
120
发表于 2018-8-8 17:05:27 | 显示全部楼层
laxsystem01 发表于 2018-6-15 16:32
搞定了,原来是FMSC的问题,不知道哪儿不对,用GPIO模拟就OK了,还是谢谢楼主``

大佬,初始化代码能给我发一下吗,我这边也在搞这个,供应商没有给代码,没从下手,可以的话发我qq邮箱啊,大佬  603374077@qq.com
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-8-8 17:39:04 | 显示全部楼层
韦冠 发表于 2018-8-8 17:05
大佬,初始化代码能给我发一下吗,我这边也在搞这个,供应商没有给代码,没从下手,可以的话发我qq邮箱啊 ...

GITHUB上检索就行:

https://github.com/search?utf8=%E2%9C%93&q=ST7789&type=
回复

使用道具 举报

8

主题

18

回帖

120

积分

初级会员

积分
120
发表于 2018-8-8 17:49:34 | 显示全部楼层
eric2013 发表于 2018-8-8 17:39
GITHUB上检索就行:

https://github.com/search?utf8=%E2%9C%93&q=ST7789&type=

嗯呢,谢谢大佬哈哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-31 19:09 , Processed in 0.243855 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表