(五)STM32F407 cubemx IIC驱动OLED(2)硬件篇

  这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。
  废话不多说直接开始主题,本人是基于STM32F407VET6芯片,但是意在你看懂这篇文章后,不管是F1,F4,H7等一系列系统硬件IIC配置都能明白如何通过参考手册、数据手册去学习配置。而不是Ctrl c,Ctrl v。这篇文章大致的简述一下OLED,对OLED有一定的认识。
  本文不会概述OLED的物理工作原理,而是从技术手册的角度上简述它。首先要学习OLED就得先了解其驱动芯片,SSD1306
  在这里插入图片描述

一、概述

(1)简单概述

  SSD1306是一款带控制器的单片CMOS OLED/PLED驱动器,用于有机/聚合物发光二极管点阵图形显示器。它由128个段和64个公域组成。该芯片是专为共阴极型OLED面板。

(2)引脚描述

此博客只概述了博主认为比较重要的几个引脚。
配张图1.VDD:核心逻辑操作的电源引脚。

2.VCC:面板驱动电压电源。这也是最积极的电源电压供应引脚。

3.VSS:这是接地引脚。

4.VLSS:这是一个模拟接地引脚。它应该从外部连接到VSS。

5.VCOMH:COM信号引脚取消选择电压电平。此引脚和VSS之间应连接一个电容。

6.VBAT:预留管脚,它应该连接到VDD。

7.BGGND:预留管脚,它应该接地。

8.IREF:这是段输出电流基准引脚。一个电阻器应连接在他的引脚和VSS之间,以保持IREF电流在12.5 uA。电阻值详见后文。

9.CL:这是外部时钟输入引脚。当内部时钟使能(即CLS引脚为高电平)时,不使用此引脚,应连接到VSS。当内部时钟禁用(即CLS引脚为低电平)时,此引脚为外部时钟源输入引脚。

10.CLS:这是内部时钟使能引脚。当它是拉高(即连接到VDD),内部时钟启用。当它被拉低,在内部时钟被禁用;外部时钟源必须连接到CL引脚正常工作。

11.R/W#(WR#):这是连接到MCU接口的读/写控制输入引脚。当与6800系列微处理器接口时,此引脚将B读/写(R/W#)选择输入。读模式将进行时,该引脚被拉高(即连接到VDD)和写模式时低。当选择8080接口模式时,此引脚将是写入(WR#)输入。数据写入操作开始时,该引脚被拉低,芯片被选中。当选择串行或I2C接口时,此引脚必须连接到VSS。

12.D[7:0]:这些是8位双向数据总线,连接到微处理器的数据总线。选择串行接口模式时,D0将为串行时钟输入:SCLK;D1将为串行数据输入:SDIN,D2应保持NC。选择I2C模式时,D2、D1应连接在一起,用作应用中的SDAout、SDAin,D0为串行时钟输入SCL。


二、 SSD1306 硬件I2C介绍

(1)I2C特性

  I2C通信接口由从机地址位SA0、I2C总线数据信号SDA(输出SDAOUT/D2,输入SDAIN/D1)和I2C总线时钟信号SCL(D0)组成。数据和时钟信号都必须连接到上拉电阻(记住这句话,一般买的模块都已经给你接好了上拉电阻)。RES#用于初始化设备。

1)从机地址位(SA0)
  SSD1306必须在通过I2C总线发送或接收任何信息之前识别从机地址。该器件将响应从机地址,随后是从机地址位(“SA0”位)和读/写选择位(“R/W#”位),字节格式如下:

b7b6b5b4b3b2b1b0
011110SA0R/W#

  为从机地址提供扩展位。可以选择“0111100”或“0111101”作为SSD 1306的从机地址。D/C#引脚用作从机地址选择的SA0。“R/W#”位用于确定I2C总线接口的工作模式。R/W#=1,则处于读取模式。R/W#=0,则处于写入模式。

0111,1000=0x78
0111,1010=0x7A

小结:一般选择的模式是0x78(后续会讲解请参考),我们是向OLED写入数据点亮屏幕。从机地址位是包括读取或者写入状态位的

2)I2C总线数据信号(SDA)
  SDA充当发送器和接收器之间的通信信道。数据和确认通过SDA发送。应该注意的是,ITO走线电阻和“SDA”引脚的上拉电阻成为一个分压器。因此,确认将不可能在“SDA”中获得有效的逻辑0电平。“SDAIN”和“SDAOUT”捆绑在一起,用作SDA。必须连接“SDAIN”引脚以充当SDA。“SDAOUT”引脚可能断开。当“SDAOUT”引脚断开时,I2C总线中的确认信号将被忽略。

3)I2C总线时钟信号(SCL)
  I2C总线中的信息传输遵循时钟信号SCL。数据位的每个传输发生在SCL的单个时钟周期期间。
数据格式
在这里插入图片描述  你会发现数据格式严格遵守IIC协议,起始位S、从发送地址位SA、应答位A、数据data、应答位A、停止位P
注意数据位的构成是由构成

CoD/C000000
XX000000

1.如果Co位设置为逻辑"0",则以下信息的传输将仅包含数据字节。
2.D/C#位决定下一个数据字节是作为命令还是数据。如果D/C#位设置为逻辑"0",则将以下数据字节定义为命令。如果D/C#位被设置为逻辑"1",则其将以下数据字节定义为将被存储在GDDRAM中的数据。GDDRAM列地址指针将在每次数据写入后自动增加1。

总结:0000,0000为发送指令格式,发送命令时地址为0x00,0100,0000为发送数据格式,为0x40而且其会递增,这也是书写代码的关键部分。

(2)I2C写入模式介绍

1.通过将SDA从高电平拉到低电平,同时SCL保持高电平,建立启动条件。
2.当应用停止条件时,写入模式将结束。停止条件也在下图中定义。停止条件是通过将"SDA"从低电平拉到高电平而"SCL"保持高电平来建立的。
在这里插入图片描述3.确认位(A)将在接收到每个控制字节或数据字节后产生。
4.接收到一个字节的数据后,将产生一个确认信号(A),包括从机地址和R/W#位。确认信号的图示请参见下图。确认位定义为SDA线在确认相关时钟脉冲的高电平期间被下拉。
图1

5.请注意,数据位的传输有一些限制。在每个SCL脉冲期间传输的数据位必须在时钟脉冲的“高”周期内保持稳定状态。图示见下图。除了在开始或停止条件,数据线可以切换只有当SCL为低。
在这里插入图片描述暂时对IIC寄存器配置不进行讲解,在OLED处详细讲解。

三、SSD1306图形显示数据RAM(GDDRAM)介绍

  首先我用一段简单的话描述一下什么是页,什么是列,首先需要知道SSD1306有8个页,128列,每一页有8个小灯它的构成也就是88=64、128=128、构成64128的点阵OLED屏。
  推荐看看这位大佬的视频大佬对硬件讲解非常细致,本人是参考了许多大佬的视频的:链接: 【【STM32入门教程-2024】第14集 如何在OLED屏幕上挥毫】 https://www.bilibili.com/video/BV19u4y197df/?share_source=copy_web&vd_source=b25ae79b699fbc0a2f70ccb983f6b74a

竖向寻址方式(页)
  GDDRAM是一种位映射的静态RAM,保存要存储的位模式。RAM的大小为128 x 64位,RAM分为八页,从PAGE0到PAGE7,用于单色128 x 64点阵显示,如下图所示。
在这里插入图片描述  小结这也就是页的构成,页有8段而每一段是有8个点位的,如下图所示。而64个点位是由8页*8点构成。
页地址对应的是(B0-B7h)

横向寻址方式(列)
  For example下图通过实例展示了列和页地址指针移动的方式:列起始地址设置为2,列结束地址设置为125,页起始地址设置为1,页结束地址设置为6;水平地址递增模式通过命令20h启用。在这种情况下,图形显示数据RAM列可访问范围是从第2列到第125列和仅从第1页到第6页。另外,列地址指针被设置为2,并且页地址指针被设置为1。完成数据的一个像素的读/写后,列地址自动增加1,以访问下一个RAM位置进行下一次读/写操作。每当第n列地址指针完成访问最后第n列125时,它被复位回第n列2,页面地址自动增加1。当结束页6和结束列125 RAM位置被访问时,页地址被重置回1,列地址被重置回2。
在这里插入图片描述列地址对应的是(00-7Fh)
小结:列地址是可以通过for循环递增的,不需要重新写下一列的地址然后设置对应状态。但是重新写列地址写对应状态也可以控制OLED,但是会非常冗长。

四、OLED简介

在这里插入图片描述

(1)原理图介绍

在这里插入图片描述在这张原理图中会发现几个比较关键的部分。
1.上拉电阻硬件已经帮你接好R6、R7
2.本人手上的OLED是下拉接的R11
3.所对应的地址为0x78,但是这张电路原理图并没有对时钟的介绍,所以应该是使用的SSD1306的内部时钟。
数据手册里面发现没有啥好讲的,直接开始讲解寄存器配置

五、寄存器配置

在这里插入图片描述将这张程序流程图一点点分析。
1.配置0XAE
  这些单字节命令用于打开或关闭OLED面板显示。当显示器为ON时,通过Set Master Configuration命令选择的电路将被打开。当显示器为OFF时,这些电路将被关闭,并且段和公共输出分别处于VSS状态和高阻抗状态。这些命令将显示设置为以下两种状态之一:AEh:显示关闭;AFh:显示打开

2.配置0XD5:0X80
  设置显示时钟分频比/振荡器频率。(A[3:0]显示时钟分频比)(A[7:4]振荡器频率)。首先要明白是将0XD5寄存器中写入数据0x80也就是1000,0000

A7A6A5A4A3A2A1A0
10000000

  首先低四位显示时钟分频比(D)(A[3:0])设置分频比以从CLK生成DCLK(显示时钟)。分频比为1至16,复位值= 1。有关DCLK和CLK的详细关系,D代表时钟分频比。它由命令D5h A[3:0]设置。分频比的范围为1至16。0000也就对应着分频为1。
  其次高四位,如果CLS引脚被拉高(也就是内部时钟源使能),则对作为CLK源的振荡器频率Fosc进行编程。4位值导致16种不同的频率设置,如下所示。默认设置为1000b,这也是为什么推荐0x80。(因为它用的就是默认值)

3.配置0XA8:0X3F
  设置多路复用比率,此命令将默认的63多路复用模式切换到范围从16到63的任何多路复用比率。输出焊盘COM0~COM63将切换到相应的COM信号。0X3F=63

4.配置0XD3:0X00
  设置显示偏移,这是一个双字节命令。第二个命令指定显示起始行到COM 0 ~ COM 63之一的映射(假设COM 0是显示起始行,则显示起始行寄存器等于0)。0x00对应的就是没有偏移。

5.配置0X40
  设置显示起始行,从第0行开始显示

6.配置0XA1
  设置段重映射,此逗号将更改显示数据列地址和段驱动程序之间的映射。它允许OLED模块设计的灵活性。

7.配置0XC8
  设置COM输出扫描方向,此命令设置COM输出的扫描方向,使OLED模块设计具有布局灵活性。此外,发出此命令后,显示屏将显示。例如,如果在正常显示期间发送此命令,则图形屏幕将立即垂直翻转。

8.配置0XDA:0x12
  设置COM引脚硬件配置,此命令设置COM信号引脚配置以匹配OLED面板硬件布局。下表显示了不同条件下的COM引脚配置,0x12=0001,0010。A[4]=1,A[5]=0。替代COM引脚配置(DAh A[4] =1)COM输出扫描方向:从COM63到COM0(C8h)禁用COM左/右重映射(DAh A[5] =0)
在这里插入图片描述
9.配置0X81:0XCF
  设置BANK0的对比度控制,此命令设置显示器的对比度设置。该芯片具有从00h到FFh的256个对比度级。段输出电流随着对比度阶跃值的增加而增加。
设置其亮度为207。

10.配置0XD9:0xF1
  设置预充期间,此命令用于设置预充电周期的持续时间。间隔以DCLK的数量计数,其中DCLK等于2个DCLK。

11.配置0XDB:0x30
  此命令调整VCOMH调节器输出。

12.配置0XA4
  整个显示器打开,A4h命令使能根据GDDRAM内容显示输出。如果发出A5h命令,则通过使用A4h命令,显示将恢复到GDDRAM内容。换句话说,A4h命令从整个显示“ON”阶段恢复显示。A5h命令强制整个显示器为“ON”,而不管显示数据RAM的内容。

13.配置0XA6
  设置正常/反转显示(A6h/A7h),此命令将显示设置为正常或反转。在正常显示中,RAM数据1表示"ON"像素,而在反向显示中,RAM数据0表示"ON"像素。

14.配置0X8D:0X14
  使能电荷泵调节器8Dh、14h

15.配置0XAF
  开启显示

  至此寄存器配置以及所对应的含义已经大致有所了解,下一步开始编写根据寄存器步骤以及数据手册指导编写代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 基础认识

文章目录 概念铺垫(1)概念铺垫(2)概念铺垫 (3)概念铺垫(4)Docker 定义Docker 特点Docker 架构 概念铺垫(1) 虚拟化相关概念 物理机:实际的服务器…

WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化

今天明月给大家分享一下 WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化,无论你的站点采用是 WordPress 还是 Typecho,都要用到 MySQL/MariaDB 数据库,我们以 MySQL 为主(MariaDB 其实跟 MySQL 基本没啥大的区别&#xff0…

JUC下的Java java.util.concurrent.Locks详解

java.util.concurrent.locks 包介绍 java.util.concurrent.locks 包是Java并发编程中非常重要的一个部分,它提供了比内置synchronized关键字更为灵活的锁机制,用于多线程环境下的同步控制。这个包中最核心的是Lock接口,以及一系列实现类&…

如何通过香港站群服务器高效实现网站内容的快速更新?

如何通过香港站群服务器高效实现网站内容的快速更新? 在当今激烈的数字市场竞争中,网站内容的快速更新对于吸引用户和保持竞争优势至关重要。而利用香港站群服务器实现这一目标,则具备诸多优势。下面将详细探讨如何通过香港站群服务器高效实现网站内容…

thinkphp6使用layui分页组件做分页效果

博主用的是layui2.9.8的版本,但这个版本的分页组件是动态效果的,但我需要的是静态分页,所以我自己封装了一个生成layui的分页代码生成代码。代码如下: 1、先创建文件,路径是extent/layui/LayuiPage.php,加…

基于MetaGPT的LLM Agent学习实战(一)

前言 我最近一直在做基于AI Agent 的个人项目, 因为工作加班较多,设计思考时间不足,这里借着Datawhale的开源学习课程《MetaGPT智能体理论与实战》课程,来完善自己的思路,抛砖引玉,和各位开发者一起学习&am…

Run ‘conda init‘ before ‘conda activate‘

使用conda activate 虚拟环境名称的时候提示:Run conda init before conda activate 解决办法: 首先需要确保是管理员身份运行这个cmd窗口。 然后,现在执行一下:conda init 命令,最后再执行:conda activate…

纯血鸿蒙APP实战开发——首页下拉进入二楼效果案例

介绍 本示例主要介绍了利用position和onTouch来实现首页下拉进入二楼、二楼上划进入首页的效果场景,利用translate和opacity实现动效的移动和缩放,并将界面沉浸式(全屏)显示。 效果图预览 使用说明 向下滑动首页页面超过触发距…

冯喜运:5.13黄金原油震荡整理是涨还是跌?今日走势分析

【黄金消息面分析】;自5月初以来,黄金和白银一直在享受需求的回归,买家在过去几天加大了力度,一度推动金价重返2370美元上方,白银重返28.5美元上方。不过,经过几天的盘整后,黄金白银价格双双下跌。然而&…

Redis-详解(基础)

文章目录 什么是Redis?用Redis的特点?用Redis可以实现哪些功能?Redis的常用数据类型有哪些?Redis的常用框架有哪些?本篇小结 更多相关内容可查看 什么是Redis? Redis(Remote DictionaryServer)是一个开源…

下载文件名称乱码或变成了随机码

如图 后端是有正常返回附件名称的,浏览器开发工具中也正常显示了这个数据,但是下载下来的文件名称确实一堆随机码. 其实这个问题的原因是因为跨域 查看console: Refused to get unsafe header "content-disposition" 现象,后端传递到前端的fileName不能被识别,下载…

大模型与AIGC应用相关问题 模型大型

最近经常被问,你看“万亿的模型都出来了,你们训练的千亿模型是不是落伍了?”我想说:“虽然都叫超大模型,但是类型是不一样的,虽说每一类模型训出来都不容易,不过澄清一下概念还是必要的”。 大…

编写Ansible角色实现分布式LNMP安装

前言 本文将介绍如何使用 Ansible 编写角色,在分布式环境下完成 LNMP(Linux、Nginx、MySQL、PHP)的自动化(编译)安装和配置,并验证 PHP 与 MySQL 数据联通性,实现博客和论坛页面的展示。 常规…

Qt---信号和槽

一、信号和槽机制 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号…

二叉树的四种遍历代码实现

二叉树的遍历大致能分为以下几种 1.前序:根 左 右 2.中序:左 根 右 3.后序:左 右 根 4.层序:从根开始一层一层的向下 如上图访问顺序: 前序:1 2 3 N N N 4 5 N N 6 N N 中序:N 3 N 2 N 1 N 5 N 4 N …

docker-compose安装emqx集群(最新)(host模式)

机器: 10.60.0.20 10.60.0.21 10.60.0.22 一、三台机子都配置域名(/etc/hosts) 10.60.0.20 node1.emqx.io 10.60.0.22 node3.emqx.io 10.60.0.21 node2.emqx.io 二、docker-compose.yml(10.60.0.21) 其他两台机子自…

接搭建仿美团、代付系统源码搭建教程

最近很多粉丝催更、分享一下地球号:xiaobao0214520(WX) 现在大家都很流行搞网恋,我们搭建一个跟美团相似的系统 然后开发一个好友代付,我们在点单的时候转发链接让网恋对象付钱 若只是单点外卖的话,能榨出的油水还是太少。 所以…

Golang — map的使用心得和底层原理

map作为一种基础的数据结构,在算法和项目中有着非常广泛的应用,以下是自己总结的map使用心得、实现原理、扩容机制和增删改查过程。 1.使用心得: 1.1 当map为nil和map为空时,增删改查操作时会出现的不同情况 我们可以发现&#…

【全开源】废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp

介绍 一款基于FastAdminThinkPHPUniApp开发的废品回收系统,适用废品回收站、再生资源回收公司上门回收使用的小程序 功能特性 1、会员注册 支持小程序授权注册和手机号注册 2、回收品类 可设置回收品类,废纸、废金属、废玻璃、旧衣服等 3、今日指导价…

面试高频知识点:Java互联网大厂高频面试题(持续收录)

文章目录 前言一、Java基础题1、Java语言的三大特性2、JDK 和 JRE 有什么区别3、Java基本数据类型及其封装类4、说明一下public static void main(String args[])这段声明里关键字的作用5、java的数据结构有哪些?6、抽象类和接口的区别?7、 与 equals 的区别8、Str…