【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结

目录

  • SPI版
    • OLED SPI 端口定义
      • 七针OLED引脚定义
      • 六针OLED引脚定义
    • 软件SPI
    • 硬件SPI
      • 启用DMA
        • 帧率测试
  • I2C 版
    • 软件I2C
    • 硬件I2C
      • DMA

STM32F103VET6
STM32 Cube IDE


SPI版

OLED SPI 端口定义

本节引自STM32驱动0.96寸OLED液晶屏(12864液晶屏) —— 小牧同学
在这里插入图片描述
两种屏幕的引脚数不一样,左边的有7个引脚,而右边的只有6个。其次,端口的标号也不完全一样,第一个分别标为GND,VCC,D0,D1,RES,DC和CS第二个分别标为GND,VCC,SCL,SDA,RST,D/C。

七针OLED引脚定义

GND — 接地端口
VCC — 接3.3V电源端口
D0 — CLK时钟信号(等同于上面的SCL)
D1 — 数据端口(等同于上面的SDA)
RES — 复位端口(等同于上面的RST)
DC — 数据/命令选择引脚(等同于上面的D/C)
CS — 片选引脚(低电平有效,也就是所需要接低电平,我实际试验过不接该引脚也是可以正常使用的)

六针OLED引脚定义

GND — 接地端口
VCC — 接3.3V电源端口
SCL — CLK时钟信号端口
SDA — MOSI数据端口
RST — 复位端口
D/C — 数据/命令选择引脚

软件SPI

       指令解读见【51单片机快速入门指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制详解

       各引脚初始化如下,均为推挽输出:
在这里插入图片描述
       从【51单片机快速入门指南】5:软件SPI获取软件SPI程序。

修改控制电平的函数:

    GPIOx->BSRR = GPIO_Pin;GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;

由于我们需要的只是单向的、半双工的SPI,只需修改部分函数即可
在这里插入图片描述

       从SPI驱动0.96/1.3寸 OLED屏幕,易修改为DMA控制获取SPI版驱动程序。
将51特色的code改为const
在这里插入图片描述
修改对应引脚
在这里插入图片描述
修改延时函数
在这里插入图片描述
在这里插入图片描述
在主函数中添加测试程序:
在这里插入图片描述
如图,屏幕已轻松点亮。
在这里插入图片描述
帧率为180(见后文)
在这里插入图片描述
使用虚拟显存是时为46帧
在这里插入图片描述

硬件SPI

如图,使用硬件SPI
在这里插入图片描述
移除软件SPI的程序,修改OLED_WR_Byte函数
在这里插入图片描述

extern SPI_HandleTypeDef hspi1;
void OLED_WR_Byte(uint8_t dat, uint8_t cmd)
{OLED_CS_L();if (cmd)OLED_DC_H();elseOLED_DC_L();
//    SOFT_SPI_RW_MODE2(dat);HAL_SPI_Transmit(&hspi1, &dat, 1, 10);OLED_DC_H();OLED_CS_H();
}

再次测试:
在这里插入图片描述
成功点亮
在这里插入图片描述
帧率为410
在这里插入图片描述

在oled.h中启用虚拟显存
在这里插入图片描述
修改OLED_Refresh_Gram函数,实现1024 Byte 显存连续写入
在这里插入图片描述

extern SPI_HandleTypeDef hspi1;
void OLED_Refresh_Gram(void)
{
#if OLED_BUFFER_MODE
//    uint16_t i;OLED_Set_Pos(0, 128);
//    for (i = 0; i < Max_Row / 8 * Max_Column; i++)
//    {
//        OLED_WR_Byte(OLED_GRAM[0][i], OLED_DATA);
//    }OLED_CS_L();OLED_DC_H();HAL_SPI_Transmit(&hspi1, OLED_GRAM[0], Max_Row / 8 * Max_Column, 10);OLED_DC_H();OLED_CS_H();
#endif
}

再次测试,仍能成功点亮,帧率为969。
在这里插入图片描述

启用DMA

在这里插入图片描述

再次修改OLED_Refresh_Gram函数

extern SPI_HandleTypeDef hspi1;
void OLED_Refresh_Gram(void)
{
#if OLED_BUFFER_MODE
//    uint16_t i;OLED_Set_Pos(0, 128);
//    for (i = 0; i < Max_Row / 8 * Max_Column; i++)
//    {
//        OLED_WR_Byte(OLED_GRAM[0][i], OLED_DATA);
//    }OLED_CS_L();OLED_DC_H();
//    HAL_SPI_Transmit(&hspi1, OLED_GRAM[0], Max_Row / 8 * Max_Column, 10);HAL_SPI_Transmit_DMA(&hspi1, OLED_GRAM[0], Max_Row / 8 * Max_Column);while(hspi1.State != HAL_SPI_STATE_READY);OLED_DC_H();OLED_CS_H();
#endif
}

帧率测试

帧率的显示:
在这里插入图片描述
在1ms中断中统计1s内的帧数
在这里插入图片描述
在每次更新屏幕内容时FPS_Count自加1
在这里插入图片描述
这个帧率已经远远超过屏幕本身所能提供的刷新率了。
在这里插入图片描述

I2C 版

软件I2C

将SCL设为推挽输出,SDA设为开漏上拉输出
在这里插入图片描述

从【51单片机快速入门指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制详解和【51单片机快速入门指南】4: 软件 I2C获取控制程序。

修改对应引脚,其他部分同SPI的步骤。
在这里插入图片描述

//SCL拉高 移植时需修改
void I2C_SCL_H(void)
{OLED_SCL_GPIO_Port->BSRR = OLED_SCL_Pin;
}//SCL拉低 移植时需修改
void I2C_SCL_L(void)
{OLED_SCL_GPIO_Port->BSRR = (uint32_t)OLED_SCL_Pin << 16u;
}//SDA拉高 移植时需修改
void I2C_SDA_H(void)
{OLED_SDA_GPIO_Port->BSRR = OLED_SDA_Pin;
}//SDA拉低 移植时需修改
void I2C_SDA_L(void)
{OLED_SDA_GPIO_Port->BSRR = (uint32_t)OLED_SDA_Pin << 16u;
}//读取SDA 移植时需修改
uint8_t I2C_SDA_Read(void)
{OLED_SDA_GPIO_Port->BSRR = (uint32_t)OLED_SDA_Pin << 16u;i2c_delay();return ((OLED_SDA_GPIO_Port->IDR & OLED_SDA_Pin) == 0?0:1);
}

测试:
在这里插入图片描述
帧率约为60帧
在这里插入图片描述

硬件I2C

在这里插入图片描述
修改OLED_WR_Byte函数

extern I2C_HandleTypeDef hi2c1;
void OLED_WR_Byte(uint8_t dat, uint8_t cmd)
{if (cmd)HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS << 1, OLED_WriteData_Addr, I2C_MEMADD_SIZE_8BIT, &dat, 1, 10);elseHAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS << 1, OLED_WriteCom_Addr, I2C_MEMADD_SIZE_8BIT, &dat, 1, 10);
}

此时帧率为49
在这里插入图片描述
在这里插入图片描述
开虚拟显存模式,修改OLED_Refresh_Gram函数

extern I2C_HandleTypeDef hi2c1;
void OLED_Refresh_Gram(void)
{
#if OLED_BUFFER_MODE
//    uint16_t i;OLED_Set_Pos(0, 128);
//    for (i = 0; i < Max_Row / 8 * Max_Column; i++)
//    {
//        OLED_WR_Byte(OLED_GRAM[0][i], OLED_DATA);
//    }HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS << 1, OLED_WriteData_Addr, I2C_MEMADD_SIZE_8BIT, OLED_GRAM[0], Max_Row / 8 * Max_Column, 1000);
#endif
}

发现会更慢
在这里插入图片描述

DMA

在这里插入图片描述
开中断
在这里插入图片描述

再次修改OLED_Refresh_Gram函数

extern I2C_HandleTypeDef hi2c1;
void OLED_Refresh_Gram(void)
{
#if OLED_BUFFER_MODE
//    uint16_t i;OLED_Set_Pos(0, 128);
//    for (i = 0; i < Max_Row / 8 * Max_Column; i++)
//    {
//        OLED_WR_Byte(OLED_GRAM[0][i], OLED_DATA);
//    }
//    HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS << 1, OLED_WriteData_Addr, I2C_MEMADD_SIZE_8BIT, OLED_GRAM[0], Max_Row / 8 * Max_Column, 1000);while(hi2c1.State != HAL_I2C_STATE_READY);HAL_I2C_Mem_Write_DMA(&hi2c1, OLED_ADDRESS << 1, OLED_WriteData_Addr, I2C_MEMADD_SIZE_8BIT, OLED_GRAM[0], Max_Row / 8 * Max_Column);
#endif
}

如图,瓶颈应为400kHz的I2C速度
在这里插入图片描述

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

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

相关文章

网络工程师第五站-有线、无线同网段混合组网(多FAT案例)

本案例中用到的设备&#xff1a;路由器&#xff1a;cisco 2851交换机&#xff1a;cisco WS-C3750G-12S &#xff08;HX&#xff09;&#xff0c;接入&#xff1a;WS-C2960-48TC-LAP &#xff1a; 华为AP3010dn-AGN3750G 作为该网络核心交换机HX&#xff0c;前面的接口&#xff…

Jstat使用样例

jstat -gc pid //以字节形式展现 jstat -gcutil pid //以百分比形式展现 jstat -class pid //类加载和卸载状况 jstat -compilier pid //查看Jit编译的方法数及失败情况 jstat -printcompilation 4672 //打印最近编译的一个方法 转载于:https://www.cnblogs.com/ironroot/p…

便宜的手机图传遥控模块

目录测试程序FHDFPV.cFHDFPV.h应用效果STM32F103RC STM32 Cube IDE 大一时买的&#xff0c;当时是50元左右&#xff0c;很便宜&#xff0c;安卓上位机为FHDFPV 我买的型号波特率约为18464&#xff0c; 实测帧头为102&#xff0c;帧尾为153&#xff0c;前四个数为左右遥感对应…

使用pycharm配置flask项目,并使用git进行版本控制

https://blog.csdn.net/s1025491598/article/details/86609255 遇到的坑 (Mac pycharm 2018) 1. 在pycharm Terminal 命令窗口下&#xff0c;运行 git init mac下查看git安装目录&#xff0c;后解决

「Jenkins+Git+Maven+Shell+Tomcat持续集成」经典教程

Jenkins 是一个开源软件项目&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变得可能。现在软件开发追求的是效率以及质量&#xff0c;Jenkins使得自动化成为可能&#xff01; 亮点 采用shell自定义脚本,控制集成部署环境更加方便灵活精简war包中的li…

使用Altium Designer进行DDR2的PCB设计(转比较不错)

转载于&#xff1a;http://blog.csdn.net/snaking616/article/details/53981973 本文首先列出了DDR2布线中面临的困难&#xff0c;接着系统的讲述了DDR2电路板设计的具体方法&#xff0c;最后给出个人对本次电路设计的一些思考。本次设计中CPU的封装为BGA844-SOC-Y&#xff0c;…

【机器视觉学习笔记】OpenCV C++ 与 HSV颜色模型

目录HSV颜色模型Opencv中的HSV获取颜色值的小工具平台&#xff1a;Windows 10 20H2 Visual Studio 2015 opencv_contrib-3.4.12 HSV颜色模型 本节内容摘自HSV模型及opencv应用 —— ponponon 这个模型中颜色的参数分别是&#xff1a;色调&#xff08;H&#xff09;&#xff…

win10 解决升级 WordPress 时提示”另一更新正在进行”

1. 确定 wordpress 目录的 users 权限为 完全控制。 2. https://www.wpdaxue.com/wordpress-update-problem.html 本文目录 [隐藏] 1情景再现2解决办法 WordPress 4.5 下载安装量已经超过 600 万&#xff0c;而第一个维护版本 WordPress 4.5.1 已发布&#xff0c;修复了 Wo…

【STC15库函数上手笔记】7、PCA与PWM

目录硬知识硬件知识CCP/PWM/PCA模块的结构软件知识PCA初始化函数PWM更新占空比函数测试程序PWM模式产生PWM信号main.c实验现象16位软件定时器模式模式产生PWM信号main.c实验现象捕获模式测量周期长度main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof…

不会几个框架,都不好意思说搞过前端: Vue.js - 60分钟快速入门

Vue.js——60分钟快速入门 Vue.js是当下很火的一个JavaScript MVVM库&#xff0c;它是以数据驱动和组件化的思想构建的。相比于Angular.js&#xff0c;Vue.js提供了更加简洁、更易于理解的API&#xff0c;使得我们能够快速地上手并使用Vue.js。 本文摘自&#xff1a;http://www…

指针以及内存分配

原文&#xff1a;http://blog.csdn.net/bizhu12/article/details/6532235 1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指…

mysql如何修改开启允许远程连接

关于mysql远程连接的问题&#xff0c;大家在公司工作中&#xff0c;经常会遇到mysql数据库存储于某个人的电脑上&#xff0c;大家要想连接mysql服务&#xff0c;装有mysql服务的电脑就必须开启远程连接 第一步&#xff0c;用dos连接上你的数据库&#xff0c;&#xff08;我这里…

Solidworks如何自动打开和关闭特征识别FeatureWorks

如果直接对已有的零件识别特征&#xff0c;可能会报错 删除多余的特征&#xff0c;先只保留一个输入&#xff08;注意没有必要连草图也删掉&#xff0c;草图不会影响识别特征&#xff0c;你识别完了之后草图再接着该拉伸拉伸&#xff0c;该切除切除&#xff09;&#xff0c;然后…

SPI驱动0.96/1.3寸 OLED屏幕,易修改为DMA控制

目录OLED SPI 端口定义七针OLED引脚定义六针OLED引脚定义驱动程序oled.coled.holedfont.h使用main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 DMA控制见【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、…

上传图片在页面上显示

看了别人写的 自己照着写了一下 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()"…

【STC15库函数上手笔记】9、硬件SPI

目录硬件知识库函数spi.cspi.h测试main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬件知识 摘自《STC15系列单片机器件手册》 STC15系列单片机还提供另一种高速串行通信接口——SPI接口。SPI是一种全双工…

中介者模式分析、结构图及基本代码

&#xfeff;&#xfeff;定义&#xff1a;用一个中介对象来封装一系列的对象交互。中介者使各对象不须要显式地相互引用。从而使其耦合松散&#xff0c;并且能够独立地改变它们之间的交互。适用地方&#xff1a;中介者模式一般应用于一组对象以定义良好可是复杂的方式进行通信…

WordPress 数据库结构及表字段作用解析

对于WordPress的开发可以说子凡已经是如痴如醉了&#xff0c;通过 WordPress 本身的开放性接口可以做到很多的事情&#xff0c;但是有些时候我们可能更喜欢直接查询数据库来实现某些 WordPress 没有提供的函数来实现目的&#xff0c;所以这时候我们就需要对WordPress 数据库的结…

硬件负载均衡设备介绍

最常用是F5 与citrix netscaler 负载均衡分全局负载均衡和本地负载均衡。 地负载均衡是指对本地的服务器群做负载均衡&#xff0c;全局负载均衡是指对分别放置在不同的地理位置、有不同网络结构的服务器群间作负载均衡。 循环DNS 就是每次解析域名时指向IP loop list 里的下一个…

【STC15库函数上手笔记】10、EEPROM

目录硬件知识基本介绍软件知识EEPROM多字节读函数EEPROM多字节写函数EEPROM扇区擦除函数函数测试main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬件知识 基本介绍 摘自《STC15系列单片机器件手册》 STC…