(五)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#”位),字节格式如下:
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 0 | SA0 | R/W# |
为从机地址提供扩展位。可以选择“0111100”或“0111101”作为SSD 1306的从机地址。D/C#引脚用作从机地址选择的SA0。“R/W#”位用于确定I2C总线接口的工作模式。R/W#=1,则处于读取模式。R/W#=0,则处于写入模式。
小结:一般选择的模式是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
注意数据位的构成是由构成
Co | D/C | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|
X | X | 0 | 0 | 0 | 0 | 0 | 0 |
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线在确认相关时钟脉冲的高电平期间被下拉。
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
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
首先低四位显示时钟分频比(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关:0<k<1直线绘制-中点算法 一.任务描述 根据下面要求,在右侧修改代码,绘制出预期输出的图片。平台会对你编写的代码进行测试。 1.本关任务 掌握一种基本图形元素光栅化算法,利用OpenGL实现直线光栅化的中点画线算法…...

java基础之面向对象的思想
一、面向对象和面向过程的编程思想对比 面向过程:是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的(自己干活)。 面向对象:是一种以对象为中心的编程思想,通过指挥对象实现具体的…...

红黑树的理解和简单实现
目录 1. 红黑树的概念和性质 2. 红黑树的插入 2.1. 情况一:新增节点的父亲为空 2.2. 情况二:新增节点的父亲非空且为黑色节点 2.3. 情况三:当父亲为红节点,叔叔存在且为红 2.3.1. 当祖父为根节点的时候 2.3.2. 当祖父不是根…...

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

【C语言项目】贪吃蛇(下)
个人主页~ 源码在Gitee仓库~ 上一篇贪吃蛇(上)~ 贪吃蛇 四、核心的实现游戏测试1、GameStart(1)控制台窗口大小和名字设置(2)光标隐藏(3)打印欢迎界面(4)创建…...
【Unity实战|热更】Addressable读取SO文件报错解决
情景再现 假定你有一个Unity工程,使用了HybridCLR和Addressable,SO文件存放在Addressable中。热更加载后进入游戏场景出现了SO文件读取报错: 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的含义是在查询数据的同时对所选的数据行进行锁定,以保证数据的一致性和并发控制。在并发环境下,多…...

Java后端实现对象与文件接收数据(minio测试)
实现思路: 1. 两个接口实现,一个接对象数据(file),一个接文件数据(json)。 2. json对象(base64String) 实体类信息 ,请求体统一接收 3. file, String name ,String password ,String name , Controller层接收 统一…...

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

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

python3.12.0 在Linux 制作镜像包 部署到docker 全过程
项目结构: 比如,在pycharm里需要运行 themain.py 1、上传Linux的目录结构: Dockerfile 文件需要制作: 这里是关键: #基于的基础镜像 FROM python:3.12.0 #代码添加到code文件夹 ADD ./EF_NFCS /code #设置code文…...

STM32理论 —— μCOS-Ⅲ(新)
文章目录 1. 任务调度器1.1 抢占式调度 μCos-Ⅲ全称是Micro C OS Ⅲ,由Micriμm 公司发布的一个基于C 语言编写的第三代小型实时操作系统(RTOS); RTOS 与裸机相比最大的优势在于多任务管理与实时性,它提供了多任务管理和任务间通信的功能&a…...
衢州知识付费系统报价,教师如何做精品课程?怎么创造精品课程?
精品课程对于学生的意义来说是不同的,越是精品让学习的人就越觉得值得,所以,做为教师来说,做出精品课程不仅仅是对学生负责,也是对自己负责,那如何做精品课程?相信很多教师们也想知道。 如何创造精品课程?…...
在Vue中,可以通过使用<slot>元素和name属性来创建具名插槽。这样您就可以为一个组件的不同部分定义不同的内容。 以下是一个简单的示例:
在Vue中,可以通过使用元素和name属性来创建具名插槽。这样您就可以为一个组件的不同部分定义不同的内容。 以下是一个简单的示例: <template><div><header><slot name"header"></slot></header><mai…...

C++笔试强训day19
目录 1.小易的升级之路 2.礼物的最大价值 3.对称之美 1.小易的升级之路 链接 模拟就行,唯一可能是难点得就是gcd(最大公约数) #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的安装包方式进行安装,下载成功后接下来对MySQL进行安装 下载后有一个以zip后缀结尾的压缩包文件 对于安装包方式安装,比起可视化安装省去了许多安装步骤,这里直接…...

04 贝尔曼最优公式
贝尔曼最优公式 前言1、Motivating examples2、Definition of optimal policy3、Bellman optimality equation(BOE):Introduction4、 BOE:Maximization on the right-hand side5、BOE:Rewrite as v f(v)6、Contraction mapping theorem7、BO…...
印象笔记使用技巧
印象笔记(Evernote)是一款广泛使用的笔记应用,它帮助用户整理个人信息、文件和备忘录。以下是一些提高在印象笔记中效率的使用技巧: ### 1. 使用标签和笔记本组织笔记 - **建立笔记本**:为不同的项目或类别创建笔记本…...

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

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

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协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: 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 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

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