在cubeide中移植u8g2到STM32的流水账

发布时间 2023-05-02 11:04:58作者: 不打鱼光晒网

首先在github克隆项目源码到本地硬盘

复制该文件夹到工程的core目录 并改个名字,方便自己明天还能记得起来这是干毛用的文件夹,哈哈哈哈

这个文件夹里边有121个文件 包含了很多芯片的驱动,也就是名字中有_d_和芯片型号的文件

先不管这些 直接打开

u8g2_d_setup.c

 

搜索关键字,比如屏幕驱动用的SSD1306,那就定位到SSD1306

这些就是屏幕的初始化函数

看好了屏幕接口和分辨率选一个对的

比如我这里选个另类的 128*32吧,反正12864网上教程都写烂了

 

 可以先用一个顺手的工具找到函数名并且折叠起来看

 

 然后花了半天时间,终于找到 SSD1306 128*32的初始化函数了

 遇到不懂的,本篇教程没有的东西,那就自己查一下,反正我又不知道你会啥你不会啥子

比如

 winstar和univision

反正我只找到了winstar是华菱光电,univision没找到,估计是个外国厂家吧

反正现在也不知道屏啥情况,只知道能用,是好的,随便选一个

u8g2_Setup_ssd1306_i2c_128x32_winstar_f

 

在main.c中引入头文件

#include "u8g2.h"

 声明结构体

    u8g2_t u8g2;

 

把初始化函数贴到main。c的main函数

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

 然后再把参数修改一下 去掉声明

 第一个参数&u8g2

第二个参数U8G2_R0

第三个参数u8x8_byte_4wire_hw_spi

第四个参数u8x8_gpio_and_delay_stm32HwspiSoftcs

第一个就是刚才声明的结构体

第二个是屏幕旋转角度,暂且选择不旋转,不合适一会再修改就好了

第三个需要自己编写的一个数据传输方式

第四个是GPIO和延时啥的,u8g2需要调用这个函数实现一些功能

弄完是这样的

 然后把第三个参数的函数找地方写一下,比如这个位置,丢在main.c里边就行了,先跑通再说模块化问题

 

 

uint8_t u8x8_byte_4wire_hw_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch (msg)
    {
    case U8X8_MSG_BYTE_SEND:
         HAL_SPI_Transmit(&hspi1,(uint8_t *)arg_ptr,arg_int,20);//SPI
        break;

    case U8X8_MSG_BYTE_START_TRANSFER:
        u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_enable_level);
        u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->post_chip_enable_wait_ns, NULL);
        break;
    case U8X8_MSG_BYTE_END_TRANSFER:
        u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->pre_chip_disable_wait_ns, NULL);
        u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_disable_level);
        break;
    default:
        return 0;
    }
    return 1;
}

 

然后

uint8_t u8x8_gpio_and_delay_stm32HwspiSoftcs(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_GPIO_AND_DELAY_INIT: /*delay和GPIO的初始化,在main中已经初始化完成�?????????*/
        break;
    case U8X8_MSG_DELAY_MILLI: //hal delay
        HAL_Delay(arg_int);
        break;
        //software cs
    case U8X8_MSG_GPIO_CS:

        HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, arg_int);
        break;
    case U8X8_MSG_GPIO_DC:

if (arg_int)

LCD_DC_H;//
else
LCD_DC_L;
break;

break;
    case U8X8_MSG_GPIO_RESET:
        break;
    }
    return 1;
}

 

全文完