Stm32 如何缩短OLED显示屏的清除时间?

Stm32 如何缩短OLED显示屏的清除时间?,stm32,display,Stm32,Display,我用过STM32F0单片机 我尝试将stm32与OLED集成(SSD1306:128*64) 这是一种I2C通信。 问题是清除显示需要几秒钟(如2秒) 我怎样才能使它更快 我已附上问题部分的图像 有什么办法解决这个问题吗 我认为I2C_TransferHandling函数中存在问题,因为它在循环中反复调用。但不知道如何解决这个问题 void显示\u清除(void) { int i=0; 写入安装oled(SSD1306设置列地址); 写入指令oled(0); 写入装置oled(127); 写入

我用过STM32F0单片机

我尝试将stm32与OLED集成(SSD1306:128*64)

这是一种I2C通信。 问题是清除显示需要几秒钟(如2秒)

我怎样才能使它更快

我已附上问题部分的图像

有什么办法解决这个问题吗

我认为I2C_TransferHandling函数中存在问题,因为它在循环中反复调用。但不知道如何解决这个问题

void显示\u清除(void)
{
int i=0;
写入安装oled(SSD1306设置列地址);
写入指令oled(0);
写入装置oled(127);
写入安装oled(SSD1306设置页面地址);
写入指令oled(0);
写入装置oled(7);
I2C_传输处理(I2C1,(SlaveAddr
  • 消除循环中的延迟。每次迭代都要等待1ms。这样可以节省1秒以上的时间

  • 提高I2C速度。大多数显示器支持400k+I2C速度。发送1024字节至少需要0.8sek


  • 删除延迟会使代码陷入困境。我本来想提高i2c速度,但没有用。@JaisonThomas这意味着你的i2c代码不好。如果你需要延迟==不好的代码
    void Display_Clear(void)
     {
      int i = 0;
    
      Write_inst_oled(SSD1306_SET_COLUMN_ADDR);
      Write_inst_oled(0);
      Write_inst_oled(127);
    
      Write_inst_oled(SSD1306_SET_PAGE_ADDR);
      Write_inst_oled(0);
      Write_inst_oled(7);
    
      I2C_TransferHandling(I2C1,(SlaveAddr<<1),1, I2C_Reload_Mode, I2C_Generate_Start_Write);
      while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
      Display_SendByte(SSD1306_DATA_CONTINUE);
      delay_ms(1);
    
      for (i = 0; i < 1024; i++)  // Write Zeros to clear the display
      {
          I2C_TransferHandling(I2C1,0, 1, I2C_Reload_Mode, I2C_No_StartStop);
          while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
          Display_SendByte(0);
          delay_ms(1);
      }
        
      I2C_TransferHandling(I2C1, (SlaveAddr<<1), 0, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
        
      Write_inst_oled(SSD1306_SET_COLUMN_ADDR);
      Write_inst_oled(0);
      Write_inst_oled(127);
    
      Write_inst_oled(SSD1306_SET_PAGE_ADDR);
      Write_inst_oled(0);
      Write_inst_oled(7);
    
    }