U8g2移植笔记

  • 下载地址
  • 移植步骤
  • 部分源码简要分析

下载地址

U8g2下载地址U8g2项目Github。

移植步骤

我移植U8g2采用的是stm32硬件SPI,可以提供更高的通讯速率,移植时只需要提供两个回调函数即可。

  1. 从GitHub下载的源码中我们选择csrc文件夹下的代码进行移植
  2. 将csrc下的文件加入到项目目录,其中u8x8_d_器件名.c的文件只需选择自己对应的显示器驱动芯片即可,比如我的是OLED12864显示器,显示器驱动为SSD1306,分辨率为128x64,我选择的文件为u8x8_d_ssd1306_128x64_noname.c
  3. 修改u8g2_d_setup.c文件,只保留自己使用的芯片对应的setup文件。比如我选择的是u8g2_Setup_ssd1306_128x64_noname_1,控制芯片SSD1306,分辨率128x64,128字节页大小。按照自己的芯片进行选择,还有其他类型的函数比如u8g2_Setup_ssd1306_128x64_vcomh0_1u8g2_Setup_ssd1306_128x64_alt0_1,仔细对比后发现只是芯片初始化配置不同,其他操作与noname相同,可以自己选一个进行尝试。
u8g2_Setup_ssd1306_128x64_noname_1 /*芯片SSD1306,分辨率128x64,128字节页大小*/
u8g2_Setup_ssd1306_128x64_noname_2 /*芯片SSD1306,分辨率128x64,256字节页大小*/
u8g2_Setup_ssd1306_128x64_noname_f /*芯片SSD1306,分辨率128x64,1024字节页大小*/
  1. 在自己的工程中编写如下函数
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: /*通过SPI发送arg_int个字节数据*/spiWrNdata(0, arg_ptr, arg_int); /*注意需要自行管理片选信号*/break;case U8X8_MSG_BYTE_INIT: /*初始化函数,这边我已经初始化SPI了就不填了*/break;case U8X8_MSG_BYTE_SET_DC: /*设置DC引脚,DC引脚控制发送的是数据还是命令*/gpioPinWrite(U8G2_DC_PORT, U8G2_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: /*dela和GPIO的初始化,我已经初始化过了*/break;case U8X8_MSG_DELAY_MILLI: /*延时ms函数*/delay_ms(arg_int);break;case U8X8_MSG_GPIO_CS: /*片选信号控制,但是似乎没有啥用*/gpioPinWrite(U8G2_CS_PORT, U8G2_CS_PIN, arg_int);break;case U8X8_MSG_GPIO_DC: /*设置DC引脚,DC引脚控制发送的是数据还是命令*/gpioPinWrite(U8G2_DC_PORT, U8G2_DC_PIN, arg_int);break;case U8X8_MSG_GPIO_RESET: /*GPIO复位*/break;}return 1;
}
void u8g2Init(u8g2_t *u8g2)
{/*U8G2_R0 :屏幕旋转/镜像U8G2_R0U8G2_R1U8G2_R2U8G2_R3U8G2_MIRROR*/u8g2_Setup_ssd1306_128x64_noname_1(u8g2, U8G2_R0, u8x8_byte_4wire_hw_spi, u8x8_stm32_gpio_and_delay);  // 初始化 u8g2 结构体u8g2_InitDisplay(&u8g2); // 根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态u8g2_SetPowerSave(&u8g2, 0); // 打开显示器
}
  1. 上一步完成之后,注释掉u8g2_d_memory.c文件里面的所有函数,文件中的函数是给显示器分配显存的,在u8g2_Setup_ssd1306_128x64_noname_1 中有调用此文件中的函数。注释掉后编译,查看哪个函数未定义就去掉相应函数的注释 (如果使用编译器优化的话也可以不删除其他函数)
  2. 编写测试函数
/*官方提供的Log绘制demo*/
void draw(u8g2_t *u8g2)
{u8g2_SetFontMode(u8g2, 1); /*字体模式选择*/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");
}
  1. 编写主函数
u8g2_t u8g2; // 它将包含一个显示器的所有数据
int main(void)
{/*外设初始化*/.../*u8g2初始化*/u8g2Init(&u8g2);while(1){u8g2_FirstPage(&u8g2);do{draw(&u8g2);} while (u8g2_NextPage(&u8g2));}
}
  1. 最后编译,可能会提示内存溢出,可以注释掉u8x8_fonts.c文件中不使用的字体,也可以启用编译器优化,将未使用的字体数组自动优化掉。

部分源码简要分析

  1. u8g2_Setup_ssd1306_128x64_noname_1函数分析
void u8g2_Setup_ssd1306_128x64_noname_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
{uint8_t tile_buf_height;uint8_t *buf;/*u8x8_d_ssd1306_128x64_noname :对应芯片显示相关操作u8x8_cad_001:芯片底层数据发送操作byte_cb:发送数据回调函数(用户提供)gpio_and_delay_cb:io操作与延时操作回调函数(用户提供)*/u8g2_SetupDisplay(u8g2, u8x8_d_ssd1306_128x64_noname, u8x8_cad_001, byte_cb, gpio_and_delay_cb); /*获取显存,此函数获取128字节数组*/buf = u8g2_m_16_8_1(&tile_buf_height);/*设置显示器显存相关参数*/u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
}
  1. 页面刷新
    所有的draw操作都是在操作显存,并未将数据写入给显示器,只有,u8g2_NextPage(&u8g2)函数会将显存中的数据发送给显示器

u8g2 stm32移植笔记相关推荐

  1. micropython STM32移植笔记(一)

    micropython STM32移植笔记(一) 首先,我是一个搞硬件的,说白了是做电路的,呵呵... 一直想学一些软件,只会搞硬件的工程师是没有灵魂的,画了7年的PCB板卡了,但是每次调试硬件都要求 ...

  2. stm32 u8g2移植笔记

    STM32 u8g2 移植笔记 前言 当初想写一个单色屏菜单时,曾移植过u8g2到STM32平台(这里用的是keil MDK),不过当时一直有一个问题没有搞懂:为什么u8g2用在flash为32k,r ...

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

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

  4. stm32移植U8G2图像库指南

    stm32移植U8G2图像库指南 U8G2图形库介绍 移植准备工作 开始移植文件 修改keil配置 修改U8G2源码 u8g2_d_setup.c修改 u8g2_d_memory.c修改 注意 U8G ...

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

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

  6. STM32学习笔记:按键实验

    STM32学习笔记:按键实验 一.所使用的函数 1.时钟使能函数 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState New ...

  7. 《STM32学习笔记》2——开发环境的建立

    接上文,文中的图片知识,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.接口定义 1 芯片引脚整体简介 2 各部分引脚介绍 二.开发板简介 三.IS ...

  8. STM32开发笔记77: 内部看门狗长延时的产生

    单片机型号:STM32L053R8T6 开发笔记STM32开发笔记45:看门狗驱动程序的移植介绍了看门狗驱动程序的基本设计方法.今天项目中看门狗的延时时间达到10秒,则实际运行效果只有3秒. 以下是看 ...

  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. vmware下/mnt/hgfs下为空的问题
  2. 美团字节滴滴重启支付大战,王兴张一鸣不甘心
  3. Pixhawk之姿态控制篇(1)_源码算法分析(超级有料)
  4. python fun函数、求4x4整型数组的主对角线元素的和_python中多维数组中列major的numpy整形...
  5. linux 驱动基础知识(2)---设备树
  6. hdfs snapshot 快照的使用场景应用与操作命令的介绍
  7. 安卓智能手机完全装机手册,让安卓拥有无限可能!
  8. 单片机中断程序,如何被中断?
  9. docer kafka安装
  10. Minibatch Stochastic Gradient Descent
  11. 群晖存储空间不足-处理方案一
  12. Graham扫描法求解二维凸包问题
  13. 数据人需要掌握的技能,从底层到应用
  14. zk和quartz实现分布式定时调度
  15. UI设计师如何寻找设计灵感来源?
  16. 成都天瑞地安谈VR虚拟增强技术能否取代修图软件的意见
  17. 保守形态抗锯齿 (CMAA) - 2014 年 3 月更新
  18. 中央民族大学计算机排名2015,2015年985大学排名排名汇总
  19. 简单操作破解PDF加密文件
  20. SAP CRM和C4C的内容管理(Content Management)

热门文章

  1. python唐诗分析综合_全唐诗分析程序
  2. 【数据隐私】数据隐私执法行动加强
  3. 记录apache和tomcat整合(windows—x64)
  4. dbms_lob 方法总结
  5. C++程序设计基础 小母牛问题
  6. 怎样把其他格式的音频文件转换成MP3格式的
  7. php 重写方法should be compatible with,php方法重写:Declaration of should be compatible with that_PHP教程...
  8. python统计句子中单词个数_python练习:一行搞定-统计一句话中每个单词出现的个数...
  9. 公司跟你聊企业文化了吗
  10. 知物由学 | 垃圾内容肆虐,自监督学习助力“内容风控”效果提升