wanli 发表于 2026-6-1 11:15:37

求助SPI-TFT刷屏对比速度比较慢

为什么STC32G144K246和STM32F103VET6对比 视频左边2.0寸屏是STC的 右边是STM32 2.4寸屏


/****************用户定义宏****************/

#define SEL_HPLL1       1
#define SEL_HPLL2       2
#define HPLL_SEL      SEL_HPLL2

#if(HPLL_SEL==SEL_HPLL1)
    #define MAIN_Fosc   120000000L //定义主时钟(超频)
#else
    #define MAIN_Fosc   90000000L//定义主时钟
#endif

/**********************************************************/


//========================================================================
// 函数: void HPLL_config(void)
// 描述: PLL时钟配置函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2025-11-01
// 备注:
//========================================================================
void HPLL_config(void)
{
#if(HPLL_SEL==SEL_HPLL2)
    WTST = 2;         //通过WTST增加等待时钟控制Flash读取速度在33MHz以内, 主时钟:360MHz/2/2=90MHz, 读Flash速度:90MHz/(1+2)=30MHz

    HPLLCR |= 0x80;   //使能HPLL(高速外设默认使用HPLL时钟,切换到HPLL2前要先使能HPLL,切换完再关闭HPLL)

                        //首先需要将HIRC主频调节到48MHz
    HPLL2CR &= ~0x10;   //选择HPLL2输入时钟源为HIRC
//    HPLL2CR |= 0x10;    //选择HPLL2输入时钟源为IRCM
    HPLL2PDIV = 8;      //设置HPLL2输入时钟预分频为8(HPLL输入频率必须为6MHz)
//    HPLL2CR |= 0x00;    //HPLL2=6MHz*52=312MHz
//    HPLL2CR |= 0x01;    //HPLL2=6MHz*54=324MHz
//    HPLL2CR |= 0x02;    //HPLL2=6MHz*56=336MHz
//    HPLL2CR |= 0x03;    //HPLL2=6MHz*58=348MHz
    HPLL2CR |= 0x04;    //HPLL2=6MHz*60=360MHz
//    HPLL2CR |= 0x05;    //HPLL2=6MHz*62=372MHz
//    HPLL2CR |= 0x06;    //HPLL2=6MHz*64=384MHz
//    HPLL2CR |= 0x07;    //HPLL2=6MHz*66=396MHz
//    HPLL2CR |= 0x08;    //HPLL2=6MHz*68=408MHz
//    HPLL2CR |= 0x09;    //HPLL2=6MHz*70=420MHz
//    HPLL2CR |= 0x0a;    //HPLL2=6MHz*72=432MHz
//    HPLL2CR |= 0x0b;    //HPLL2=6MHz*74=444MHz
//    HPLL2CR |= 0x0c;    //HPLL2=6MHz*76=456MHz
//    HPLL2CR |= 0x0d;    //HPLL2=6MHz*78=468MHz
//    HPLL2CR |= 0x0e;    //HPLL2=6MHz*80=480MHz
//    HPLL2CR |= 0x0f;    //HPLL2=6MHz*82=492MHz
    HPLL2CR |= 0x20;    //高速外设时钟选择 HPLL2/2
    HPLL2CR |= 0x80;    //使能HPLL2

    HPLLCR &= ~0x80;    //关闭HPLL(高速外设默认使用HPLL时钟,切换到HPLL2前要先使能HPLL,切换完再关闭HPLL)
   
    CLKDIV = 2;         //系统时钟 = 主时钟源/2 = HPLL2/2/2 = 90MHz
    CLKSEL = 0x08;      //选择HPLL2/2作为主时钟源

#else
    WTST = 3;         //通过WTST增加等待时钟控制Flash读取速度在33MHz以内, 主时钟:480MHz/2/2=120MHz, 读Flash速度:120MHz/(1+3)=30MHz
                        //首先需要将HIRC主频调节到48MHz
    HPLLCR &= ~0x10;    //选择HPLL输入时钟源为HIRC
//    HPLLCR |= 0x10;   //选择HPLL输入时钟源为IRCM
    HPLLPDIV = 8;       //设置HPLL输入时钟预分频为8(HPLL输入频率必须为6MHz)
//    HPLLCR |= 0x00;   //HPLL=6MHz*52=312MHz
//    HPLLCR |= 0x01;   //HPLL=6MHz*54=324MHz
//    HPLLCR |= 0x02;   //HPLL=6MHz*56=336MHz
//    HPLLCR |= 0x03;   //HPLL=6MHz*58=348MHz
//    HPLLCR |= 0x04;   //HPLL=6MHz*60=360MHz
//    HPLLCR |= 0x05;   //HPLL=6MHz*62=372MHz
//    HPLLCR |= 0x06;   //HPLL=6MHz*64=384MHz
//    HPLLCR |= 0x07;   //HPLL=6MHz*66=396MHz
//    HPLLCR |= 0x08;   //HPLL=6MHz*68=408MHz
//    HPLLCR |= 0x09;   //HPLL=6MHz*70=420MHz
//    HPLLCR |= 0x0a;   //HPLL=6MHz*72=432MHz
//    HPLLCR |= 0x0b;   //HPLL=6MHz*74=444MHz
//    HPLLCR |= 0x0c;   //HPLL=6MHz*76=456MHz
//    HPLLCR |= 0x0d;   //HPLL=6MHz*78=468MHz
    HPLLCR |= 0x0e;   //HPLL=6MHz*80=480MHz
//    HPLLCR |= 0x0f;   //HPLL=6MHz*82=492MHz
    HPLL2CR &= ~0x60;   //高速外设时钟选择 HPLL/2
    HPLLCR |= 0x80;   //使能HPLL

    CLKDIV = 2;         //系统时钟=主时钟源/2 = HPLL/2/2 = 120MHz
    CLKSEL = 0x04;      //选择HPLL/2作为主时钟源
#endif

//    P5M0 |= 0x10; P5M1 &= ~0x10;//设置P5.4口为推挽输出
//    P5SR &= ~0x10;            //设置P5.4口为快速模式
//    HIRCCR |= 0x10;             //输出系统时钟
//    MCLKOCR = 10;               //系统时钟 10 分频到P5.4
}



/******************************************************************************
      函数说明:LCD串行数据写入函数
      入口数据:dat要写入的串行数据
      返回值:无
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{       
    // 清除标志
    SPSTAT = 0xC0;
   
    // 发送数据
    SPDAT = dat;
   
    // 等待发送完成
    while (!(SPSTAT & 0x80)); // 等待 SPIF 为 1
   
    // 清除标志
    SPSTAT = 0xC0;
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
        LCD_CS = 0;
        LCD_Writ_Bus(dat);
        LCD_CS = 1;
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
        LCD_CS = 0;
        LCD_Writ_Bus((u8)(dat>>8));
        LCD_Writ_Bus((u8)dat);
        LCD_CS = 1;
}


/******************************************************************************
      函数说明:LCD初始化函数
      入口数据:无
      返回值:无
******************************************************************************/
void LCD_Init(void)
{
        SPI_Init();        //(SPI_io, SPI_speed), 参数:         SPI_io: 切换IO(SS MOSI MISO SCLK), 0: 切换到P1.4 P1.5 P1.6 P1.7,1: 切换到P2.4 P2.5 P2.6 P2.7, 2: 切换到P4.0 P4.1 P4.2 P4.3,3: 切换到P3.5 P3.4 P3.3 P3.2,

        LCD_RES = 0;
        delay_ms(50);
        LCD_RES = 1;
        delay_ms(50);
    LCD_BLK=1;
    delay_ms(100);
        //************* Start Initial Sequence **********//
        LCD_WR_REG(0x11);         //Sleep out 退出睡眠
        delay_ms(120);                //Delay 120ms
        //************* Start Initial Sequence **********//
    LCD_WR_REG(0x36);   
    if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
    else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
    else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
    else LCD_WR_DATA8(0xA0);

        LCD_WR_REG(0x3A);                       
        LCD_WR_DATA8(0x05);

        LCD_WR_REG(0xB2);                       
        LCD_WR_DATA8(0x0C);
        LCD_WR_DATA8(0x0C);
        LCD_WR_DATA8(0x00);
        LCD_WR_DATA8(0x33);
        LCD_WR_DATA8(0x33);                        

        LCD_WR_REG(0xB7);                       
        LCD_WR_DATA8(0x35);

        LCD_WR_REG(0xBB);                       
        LCD_WR_DATA8(0x32); //Vcom=1.35V
                                       
        LCD_WR_REG(0xC2);
        LCD_WR_DATA8(0x01);

        LCD_WR_REG(0xC3);                       
        LCD_WR_DATA8(0x15); //GVDD=4.8V颜色深度
                               
        LCD_WR_REG(0xC4);                       
        LCD_WR_DATA8(0x20); //VDV, 0x20:0v

        LCD_WR_REG(0xC6);                       
        LCD_WR_DATA8(0x0F); //0x0F:60Hz             

        LCD_WR_REG(0xD0);                       
        LCD_WR_DATA8(0xA4);
        LCD_WR_DATA8(0xA1);

        LCD_WR_REG(0xE0);
        LCD_WR_DATA8(0xD0);   
        LCD_WR_DATA8(0x08);   
        LCD_WR_DATA8(0x0E);   
        LCD_WR_DATA8(0x09);   
        LCD_WR_DATA8(0x09);   
        LCD_WR_DATA8(0x05);   
        LCD_WR_DATA8(0x31);   
        LCD_WR_DATA8(0x33);   
        LCD_WR_DATA8(0x48);   
        LCD_WR_DATA8(0x17);   
        LCD_WR_DATA8(0x14);   
        LCD_WR_DATA8(0x15);   
        LCD_WR_DATA8(0x31);   
        LCD_WR_DATA8(0x34);   

        LCD_WR_REG(0xE1);   
        LCD_WR_DATA8(0xD0);   
        LCD_WR_DATA8(0x08);   
        LCD_WR_DATA8(0x0E);   
        LCD_WR_DATA8(0x09);   
        LCD_WR_DATA8(0x09);   
        LCD_WR_DATA8(0x15);   
        LCD_WR_DATA8(0x31);   
        LCD_WR_DATA8(0x33);   
        LCD_WR_DATA8(0x48);   
        LCD_WR_DATA8(0x17);   
        LCD_WR_DATA8(0x14);   
        LCD_WR_DATA8(0x15);   
        LCD_WR_DATA8(0x31);   
        LCD_WR_DATA8(0x34);
        LCD_WR_REG(0x21);

        LCD_WR_REG(0x29);

}

神农鼎 发表于 2026-6-2 13:10:41

可让 STC32G144K246的 I/O的速度工作在 45MHz 以上,用 DMA-P2P刷屏



ercircle 发表于 2026-6-2 13:28:20


参考此贴效果:提升pll倍频 & 提升spi速度
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=20285&pid=188012



zxcv1973 发表于 2026-6-2 18:19:08

看这速度,STM32F103VET6是不是使用DMA刷的
页: [1]
查看完整版本: 求助SPI-TFT刷屏对比速度比较慢