30秒学会U8G2库移植到STM32平台上

本文详细介绍了如何在STM32项目中集成开源库,针对SSD1306OLED显示屏进行驱动配置。首先,将所需文件添加到Kile工程,然后修改u8g2_setup.c和u8g2_d_memory.c文件,保留对应驱动函数。接着,自定义SPI接口的gpio和延迟函数,最后提供初始化代码示例,显示简单的图形功能。
摘要由CSDN通过智能技术生成

开源下载地址

1.找到src文件夹,把里面的所有文件除了u8x8_d_xxx.c结尾的添加到kile工程里面,并包含头文件。然后根据自己的驱动添加u8x8_d_对应自己的驱动.c

2.修改两个。c文件(这里以0.96寸oled驱动为ssd1306 128*64为例子进行说明)

1)u8g2_setup.c  屏蔽里面所有文件,只留对应文件(ssd1306只留这个函数),其余屏蔽。

 void u8g2_Setup_ssd1306_128x64_noname_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)

2)u8g2_d_memory.c 屏蔽里面所有文件,只留对应文件(ssd1306只留这个函数),其余屏蔽。

uint8_t *u8g2_m_16_8_f(uint8_t *page_cnt)

3. 修改对应的底层

1)如果你是使用的spi。需要重新是实现下这个函数:根据自己的实际使用的管脚来修改

uint8_t u8x8_stm32_gpio_and_delay(U8X8_UNUSED u8x8_t *u8x8,
                                  U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int,
                                  U8X8_UNUSED void *arg_ptr)
{
    switch(msg)
    {
        case U8X8_MSG_DELAY_100NANO:		// delay arg_int * 100 nano seconds
            __NOP();
            break;

        case U8X8_MSG_DELAY_10MICRO:		// delay arg_int * 10 micro seconds
            for (uint16_t n = 0; n < 320; n++)
            {
                __NOP();
            }

            break;

        case U8X8_MSG_DELAY_MILLI:			                // delay arg_int * 1 milli second
            delay_ms(1);
            break;

        case U8X8_MSG_DELAY_I2C:				            // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
            delay_us(5);
            break;							                // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
/*IIC接口*/
        case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin
            if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
               // HAL_GPIO_WritePin(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_PIN_SET);
            else if(arg_int == 0)
               // HAL_GPIO_WritePin(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_PIN_RESET);

            break;                    // arg_int=1: Input dir with pullup high for I2C clock pin

        case U8X8_MSG_GPIO_I2C_DATA:  // arg_int=0: Output low at I2C data pin
            if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
                //HAL_GPIO_WritePin(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_PIN_SET);
            else if(arg_int == 0)
               // HAL_GPIO_WritePin(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_PIN_RESET);

            break;                    // arg_int=1: Input dir with pullup high for I2C data pin
/*SPI接口*/
        case U8X8_MSG_GPIO_SPI_DATA:
            if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
                HAL_GPIO_WritePin(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_PIN_SET);
            else if(arg_int == 0)
                HAL_GPIO_WritePin(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_PIN_RESET);

            break;

        case U8X8_MSG_GPIO_SPI_CLOCK:
            if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
                HAL_GPIO_WritePin(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_PIN_SET);
            else if(arg_int == 0)
                HAL_GPIO_WritePin(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_PIN_RESET);

            break;

        case U8X8_MSG_GPIO_CS:
            if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
                HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET);
            else if(arg_int == 0)
                HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);

            break;

        case U8X8_MSG_GPIO_DC:
            if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
                HAL_GPIO_WritePin(LCD_D_C_GPIO_Port, LCD_D_C_Pin, GPIO_PIN_SET);
            else if(arg_int == 0)
                HAL_GPIO_WritePin(LCD_D_C_GPIO_Port, LCD_D_C_Pin, GPIO_PIN_RESET);

            break;

        case U8X8_MSG_GPIO_RESET:
            if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pin
                HAL_GPIO_WritePin(LCD_RESET_GPIO_Port, LCD_RESET_Pin, GPIO_PIN_SET);
            else if(arg_int == 0)
                HAL_GPIO_WritePin(LCD_RESET_GPIO_Port, LCD_RESET_Pin, GPIO_PIN_RESET);

            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;
}

4.初始化代码

	u8g2_t u8g2; 

	u8g2_Setup_ssd1306_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_stm32_gpio_and_delay);  
	u8g2_InitDisplay(&u8g2);
	u8g2_SetPowerSave(&u8g2,0);
	u8g2_ClearBuffer(u8g2);

	while(1) 
	{
	
		//delay_ms(100);
		u8g2_ClearBuffer(&u8g2); 
		if(++t >= 32) t = 1;
		u8g2_DrawCircle(&u8g2,64,32,t,U8G2_DRAW_ALL);
		u8g2_DrawCircle(&u8g2,32,32,t,U8G2_DRAW_ALL);
		u8g2_DrawCircle(&u8g2,96,32,t,U8G2_DRAW_ALL);
		u8g2_SendBuffer(&u8g2);  
	}

5.成果展示

您好!关于u8g2STM32上的使用,以下是一般的步骤: 1. 首先,确保您的STM32开发板已连接到您的计算机,并且您已经安装了适当的开发环境(如Keil、STM32CubeIDE等)。 2. 下载u8g2的最新版本,可以从u8g2官方网站(https://github.com/olikraus/u8g2)上找到源代码。 3. 将下载的文件解压缩,并将u8g2文件夹复制到您的项目目录中。 4. 打开您的开发环境,并创建一个新的STM32项目。 5. 在您的项目中包含u8g2的头文件。根据您的开发环境不同,可能有不同的方法。例如,在Keil中,您可以通过右键单击项目->Options for Target->C/C++选项卡->Include Paths and Symbols来添加路径。 6. 在您的代码中,使用合适的接口初始化u8g2。根据您使用的显示设备类型(如OLED、LCD等),选择适当的初始化函数。例如,如果您使用I2C接口的OLED显示屏,可以使用以下代码进行初始化: ```c #include "u8g2.h" u8g2_t u8g2; void u8g2_init(void) { u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay_stm32cube_hal); u8x8_SetI2CAddress(&u8g2.u8x8, 0x78); u8g2_InitDisplay(&u8g2); u8g2_SetPowerSave(&u8g2, 0); } ``` 7. 使用u8g2提供的函数来控制显示设备。例如,您可以使用以下代码在屏幕上绘制文本: ```c u8g2_DrawStr(&u8g2, 0, 10, "Hello, World!"); u8g2_SendBuffer(&u8g2); ``` 这是一个简单的示例,演示了如何在STM32上使用u8g2。您可以根据自己的需求使用其他u8g2的功能和函数来绘制图形、显示图像等。 希望这可以帮助到您!如有其他问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在嵌入式里摸爬滚打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值