查看: 3510|回复: 26

[分享] 如何移植 U8g2 到 LPC55(S)6x 并驱动单色 OLED 屏幕

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32032
    最后登录
    2024-4-26
    发表于 2021-7-20 10:38:15 | 显示全部楼层 |阅读模式
    如何移植 U8g2 到 LPC55(S)6x 并驱动单色 OLED 屏幕


    1 LPC55(S)6x 和 U8g2 简介
    LPC55(S)6x 是一款基于 Arm® Cortex®-M33 内核的 MCU。该 MCU 集成有:
    • Casper 安全加速器
    • 最大 320 k Bytes 片上 RAM
    • 最大 640 k Bytes 片上 Flash
    • PRINCE 模块支持加密固件边解密边执行
    • 五个通用定时器 CTIMER
    • 一个状态可配置定时器 SCTimer/PWM
    • 一个看门狗定时器 WWDT
    • 八个 Flexcomm 串行接口(可以任意配置为 UART,SPI,I2C 或者 I2S)
    • 一路 50 MHz 高速 SPI
    • 一路 16 位-1.0 Msps 采样率的 ADC
    • 片上集成温度传感器
    U8g2 是用于嵌入式设备的单色图形库。U8g2 支持单色 OLED 和 LCD,其中包括以下控制器:SSD1305、SSD1306、SSD1309、SSD1322、 SSD1325、SSD1327、SSD1329、SSD1606、SSD1607、SH1106、SH1107、SH1108、SH1122、T6963、RA8835、LC7981、PCD8544、PCF8812、HX1230、 UC1601、UC1604、UC1608、UC1610、UC1611、UC1701、ST7565、ST7567、ST7588、ST75256、NT 7534, IST3020, ST7920, LD7032, KS0108, SED1520, SBN1661, IL3820, MAX7219(请参阅此处查看完整列表)。
    U8g2 还包括 U8x8 库:
    • U8g2
    — 包括所有图形程序(线/框/圆绘图)。
    — 支持多种字体,字体高度没有限制。
    — 需要微控制器中的一些内存来渲染显示。
    • U8x8
    — 仅支持文本输出(字符)设备。
    — 仅允许适合 8×8 像素网格的字体。
    — 直接写到显示屏上,微控制器中无需缓冲。
    请用户查阅 U8g2 的 LICENSE:https://github.com/olikraus/u8g2/blob/master/LICENSE
    U8g2 是根据新的 BSD 许可证(双条款 BSD 许可证)的条款进行许可的。
    本应用笔记基于 LPC55(S)6x MCU 移植 U8g2 库来支持一个分辨率为 128x64 的单色 OLED 屏幕,OLED 的驱动 IC 为 SSD1306。


    2 屏幕介绍
    市面上有很多 128 × 64 分辨率的 OLED 屏幕模组非常容易购买,比如在淘宝或者亚马逊上搜索 “OLED 0.96 SSD1306”就可以

    搜索到类似 图 1 的 OLED 屏幕模组。
    11.png

    表 1. SSD1306 MCU 控制协议配置引脚
    12.png

    1. 0 is connected to Vss
    2. 1 is connected to VDD
    通常 MCU 驱动 SSD1306 的接口为 I2C,三线 SPI 或者四线 SPI。开发者需要根据自己实际的接口需求调整模组或者 OLED 屏幕上 BS0、BS1 和 BS2 引脚的电平状态,来配置 OLED 屏幕的驱动接口,具体见 表 1。具体的时序控制协议,可以参考 SSD1306 的数据手册 SSD1306。
    3 LPC55S69-EVK 连接 OLED 屏幕介绍
    我们可以利用 LPC55S69 的 Flexcomm 功能与 OLED 屏幕进行通信。
    • 如果 OLED 屏幕接口是 I2C 接口,我们就把 Flexcomm 配置为 I2C。
    • 如果是 SPI 接口的 OLED 屏幕,我们就把 Flexcomm 配置为 SPI。
    在 LPC55S69-EVK 开发板上,我们使用 Flexcomm4 作为 I2C 接口连接 I2C 接口的 OLED 屏幕,使用高速 SPI 接口连接 SPI 接口的 OLED 屏幕。
    3.1 LPC55S69-EVK 评估板
    图 2 是官方针对 LPC55(S)6x 系列 MCU 的评估板 LPC55S69-EVK。

    13.png
    图 2 中标识了:
    • Flexcomm4 的位置即 P17 连接器的 D15 和 D14
    • 高速 SPI 的位置即 P17 的 D13、D12、D11 和 D10
    我们也可以利用 P17 上的 AVDD 和 GND 对 OLED 屏幕模组供电。
    3.2 LPC55S69-EVK 评估板连接 I2C 模式下的 OLED 模组
    图 3 展示 I2C 接口的 OLED 模组如何连接到 LPC55S69-EVK。
    14.png

    3.3 LPC55S69-EVK 评估板连接 SPI 模式下的 OLED 模组
    图 4 展示 SPI 接口的 OLED 模组如何连接到 LPC55S69-EVK。

    15.png

    4 U8g2 使用和移植介绍
    4.1 如何使用 U8g2
    U8g2 支持 C 语言开发,适用于任何 MCU。其在应用中的设置顺序如下:

    1. u8g2_t u8g2; // a structure which will contain all the data for one display
    2. ...
    3. u8g2_Setup_ssd1306_i2c_128x64_noname_2(&u8g2, U8G2_R0, u8x8_byte_sw_i2c,
    4. u8x8_gpio_and_delay_lpc11u3x); // init u8g2 structure
    5. u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
    6. u8g2_SetPowerSave(&u8g2, 0); // wake up display
    复制代码
    在初始化 u8g2 结构体的 API 函数 u8g2_Setup_xxxx_xxx_128x64_noname()中,需要设置四个参数:
    1. U8g2:指向一个空的 u8g2 结构体的指针。
    2. 旋转:设置屏幕旋转的方向,见 表 2。
    3. 按字节发送和接收数据的 API,可以用现有的驱动程序,也可以是用户自定义的函数。见 表 3。
    4. 底层的延时以及 GPIO 操作的 API,这是一个用户自定义的函数



    表 2. U8g2 初始化设置函数第二个参数选择
    16.png

    表 3. U8g2 初始化设置函数第三个参数选择
    17.png

    目标显示器要支持这些接口,例如,如果显示器不支持 SPI 接口,则不能使用 SPI 的发送函数 API。
    4.2 如何利用 SDK 的 API 支持 U8g2
    一般来讲,可以利用硬件 I2C,SPI 或者利用 GPIO 模拟 I2C,SPI 的方式驱动 OLED,所以在利用 SDK 的 API 支持 U8g2 方面,
    我们基于 SDK 的 API 提供了软件 GPIO 模拟 I2C,SPI 方式以及硬件 I2C,SPI 方式的驱动例程。
    用户只需要关心 driver_oled_ssd1306.c 和.h 文件里的宏定义即可。
    根据自己驱动方式的需求,修改以下宏定义为 1 即可。
    1. #define SSD1306_USE_I2C_GPIO 0u
    2. #define SSD1306_USE_I2C_HW 0u
    3. #define SSD1306_USE_SPI_GPIO 0u
    4. #define SSD1306_USE_SPI_HW 0u
    复制代码
    如果用户是移植到自己的硬件平台上,还需要考虑对应 IO 口功能的配置问题,所以就需要修改 driver_oled_ssd1306.h 里的对应
    功能 IO 口的配置,如果使用硬件 I2C 或者 SPI 方式,还要考虑 driver_oled_ssd1306.h 里针对 I2C 以及 SPI 端口和波特率的配置。
    如果用户需要移植到其它平台可以参考本 AN 提供的例程中 driver_oled_ssd1306.c 文件中的 API。
    • GPIO 口模拟 I2C 的 API

    1. uint8_t u8x8_gpio_and_delay_lpc55(u8x8_t *u8x8, uint8_t msg, uint8_t arguing, void *arg_ptr)
    复制代码
    • GPIO 口模拟 SPI 的 API

    1. uint8_t u8x8_gpio_and_delay_lpc55(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
    复制代码
    • 硬件 I2C 的 API

    1. uint8_t u8x8_byte_hw_i2c_lpc55(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
    2. uint8_t u8x8_gpio_and_delay_lpc55(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
    复制代码
    • 硬件 SPI 的 API

    1. uint8_t u8x8_byte_4wire_hw_spi_lpc55(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
    2. uint8_t u8x8_gpio_and_delay_lpc55(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
    复制代码
    u8x8_gpio_and_delay_lpc55()是基础 API,包含了 GPIO 功能的初始化以及必要的延时函数。
    5 KEIL,IAR 和 MCUXpresso 下调试 U8g2
    下载工程前,需要将 LPC55S69-EVK 开发板的 USB 调试用接口(P6)连接到 PC。
    5.1 KEIL MDK 环境下调试
    KEIL MDK 的工程在路径 lpc55s69_evk_u8g2_mdk 下。
    打开工程后,按 21.png
    编译工程,编译成功后按 22.png
    下载程序到开发板。
    5.2 IAR 环境下调试
    IAR 的工程在路径 lpc55s69_evk_u8g2_iar 下。打开工程后,按 F7 编译工程,编译成功后 按 F8 下载程序到开发板。
    5.3 MCUXpresso 环境下调试
    MCUXpresso 环境下需要用户导入工程 lpc55s69_evk_u8g2_mcux.zip。
    导入工程后,按 23.png
    编译工程,编译成功后按 24.png
    下载程序到开发板。
    图 5 显示了最终效果。

    18.png

    6 结论
    U8g2 是一种非常适合嵌入式平台的单色显示器驱动库,配合 LPC55Sxx 系列微控制器的 150MHz 高主频,高速 SPI 以及大 RAM
    的特点可以有更好的发挥。

    详细内容如下:
    点击查看详情>>




    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-5 08:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    91

    主题

    2928

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    7809
    最后登录
    2024-4-26
    发表于 2021-7-20 11:12:12 | 显示全部楼层
    学习了
    加油哦
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-2 08:40
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    97

    主题

    836

    帖子

    7

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    3975
    最后登录
    2024-4-16
    发表于 2021-7-20 11:14:59 | 显示全部楼层
    這種應用筆記 還行吧?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-7-20 11:21:47 | 显示全部楼层
    我就是觉得单色屏还是直接写几个函数就行了。
    上一个图形库 有些把事情搞复杂了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-2 08:40
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    97

    主题

    836

    帖子

    7

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    3975
    最后登录
    2024-4-16
    发表于 2021-7-20 11:22:41 | 显示全部楼层
    jobszheng5 发表于 2021-7-20 11:21
    我就是觉得单色屏还是直接写几个函数就行了。
    上一个图形库 有些把事情搞复杂了 ...

    牵扯到层级的UI的话,有u8g2会方便很多,还有字库管理
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    昨天 09:42
  • 签到天数: 1783 天

    [LV.Master]伴坛终老

    65

    主题

    7543

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    12759
    最后登录
    2024-4-26
    发表于 2021-7-20 13:56:01 | 显示全部楼层
    U8G2挺强大
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    11 小时前
  • 签到天数: 1941 天

    [LV.Master]伴坛终老

    61

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    17301
    最后登录
    2024-4-26
    发表于 2021-7-20 21:38:42 | 显示全部楼层
    学习了
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-8 09:06
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    18

    主题

    438

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    2209
    最后登录
    2024-3-5
    发表于 2021-7-21 21:18:48 | 显示全部楼层
    学习学习
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-2 08:40
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    97

    主题

    836

    帖子

    7

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    3975
    最后登录
    2024-4-16
    发表于 2021-7-22 10:51:26 | 显示全部楼层
    配合u8g2可以比较简单的实现小游戏
    https://www.bilibili.com/video/BV1zK4y1N7Xs/
    嘿嘿嘿
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-5-25 16:03
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    8

    主题

    718

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3395
    最后登录
    2024-3-5
    发表于 2021-7-27 15:44:01 | 显示全部楼层
    学习了      
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 11:59 , Processed in 0.157672 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表