你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f334_硬件IIC跑u8g2移植步骤

[复制链接]
LTLT 发布时间:2026-1-19 09:21

移植步骤

一:下载 u8g2 源码

https://github.com/olikraus/u8g2.git

二:精简源码

源码文件夹中,只用了 csrc 文件,cppsrc 貌似是针对 c++工程的,我这边就把 csrc 文件夹复制到自己的 keil 工程中

  • *由于使用了 ssd1315 的驱动,我这边就保留了u8x8_d_ssd1315_128x64_noname.c 文件其它的 u8x8d.c 都删除了**
  • 然后精简了u8g2_d_setup.c 和 u8g2_d_memory.c 中 U8g2 提供的驱动兼容
    • 在u8g2_d_setup.c 中,只需要保留 u8g2_Setup_ssd1315_i2c_128x64_noname_f() 这一个函数即可。注意,该文件内有几个命名类似的函数:命名中无 i2c 的是 SPI 接口驱动的函数,需要根据接口选择;以 1 结尾的函数代表使用的缓存空间为 128 字节,以 2 结尾的函数代表使用的缓存为 256字节,类似以 f 结尾的函数代表使用的缓存为 1024 字节
    • u8g2_d_memory.c 文件也是同理,它需要根据 u8g2_d_setup.c 中的调用情况决定用到哪些函数。由于 u8g2_Setup_ssd1315_i2c_128x64_noname_f() 函数只用到 u8g2_m_16_8_f() 这一个函数,因此只需要保留它,其余函数全部删除即可

三:添加源码到工程中

就是把精简后的 csrc 文件加入到 keil 工程中即可

四:编写u8g2_Setup_ssd1315_i2c_128x64_noname_f 所需要的回调函数

//us级别的延时 1-65535us
void mydelay_us(uint32_t us)
{
    __HAL_TIM_SET_AUTORELOAD(&htim6, us);
    __HAL_TIM_ENABLE(&htim6);

    while(!__HAL_TIM_GET_FLAG(&htim6, TIM_FLAG_UPDATE))//!__HAL_TIM_GET_FLAG(&htim6, TIM_FLAG_UPDATE)
    {
      // Wait for the timer to finish
    }
    __HAL_TIM_CLEAR_FLAG(&htim6, TIM_FLAG_UPDATE);

}

//延时 由于用硬件IIC所以只提供ms延时就好了
uint8_t u8x8_gpio_and_delay_hw(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {
    switch (msg) {
        case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds
            break;
        case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds
            break;
        case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second
            mydelay_us(1000);
            break;
        case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
            break;                    // 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
            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
            break;                    // arg_int=1: Input dir with pullup high for I2C data pin
        case U8X8_MSG_GPIO_MENU_SELECT:
            //u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);
            break;
        case U8X8_MSG_GPIO_MENU_NEXT:
            //u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);
            break;
        case U8X8_MSG_GPIO_MENU_PREV:
            //u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);
            break;
        case U8X8_MSG_GPIO_MENU_HOME:
            //u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);
            break;
        default:
            //u8x8_SetGPIOResult(u8x8, 1); // default return value
            break;
    }
    return 1;
}
unsigned char message_buffer[256];
unsigned int message_index = 0;
uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {
    uint8_t* data = (uint8_t*) arg_ptr;
    switch(msg) {
        case U8X8_MSG_BYTE_SEND:
        #if 1
            while( arg_int-- > 0 ) {
                message_buffer[message_index++] = *data++;
                if(message_buffer>= 255)
                {
                    message_index = 0;
                    return 0;//超出范围这里不大可能会进来,u8g2库貌似有限制
                }
                continue;
            }
            #endif

            break;
        case U8X8_MSG_BYTE_INIT:
        /* add your custom code to init i2c subsystem */

            break;
        case U8X8_MSG_BYTE_SET_DC:
        /* ignored for i2c */
            break;
        case U8X8_MSG_BYTE_START_TRANSFER:
            memset(message_buffer, 0, sizeof(message_buffer));
            message_index = 0;
            break;
        case U8X8_MSG_BYTE_END_TRANSFER:

            HAL_I2C_Master_Transmit(&hi2c1, 0x78, message_buffer, message_index, HAL_MAX_DELAY);
            break;
        default:
            return 0;
    }
    return 1;
}

编写 main 函数

int main(void)
{

  /* USER CODE BEGIN 1 */
    u8g2_t u8g2;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_USART1_UART_Init();
  MX_I2C1_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  memset(ch, 0, RXBUFFERSIZE);
  printf("hello\r\n");

  u8g2_Setup_ssd1315_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay_hw);
  u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
  HAL_Delay(100);
  u8g2_SetPowerSave(&u8g2, 0); // wake up display
  HAL_Delay(100);

  u8g2_FirstPage(&u8g2);
  do {
      u8g2_SetFontMode(&u8g2, 1);
      u8g2_SetFontDirection(&u8g2, 0);
      u8g2_SetFont(&u8g2, u8g2_font_inb24_mf);
      u8g2_DrawStr(&u8g2, 0, 20, "U");
      u8g2_SetFontDirection(&u8g2, 1);
      u8g2_SetFont(&u8g2, u8g2_font_inb30_mn);
      u8g2_DrawStr(&u8g2, 21, 8, "8");
      u8g2_SetFontDirection(&u8g2, 0);
      u8g2_SetFont(&u8g2, u8g2_font_inb24_mf);
      u8g2_DrawStr(&u8g2, 51, 30, "g");
      u8g2_DrawStr(&u8g2, 67, 30, "\xb2");
      u8g2_DrawHLine(&u8g2, 2, 35, 47);
      u8g2_DrawHLine(&u8g2, 3, 36, 47);
      u8g2_DrawVLine(&u8g2, 45, 32, 12);
      u8g2_DrawVLine(&u8g2, 46, 33, 12);
      u8g2_SetFont(&u8g2, u8g2_font_5x8_tr);
      u8g2_DrawStr(&u8g2, 1, 54, "github.com/olikraus/u8g2");
  } while (u8g2_NextPage(&u8g2));

  while (1)
  {

    //查看是否跑飞
    mydelay_us(2000);
    HAL_GPIO_TogglePin(TEST_LOG_GPIO_Port, TEST_LOG_Pin);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

第五步编译和运行

1.jpg

收藏 评论0 发布时间:2026-1-19 09:21

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版