当前位置: 首页 > news >正文

(五)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
  开启显示

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

相关文章:

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

这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。   废话不多说直接开始主题,本人是基于STM32F407VET6芯片,但是意在你看懂这篇文章后,不管是F1,F4,H7等一系列系统硬件IIC配…...

头歌实践教学平台:CG1-v1.0-点和直线的绘制

第5关&#xff1a;0<k<1直线绘制-中点算法 一.任务描述 根据下面要求&#xff0c;在右侧修改代码&#xff0c;绘制出预期输出的图片。平台会对你编写的代码进行测试。 1.本关任务 掌握一种基本图形元素光栅化算法&#xff0c;利用OpenGL实现直线光栅化的中点画线算法…...

java基础之面向对象的思想

一、面向对象和面向过程的编程思想对比 面向过程&#xff1a;是一种以过程为中心的编程思想&#xff0c;实现功能的每一步&#xff0c;都是自己实现的&#xff08;自己干活&#xff09;。 面向对象&#xff1a;是一种以对象为中心的编程思想&#xff0c;通过指挥对象实现具体的…...

红黑树的理解和简单实现

目录 1. 红黑树的概念和性质 2. 红黑树的插入 2.1. 情况一&#xff1a;新增节点的父亲为空 2.2. 情况二&#xff1a;新增节点的父亲非空且为黑色节点 2.3. 情况三&#xff1a;当父亲为红节点&#xff0c;叔叔存在且为红 2.3.1. 当祖父为根节点的时候 2.3.2. 当祖父不是根…...

发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解

文章目录 [发表博客之&#xff1a;gemm/threadblock/threadblock_swizzle.h 文件夹讲解&#xff0c;cutlass深入讲解](https://cyj666.blog.csdn.net/article/details/138514145)先来看一下最简单的struct GemmIdentityThreadblockSwizzle结构体 发表博客之&#xff1a;gemm/th…...

【C语言项目】贪吃蛇(下)

个人主页~ 源码在Gitee仓库~ 上一篇贪吃蛇&#xff08;上&#xff09;~ 贪吃蛇 四、核心的实现游戏测试1、GameStart&#xff08;1&#xff09;控制台窗口大小和名字设置&#xff08;2&#xff09;光标隐藏&#xff08;3&#xff09;打印欢迎界面&#xff08;4&#xff09;创建…...

【Unity实战|热更】Addressable读取SO文件报错解决

情景再现 假定你有一个Unity工程&#xff0c;使用了HybridCLR和Addressable&#xff0c;SO文件存放在Addressable中。热更加载后进入游戏场景出现了SO文件读取报错&#xff1a; UnityEngine.AddressableAssets.InvalidKeyException: Exception of type UnityEngine.Addressab…...

Web自动化 - selenium

文章目录 一、selenium的使用selenium的安装 二、元素1. 定位选择元素1.id 定位2. class_name 定位find_element 和 find_elements的区别3. TAG_NAME 定位4. 超链接 定位 2. 操控元素1. 查询内容2. 获取元素文本内容3. 获取元素属性 3. 浏览器常用操作API4. 鼠标操作 - perform…...

基于select for update 实现数据库分布式锁

1、select for update 的基本语法 SELECT * FROM table_name WHERE condition FOR UPDATE;2、select for update 的定义及作用 2.1 、select for update的含义是在查询数据的同时对所选的数据行进行锁定&#xff0c;以保证数据的一致性和并发控制。在并发环境下&#xff0c;多…...

Java后端实现对象与文件接收数据(minio测试)

实现思路&#xff1a; 1. 两个接口实现&#xff0c;一个接对象数据(file)&#xff0c;一个接文件数据(json)。 2. json对象(base64String) 实体类信息 &#xff0c;请求体统一接收 3. file, String name ,String password ,String name &#xff0c; Controller层接收 统一…...

考研踩坑经验分享

文章目录 写在前面自身情况简介自身学习路线优点坑点 学习路线建议1、2和3月份3、4和5月份6、7和8月份9、10月份11、12月份 一些私货建议结尾 写在前面 考研是一件非常有盼头的事&#xff0c;但绝对不是一件容易的事。 如果你不能做好来年三月份出成绩时&#xff0c;坦然接受…...

Android Compose 一:基础控件

Flutter 与 Compose 组件辣么像&#xff0c;难道是同一个google团队整的&#xff1b;也未深究&#xff0c;只是猜测。 创建项目 需要使用新版本Android studio&#xff0c;忽略步骤… 项目目录 MainActivity说明 1 系统默认页面 Preview 修饰的方法&#xff0c;只用来供开发…...

python3.12.0 在Linux 制作镜像包 部署到docker 全过程

项目结构&#xff1a; 比如&#xff0c;在pycharm里需要运行 themain.py 1、上传Linux的目录结构&#xff1a; Dockerfile 文件需要制作&#xff1a; 这里是关键&#xff1a; #基于的基础镜像 FROM python:3.12.0 #代码添加到code文件夹 ADD ./EF_NFCS /code #设置code文…...

STM32理论 —— μCOS-Ⅲ(新)

文章目录 1. 任务调度器1.1 抢占式调度 μCos-Ⅲ全称是Micro C OS Ⅲ&#xff0c;由Micriμm 公司发布的一个基于C 语言编写的第三代小型实时操作系统(RTOS)&#xff1b; RTOS 与裸机相比最大的优势在于多任务管理与实时性&#xff0c;它提供了多任务管理和任务间通信的功能&a…...

衢州知识付费系统报价,教师如何做精品课程?怎么创造精品课程?

精品课程对于学生的意义来说是不同的&#xff0c;越是精品让学习的人就越觉得值得&#xff0c;所以&#xff0c;做为教师来说&#xff0c;做出精品课程不仅仅是对学生负责&#xff0c;也是对自己负责&#xff0c;那如何做精品课程?相信很多教师们也想知道。 如何创造精品课程?…...

在Vue中,可以通过使用<slot>元素和name属性来创建具名插槽。这样您就可以为一个组件的不同部分定义不同的内容。 以下是一个简单的示例:

在Vue中&#xff0c;可以通过使用元素和name属性来创建具名插槽。这样您就可以为一个组件的不同部分定义不同的内容。 以下是一个简单的示例&#xff1a; <template><div><header><slot name"header"></slot></header><mai…...

C++笔试强训day19

目录 1.小易的升级之路 2.礼物的最大价值 3.对称之美 1.小易的升级之路 链接 模拟就行&#xff0c;唯一可能是难点得就是gcd&#xff08;最大公约数&#xff09; #include <iostream> using namespace std; #define int long long const int N 1e5 10; int arr[N];…...

MySQL软件安装基于压缩包

打开mysql官网网址 MySQL :: Download MySQL Community Server 本次针对版本8的安装包方式进行安装&#xff0c;下载成功后接下来对MySQL进行安装 下载后有一个以zip后缀结尾的压缩包文件 对于安装包方式安装&#xff0c;比起可视化安装省去了许多安装步骤&#xff0c;这里直接…...

04 贝尔曼最优公式

贝尔曼最优公式 前言1、Motivating examples2、Definition of optimal policy3、Bellman optimality equation(BOE)&#xff1a;Introduction4、 BOE&#xff1a;Maximization on the right-hand side5、BOE&#xff1a;Rewrite as v f(v)6、Contraction mapping theorem7、BO…...

印象笔记使用技巧

印象笔记&#xff08;Evernote&#xff09;是一款广泛使用的笔记应用&#xff0c;它帮助用户整理个人信息、文件和备忘录。以下是一些提高在印象笔记中效率的使用技巧&#xff1a; ### 1. 使用标签和笔记本组织笔记 - **建立笔记本**&#xff1a;为不同的项目或类别创建笔记本…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...