移植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中的字体中挑出需要使用的保留下来,然后把不需要的注释掉或者删除,不然就会报上述的错误。
文章详细介绍了如何将u8g2库移植到STM32F103C6T6微控制器上驱动SSD1306OLED屏幕的过程,包括拷贝库文件、精简源代码、编写GPIO和延迟函数、初始化函数以及在主函数中绘制图形。移植过程中需要注意字体文件的处理,避免编译错误。

2723

被折叠的 条评论
为什么被折叠?



