硬汉嵌入式论坛

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

[SPI/QSPI] ILI9488 SPI绘图改DMA

[复制链接]

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 2024-11-30 21:34:19 | 显示全部楼层 |阅读模式
因为产品要用到LCD,找了ILI9488测试了下,感觉SPI驱动被整的支离破碎,LCD_DC 还穿插拉高拉低,连个连续的数据都发送不了,这也太耗MCU了,请问兄弟们,有什么好办法没有

void ILI9488_Draw_Pixel(uint16_t X,uint16_t Y,uint16_t Colour)
{
        if((X >=LCD_WIDTH) || (Y >=LCD_HEIGHT)) return;        //OUT OF BOUNDS!

        //ADDRESS
        HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET);
        ILI9488_SPI_Send(0x2A);
        HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);

        //XDATA
        uint8_t Temp_Buffer[4] = {X>>8,X, (X+1)>>8, (X+1)};
        HAL_SPI_Transmit(HSPI_INSTANCE, Temp_Buffer, 4, 1);

        //ADDRESS
        HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET);
        ILI9488_SPI_Send(0x2B);
        HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);

        //YDATA
        uint8_t Temp_Buffer1[4] = {Y>>8,Y, (Y+1)>>8, (Y+1)};
        HAL_SPI_Transmit(HSPI_INSTANCE, Temp_Buffer1, 4, 1);
       
        //ADDRESS
        HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET);
        ILI9488_SPI_Send(0x2C);
        HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET);
       
        //COLOUR
        uint8_t Temp_Buffer2[3] = {(Colour>>8)&0xF8, (Colour>>3)&0xFC, Colour<<3};
        HAL_SPI_Transmit(HSPI_INSTANCE, Temp_Buffer2, 3, 1);
}

void ILI9488_Putchar(uint16_t x,uint16_t y,uint8_t num,uint8_t mode)
{
  uint8_t temp;
  uint8_t pos,t;
  uint16_t colortemp = POINT_COLOR;

  if(x > (LCD_WIDTH - 8) || y > LCD_HEIGHT - 16) return;
  num=num-' ';

  if(!mode)
  {
    for(pos = 0; pos < 16; pos++)
    {
      temp = asc2_1608[(uint16_t)num*16 + pos];
      for(t = 0; t < 8; t++)
      {
        if(temp&0x01)ILI9488_Draw_Pixel(x+t,y+pos,POINT_COLOR);
        else ILI9488_Draw_Pixel(x+t,y+pos,BACK_COLOR);
        temp>>=1;
      }
    }
  }
  else
  {
    for(pos=0;pos<16;pos++)
    {
      temp=asc2_1608[(uint16_t)num*16+pos];
      for(t=0;t<8;t++)
      {
        if(temp&0x01)ILI9488_Draw_Pixel(x+t,y+pos,POINT_COLOR);
        temp>>=1;
      }
    }
  }

  POINT_COLOR=colortemp;
}

回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2024-12-1 01:37:29 | 显示全部楼层
H7区,这不整个整帧缓存?DMA全屏刷新
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-1 09:14:36 | 显示全部楼层
参考我们H7-TOOL开源的APP V1,X工程,我们是采用的SPI DMA驱动的ST7789
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=95468
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2024-12-1 10:12:11 | 显示全部楼层
supertankhzt 发表于 2024-12-1 01:37
H7区,这不整个整帧缓存?DMA全屏刷新

如果是搞视频播放,整帧缓存还是可以考虑,可是如果我就是改写几个数字,要么重新在内存构建整帧,要么只改写所在区域,这也得花CPU啊,而且区域还不连续,也少不了拉低拉高DC,仍然很耗MCU
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2024-12-1 14:33:34 | 显示全部楼层
bomb 发表于 2024-12-1 10:12
如果是搞视频播放,整帧缓存还是可以考虑,可是如果我就是改写几个数字,要么重新在内存构建整帧,要么只 ...

用DMA全屏刷新可以少消耗一些CPU的(少拉低拉高DC),因为不用每次都设置写入地址,让它留在X=0,Y=0,直接启动写入命令就可以刷屏了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 03:35 , Processed in 0.040918 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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