STM32移植u8g2玩转oled 用软件iic实现驱动oled

移植u8g2到stm

cpp 复制代码
int fputc(int ch,FILE *f)
{
	ITM_SendChar(ch);
	return (ch);
}

void delay_us(uint32_t time)
{
  uint32_t i=8*time;
  while(i--);
}


uint8_t STM32_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
  //printf("%s:msg = %d,arg_int = %d\r\n",__FUNCTION__,msg,arg_int);
  switch(msg)
  {
    case U8X8_MSG_DELAY_100NANO:		// delay arg_int * 100 nano seconds
      __NOP();
      break;
    case U8X8_MSG_DELAY_10MICRO:		// delay arg_int * 10 micro seconds
 	  for (uint16_t n = 0; n < 320; n++)
      {
         __NOP();
      }     
      break;
    case U8X8_MSG_DELAY_MILLI:			// delay arg_int * 1 milli second
      HAL_Delay(1);
      break;
    case U8X8_MSG_DELAY_I2C:		    // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
          //delay 5us
          delay_us(5);						// arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us

    case U8X8_MSG_GPIO_I2C_CLOCK:		// arg_int=0: Output low at I2C clock pin
      if(arg_int == 1) 
      {
        HAL_GPIO_WritePin(GPIOB, SCL2_Pin, GPIO_PIN_SET);
      }
      else if(arg_int == 0)
      {
        HAL_GPIO_WritePin(GPIOB, SCL2_Pin, GPIO_PIN_RESET);  
      }          
      break;							// arg_int=1: Input dir with pullup high for I2C clock pin
    case U8X8_MSG_GPIO_I2C_DATA:		// arg_int=0: Output low at I2C data pin
      //  printf("U8X8_MSG_GPIO_I2C_DATA:%d\r\n",arg_int);
      if(arg_int == 1) 
      {
        HAL_GPIO_WritePin(GPIOB, SDA2_Pin, GPIO_PIN_SET);
      }
      else if(arg_int == 0)
      {
        HAL_GPIO_WritePin(GPIOB, SDA2_Pin, GPIO_PIN_RESET);  
      }         
      break;							// arg_int=1: Input dir with pullup high for I2C data pin

    default:
      u8x8_SetGPIOResult(u8x8, 1);		// default return value
      break;
  }
  return 1;
}

这里是驱动iic

cpp 复制代码
	u8g2_t u8g2; // a structure which will contain all the data for one display
  u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, STM32_gpio_and_delay);  // init u8g2 structure
  u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
  u8g2_SetPowerSave(&u8g2, 0); // wake up display
  int t;

这里可以驱动u8g2 具体作用后续学习

下面就基本上可以驱动成功 最主要是修改后的u8g2的图

相关推荐
2301_764602232 小时前
stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)
stm32·单片机·嵌入式硬件
楼台的春风3 小时前
PWM(脉宽调制)技术详解:从基础到应用实践示例
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式
深圳市青牛科技实业有限公司 小芋圆4 小时前
芯谷D2761:为扬声器保护而生的音频限幅器
人工智能·科技·单片机·嵌入式硬件·机器人·音视频
海的预约6 小时前
51单片机-定时器中断
stm32·单片机·51单片机
Johnson Sheng9 小时前
STM32MP157A单片机移植Linux驱动
linux·stm32·单片机
Qingniu0110 小时前
芯谷D2038:高集成度六通道电子音量控制电路的音频解决方案
科技·单片机·嵌入式硬件·音视频·安防·智能插头
西城微科方案开发10 小时前
国产芯片汽车气压表pcba方案
单片机·嵌入式硬件
嵌入式学习菌11 小时前
1、FreeRTOS基础知识
单片机·嵌入式硬件
TianYaKe-天涯客11 小时前
利用AFE+MCU构建电池管理系统(BMS)
单片机·嵌入式硬件
Zevalin爱灰灰17 小时前
编程技巧(基于STM32)第一章 定时器实现非阻塞式程序——按键控制LED灯闪烁模式
stm32·单片机·嵌入式硬件