移植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);
}
这里有个小问题,如果遇到跟我一样的情况,修改这个选项即可。
本文作者:烟儿公主
本文链接:https://www.cnblogs.com/toutiegongzhu/p/17481634.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?