移植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);
}
这里有个小问题,如果遇到跟我一样的情况,修改这个选项即可。