移植U8g2到STM32中

1、首先先在官网下载U8g2包:https://github.com/olikraus/u8g2

点击这里下载。

也可以在Wiki中下载STM32F103示例包。

 

2、去掉多余的驱动文件,只保留u8x8_d_ssd1306_128x64_noname.c,多余带有u8x8_d_的文件删除。ssd1306是驱动芯片,128x64是分辨率。

首先打开u8g2包,拖出csrc,因为后面只用这个文件夹:

这是笔主裁剪过后的文件,就少了带u8x8_d_的文件。

最后把文件夹全部移植到MyLibrary(这个文件是自己定义的)文件夹下。

 

3、进入Keil5,创建一个U8g2文件夹,把刚刚裁剪的文件放入U8g2中,并且把MyLibrary路径给放入STM32路径中。

 

4、精简u8g2_d_setup.c,只需要保留u8g2_Setup_ssd1306_i2c_128x64_noname_f()这个函数,其中f代表最大缓存1024字节。

 

5、精简u8g2_d_memory.c,只需要保留u8g2_m_16_8_f(),因为我们只调用了u8g2_Setup_ssd1306_i2c_128x64_noname_f()这个函数,所以只保留他用到的函数即可。

 

6、之后编译,我出现了这个错误

把这个删掉即可。

 

7、初始化U8g2

uint8_t u8g2_gpio_and_delay_stm32(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
{
	switch(msg)
		{
		//Function which implements a delay, arg_int contains the amount of ms
			case U8X8_MSG_DELAY_MILLI:
				Delay_ms(arg_int);
			break;
		//Function which delays 10us
			case U8X8_MSG_DELAY_10MICRO:
				Delay_us(10);
			break;
		//Function which delays 100ns
			case U8X8_MSG_DELAY_100NANO:
				__NOP();
			break;
		//Function to define the logic level of the I2C_CLOCK line
			case U8X8_MSG_GPIO_I2C_CLOCK:
				if (arg_int) IIC_OLED_SCL_HIGH();
				else IIC_OLED_SCL_LOW();
			break;
		//Function to define the logic level of the I2C_SDA line
			case U8X8_MSG_GPIO_I2C_DATA:
				if (arg_int) IIC_OLED_SDA_HIGH();
				else IIC_OLED_SDA_LOW();
			break;
			
			default:
			return 0; //A message was received which is not implemented, return 0 to indicate an error
	}

	return 1; // command processed successfully.
}

/* 画U8g2 Log */
void draw(u8g2_t *u8g2)
{
	u8g2_ClearBuffer(u8g2); 
    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_4x6_tr);
    u8g2_DrawStr(u8g2, 1,54,"github.com/olikraus/u8g2");
	
	u8g2_SendBuffer(u8g2);
	Delay_ms(1000);
}

int main(void)
{
	
	u8g2_t u8g2;
	
	/* U8g2的初始化 */
	u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8g2_gpio_and_delay_stm32);
	u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
	u8g2_SetPowerSave(&u8g2, 0); // wake up display
	u8g2_ClearBuffer(&u8g2);
	Delay_ms(1000);  

    u8g2_DrawLine(&u8g2, 0, 0, 127, 63);		// 通过划线函数更改的缓存,写入缓存区后进行显示
	u8g2_DrawLine(&u8g2, 127, 0, 0, 63);
	u8g2_SendBuffer(&u8g2);

    draw(&u8g2);
}

这里有个小问题,如果遇到跟我一样的情况,修改这个选项即可。

posted @ 2023-06-15 16:10  烟儿公主  阅读(845)  评论(0编辑  收藏  举报