stm32移植U8G2图像库指南

  • U8G2图形库介绍
  • 移植准备工作
  • 开始移植文件
  • 修改keil配置
  • 修改U8G2源码
    • u8g2_d_setup.c修改
    • u8g2_d_memory.c修改
    • 注意
  • U8G2接口程序
  • 最终效果

U8G2图形库介绍

U8g2:用于单色显示的库,版本 2

U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,包括以下控制器:SSD1305, SSD1306, SSD1309, SSD1316, SSD1320, SSD1322, SSD1325, SSD1327, SSD1329, SSD1606, SSD1607,895, SH11607,84D1607,SH11607,84D1607,94D1607,94D1607,84D1607,4D1607,4D1607,4D1607,84D1807 ,PCF8812,HX1230,UC1601,UC1604,UC1608,UC1610,UC1611,UC1617,UC1638,UC1701,ST7511,ST7528,ST7565,ST7567,ST7571,ST7586,ST7588,ST75256,ST75320,NT7534,ST7920,IST3020,IST7920,LD7032,KS0108 、KS0713、HD44102、T7932、SED1520、SBN1661、IL3820、MAX7219(完整列表见此处)。

Arduino 库 U8g2 可以从 Arduino IDE 的库管理器安装。U8g2 还包括 U8x8 库:

U8g2:

  • 包括所有图形程序(线/框/圆绘制)。
  • 支持多种字体。(几乎)对字体高度没有限制。
  • 需要微控制器中的一些内存来呈现显示。

U8x8:

  • 仅文本输出(字符)设备。
  • 仅允许适合 8x8 像素网格的字体。
  • 直接写入显示器。微控制器中不需要缓冲器。

移植准备工作

移植U8G2图像库需要准备好,U8G2的源码
U8g2下载地址: https://github.com/olikraus/u8g2
准备一份KEIL工程,我这里使用了一份我自己写的时间片轮询程序(唯一的要求,带屏幕的初始化就行)

开始移植文件

U8G2源码中,这个csrc是c语言版的源码,直接把他复制到keil的工程里。

我将csrc文件复制到keil工程中的,HARDWARE文件夹内,改名为OLED_U8G2。(名字和位置,可以根据实际情况更改)

修改keil配置

添加一个分组,把U8G2的文件全部添加进去

但是,里面有好多u8g2_d_xxx.c格式的文件,里面有三个文件的必要的。其中一个需要根据你OLED屏幕的驱动芯片和像素(如这里选择的文件,就是ssd1306,这个驱动芯片。128*64的像素)

还有这两个文件也是必要的,除了这三个文件以后的u8g2_d_xxx的文件全部删除。

这四个文件也删除了

然后,添加一下环境配置中的c/c++,让keil可以找到这些文件。

修改U8G2源码

重点就是修改,u8g2_d_memory.c 与 u8g2_d_setup.c 这两个文件

u8g2_d_setup.c修改

快捷键 ctrl+A 全选以后,直接把全部文件注释了

然后,取消注释头文件,并且找到你屏幕驱动对应的那个函数取消注释

这里找到了,跟我ssd1306 128*64对应的函数,取消注释。最后一个英文字母f代表的是内存。就是一次传输多少字节的数据。f为1024个字节,2为256个字节,1为128个字节。这个主要是根据单片机的性能来选择的。比如是stmf103c8t6这种小容量的芯片,就选择后缀为1的函数。

u8g2_d_memory.c修改

同样的操作,ctrl+A把全部文件注释了以后,取消对头文件的注释。

然后,在u8g2_d_memory.c文件中,查找下图红框框里的函数,把对应的函数,取消注释。

取消注释

注意

  • 上面的所有操作,需要根据屏幕的驱动芯片
  • f 代表的是一次刷新屏幕的字节数(根据芯片选择 f 、 2 、1)

U8G2接口程序

u8g2_Setup_ssd1306_128x64_noname_f就是刚刚选择的屏幕驱动函数。
下面两句就是开打屏幕的显示。

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

重点是u8x8_stm32_gpio_and_delay这个函数,这个回调函数,需要由我们使用者来写。他主要就是给U8G2提供的延时函数和通信接口。
这里使用的是4线的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 secondsfor (uint16_t n = 0; n < 320; n++){__NOP();}break;case U8X8_MSG_DELAY_MILLI:                           // delay arg_int * 1 milli seconddelay_ms(1);break;case U8X8_MSG_DELAY_I2C:                         // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHzdelay_us(5);break;                                          // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25uscase U8X8_MSG_GPIO_SPI_DATA:if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pinGPIO_SetBits(GPIOA,GPIO_Pin_1);else if(arg_int == 0)GPIO_ResetBits(GPIOA,GPIO_Pin_1);break;case U8X8_MSG_GPIO_SPI_CLOCK:if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pinGPIO_SetBits(GPIOA,GPIO_Pin_0);else if(arg_int == 0)GPIO_ResetBits(GPIOA,GPIO_Pin_0);break;case U8X8_MSG_GPIO_CS:if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pinGPIO_SetBits(GPIOA,GPIO_Pin_4);else if(arg_int == 0)GPIO_ResetBits(GPIOA,GPIO_Pin_4);break;case U8X8_MSG_GPIO_DC:if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pinGPIO_SetBits(GPIOA,GPIO_Pin_3);else if(arg_int == 0)GPIO_ResetBits(GPIOA,GPIO_Pin_3);break;case U8X8_MSG_GPIO_RESET:if(arg_int == 1)                                     // arg_int=1: Input dir with pullup high for I2C clock pinGPIO_SetBits(GPIOA,GPIO_Pin_2);else if(arg_int == 0)GPIO_ResetBits(GPIOA,GPIO_Pin_2);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 valuebreak;}return 1;
}

最终效果

 int t = 0;u8g2_t u8g2; delay_init(168);LED_Init();                 //初始化LEDOLED_Init();                //初始化OLEDLED0=0;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);while(1) {LED0=~LED0;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);  }

stm32移植U8G2图像库指南相关推荐

  1. 基于STM32移植U8g2图形库——OLED显示(HAL库)

    前言:本文主要内容为将优秀的图形库U8g2移植到STM32单片机上,用于OLED显示精美UI.其实,目前GitHub上有需要优秀的开源GUI库,但是大部分的GUI解决方案并不适合0.96 OLED(1 ...

  2. [STM32] STM32 移植 U8g2库

    文章目录 前言 1. 准备 2. 移植步骤 2.1 建立有效的通信 2.2 导入U8g2库 2.3 用例测试 总结 前言 开发平台:Keil + 标准库 硬件平台:STM32F103RCT6 显示器件 ...

  3. u8g2 stm32移植笔记

    U8g2移植笔记 下载地址 移植步骤 部分源码简要分析 下载地址 U8g2下载地址U8g2项目Github. 移植步骤 我移植U8g2采用的是stm32硬件SPI,可以提供更高的通讯速率,移植时只需要 ...

  4. STM32使用OLED移植U8g2库

    STM32使用OLED移植U8g2库 STM32CubeMX配置 硬件 STM32F103C8T6 I2C通信OLED 128*64 软件 System Core->RCC->HSE-&g ...

  5. u8g2库stm32移植记录(硬件IIC)

    这是用stm32cubemx,hal库,硬件IIC的方式移植u8g2的教程: 0.移植其实非常简单,文中代码较多只是因为我把官方的模板放上来了,实际上要写的代码只有三部分,代码量非常小的!如果不想看那 ...

  6. 来了!STM32移植LuatOS,潘多拉示例全新教程

    进击的五月,继上期<使用Air724UG制作简易贪吃蛇>教程之后,@打盹的消防车 又为大家带来基于STM32的潘多拉LuatOS移植全新教程: 为什么使用潘多拉作为教程呢? STM32不能 ...

  7. 转发:stm32 移植 freertos

    原链接:http://www.51hei.com/bbs/dpj-106526-1.html 看到一篇stm32移植freertos的文章,讲述的最完整. 前言: 由于之前听过太多人抱怨移植FreeR ...

  8. 《STM32库开发实战指南:基于STM32F103(第2版)》——2.1节仿真器简介

    本节书摘来自华章社区<STM32库开发实战指南:基于STM32F103(第2版)>一书中的第2章,第2.1节仿真器简介,作者刘火良 杨森,更多章节内容可以访问云栖社区"华章社区& ...

  9. STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题

    STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...

最新文章

  1. mongodb数据库磁盘碎片整理。
  2. 项目中遇到的Integer问题--转
  3. 34tomcat设置默认页面
  4. 7-157 求一元二次方程的根 (20 分)
  5. (转)Spring Boot(十八):使用 Spring Boot 集成 FastDFS
  6. 导致Tomcat启动过程缓慢的原因及解决方法
  7. 《HTML与CSS入门经典(第8版)》——2.5 测试Web内容
  8. Scala学习数组/映射/元组
  9. 如何快速出机械工程图
  10. 免校准的电量计量芯片_电能计量专用芯片CS5460A
  11. 在html编辑器中插入css,怎么给kindeditor编辑器添加引用(blockquote)标签,并选择css样式...
  12. 陈经纶2021年高考成绩查询时间,北京30余所高中2017年高考成绩汇总
  13. CSS 渐变背景 之 线性渐变
  14. 帝国时代(1)--献给曾经的游戏
  15. USB音频编解码芯片电路方案设计(原理图)|TYPEC音频方案|TYPEC扩展坞方案|USB音频方案
  16. AV1比HEVC/H.265简单对比
  17. android tab 纵向,GitHub - luonzke/VerticalTabLayout: 垂直纵向的TabLayout、轻松创建纵向导航...
  18. EdgeBoard中“活灵活现”的算子
  19. vivado对mcs文件固化
  20. 靶向蛋白组学定量(MRM/SMR,PRM)

热门文章

  1. 第一章:Reac入门 与 第二章:React面向组件编程
  2. 2023年【上海市安全员A证】试题及解析及上海市安全员A证操作证考试
  3. 鸿蒙安卓账号是否互通,苹果与安卓之间游戏账号不互通,那鸿蒙与安卓之间能否实现互通?...
  4. 水泥混凝土摊铺机的作业中促进施工进度的措施
  5. 【聚合版权】作品文件预上传接口使用说明
  6. Astyle格式批处理-完美处理C代码
  7. Mactalk里的池建强,约你来吗?
  8. 02驱动力在哪里 - 献给迷茫的测试人员
  9. UIBOT调试时步入的快捷键_有 Bug 不会调试 ? 这篇文章很详细 !
  10. xp下用驱动直接写显卡显存