STM32 移植 U8g2

硬件配置

  • CPU是STM32F051
  • 屏幕是0.96的SSD1306
  • CPU-屏的接口是 硬件4线SPI

硬件接口

HW_Cfg.png

软件配置

  • IDE是MDK5.24,搭配Vs code

移植

  1. 先用CubeMX生成初始化代码,我没有用HAL,用的LL更加适合单片机开发者的思维模式


    MX_Cfg.png

    配置模式不作细述。

  2. 然后去这里下载U8g2
  3. 下载完成后,解压,进入目录复制csrc,本次移植不考虑C++
  4. KEIL里面加入csrc的文件,并加入包含路径,加入文件是要注意一个u8x8_d_芯片名.c,只要加入自己需要使用的即可,其他的没有必要加入
  5. 重写U8g2需要的两个回调函数,根据接口不一样回调的名字也不一样。这个需要看一下github的介绍,本例是SPI
uint8_t u8x8_byte_4wire_hw_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int,
    void *arg_ptr)
{
    uint8_t *data = NULL;
  switch (msg)
  {
  case U8X8_MSG_BYTE_SEND:
        data = (uint8_t*)arg_ptr;
        do
        {
            while(LL_SPI_IsActiveFlag_TXE(SPI1) == RESET);
            LL_SPI_TransmitData8(SPI1, *(data++));
            while(LL_SPI_IsActiveFlag_BSY(SPI1) == SET){}
            arg_int--;
        }while(arg_int > 0);
    break;
  case U8X8_MSG_BYTE_INIT:
    break;
  case U8X8_MSG_BYTE_SET_DC:
        GPIO_WriteBit(OLED_DC_GPIO_Port, OLED_DC_Pin, arg_int);
    break;
  case U8X8_MSG_BYTE_START_TRANSFER:
    break;
  case U8X8_MSG_BYTE_END_TRANSFER:
    break;
  default:
    return 0;
  }
  return 1;
}

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_GPIO_AND_DELAY_INIT:
//    HAL_Delay(1);
        LL_mDelay(1);
    break;
  case U8X8_MSG_DELAY_MILLI:
    LL_mDelay(arg_int);
    break;
    case U8X8_MSG_GPIO_CS:
        GPIO_WriteBit(OLED_CS_GPIO_Port, OLED_CS_Pin, arg_int);
  case U8X8_MSG_GPIO_DC:
        
//    HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, arg_int);
        GPIO_WriteBit(OLED_DC_GPIO_Port, OLED_DC_Pin, arg_int);
    break;
  case U8X8_MSG_GPIO_RESET:
//    HAL_GPIO_WritePin(OLED_RES_GPIO_Port, OLED_RES_Pin, arg_int);
        GPIO_WriteBit(OLED_RST_GPIO_Port, OLED_RST_Pin, arg_int);
    break;
  }
  return 1;
}

在使用LL库的SPI之前需要手动Enable SPI,库生成的代码有BUG,在配置完成后没有对SPI进行Enable

  1. 目前工程应该已经可以进行编译了,不过会有很多错误接下来对错误进行修正
  • 首先要对u8_setup.c里面没有使用的函数进行注释,否则会调用大量的缓存,导致内存不够
  • 内存不够:先执行上一步再执行本步不然会报大量的未定义错误,内存不够是因为U8g2支持了大量的屏幕有很多不同形式的缓冲区,只需要留下自己要用的一个即可其余的全部可以删除掉,具体缓冲区定义在U8g2_d_memory.c里面,调用是在u8x8_d_etup.c,快速的修改方法是注释掉u8g2_d_memory.c里面所有的缓冲区编译一下看哪个缓冲区报未定义,再回去取消那个缓冲存的注释。
  1. 然后在函数里对外设和u8g2进行初始化
static u8g2_t u8g2; //首先定义u8g2的对象
//对u8g2和屏幕进行初始化
u8g2_Setup_ssd1306_128x64_noname_1(&u8g2, U8G2_R0, u8x8_byte_4wire_hw_spi, u8x8_stm32_gpio_and_delay); 
u8g2_InitDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2, 0);

定义一个显示用的测试函数

void draw(u8g2_t *u8g2)
{
    u8g2_SetFontMode(u8g2, 1);  // Transparent
    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");
}

然后在主循环中进行调用

  while (1)
  {
    /* USER CODE END WHILE */
    u8g2_FirstPage(&u8g2);
    do
    {
            draw(&u8g2);
    } while (u8g2_NextPage(&u8g2));
    /* USER CODE BEGIN 3 */
  }

至此,移植就全部完成了,不是经常写文章,没有什么排版,主要是提供一个思路给各位

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容