移植u8g2库的问题

文章详细介绍了如何将u8g2库移植到STM32F103C6T6微控制器上驱动SSD1306OLED屏幕的过程,包括拷贝库文件、精简源代码、编写GPIO和延迟函数、初始化函数以及在主函数中绘制图形。移植过程中需要注意字体文件的处理,避免编译错误。
摘要由CSDN通过智能技术生成

移植u8g2库

设备:

STM32F103C6T6、SSD1306

步骤

①拷贝库源代码到工程中

选择下面的文件,拷贝到工程文件中。我的显示设备是SSD1306,所以使用SSD1306相关的驱动,如果使用其他显示设备,需使用对应的驱动文件。

接着添加到把C文件添加到工程中

②精简u8g2_d_memory.c 和 u8g2_d_setup.c文件

u8g2_d_memory.c中存在大量的变量声明,必须留下一个合适的函数,然后把其他函数注释掉或者删除。

u8g2_d_setup.c中有大量的函数,也是需要选出合适的启动函数,把其他不用的函数注释掉或者删除

③编写u8x8_gpio_and_delay函数和初始化函数

该函数告诉库文件要操作的IO口和提供延时功能

uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch(msg)
    {
        case U8X8_MSG_DELAY_100NANO: //100ns
            __NOP();
            break;
        case U8X8_MSG_DELAY_10MICRO: //10us
            Delay_us(10);
            break;
        case U8X8_MSG_DELAY_MILLI: //1us
            Delay_us(1000);
            break;    
        case U8X8_MSG_DELAY_I2C: //5us : 100KHz 
            Delay_us(5);
            break;        
    case U8X8_MSG_GPIO_I2C_CLOCK :        
            if(arg_int == 1) GPIO_SetBits(GPIOB, GPIO_Pin_6);      
            else if(arg_int == 0) GPIO_ResetBits(GPIOB, GPIO_Pin_6);   
      break;
    case U8X8_MSG_GPIO_I2C_DATA:            
            if(arg_int == 1)  GPIO_SetBits(GPIOB, GPIO_Pin_7);    
            else if(arg_int == 0) GPIO_ResetBits(GPIOB, GPIO_Pin_7);           
      break;
    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;
}

顺便加一个IO口的初始化函数

void IIC_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
        
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);     

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;            
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);                
    GPIO_SetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7);                    
}

编写u8g2库初始化函数

void u8g2Init(u8g2_t *u8g2)
{
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay);  
    u8g2_InitDisplay(u8g2); 
    u8g2_SetPowerSave(u8g2, 0); 
    u8g2_ClearBuffer(u8g2);
}
④添加到主函数中

在这里就简单画几个正方形

int main(void)
{
    u8g2_t u8g2;
    
    IIC_Init();
    SysTick_Init();
    u8g2Init(&u8g2);
    while(1)
    {
       u8g2_SendBuffer(&u8g2);
       u8g2_DrawBox(&u8g2,0,0,20,20);
       u8g2_DrawBox(&u8g2,20,20,20,20);
       u8g2_SendBuffer(&u8g2);
       u8g2_DrawFrame(&u8g2,10,40,20,20);
       u8g2_SendBuffer(&u8g2);
        
        Delay_us(50000);Delay_us(50000);
        
  }
}
完成移植!

移植过程中的问题

如果出现了这个问题

可能是设置了字体,如果需要使用字体,必须要把存放字体的u8g2_fonts.c中的字体中挑出需要使用的保留下来,然后把不需要的注释掉或者删除,不然就会报上述的错误。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值