0.96寸OLED(二)SPI+DMA刷新OLED

news/2024/11/18 10:57:53/

SPI+DMA刷新OLED

文章目录

  • SPI+DMA刷新OLED
  • 原理简介
  • 一、修改缓存区大小
  • 二、修改SSD1306的指令
  • 三、替换原来的刷新函数
  • 验证结果


原理简介

OLED屏幕有三种刷新方式分别为页地址模式, 水平地址模式和垂直地址模式,。市面上厂家提供的历程为页刷新,这种刷新方式需要用户自己手动进行行列的切换,这种操作方式我个人感觉比较麻烦。三种刷新方式的具体方式可以参考厂家的文档。我这里参考了另一个人的博客,具体连接如下。
https://blog.csdn.net/gengyuchao/article/details/86608037
页地址
页地址模式
在这里插入图片描述
水平寻址模式
在这里插入图片描述
垂直寻址模式

可以发现如果我们采用水平地址寻址或者垂直地址寻址的话,只需要源源不断的发送数据就可以了,再结合DMA的话可以实现自动快速刷新,减轻处理器的负担。非常NICE!缺点就是必须整个刷一帧屏幕全屏幕,但是我们数据全部走DMA,所以还是划得来这个性价比的。


一、修改缓存区大小

uint8_t OLED_GRAM[128][8];//原大小为144 8,我也不知道为啥中景园这么写

把缓存区的大小修改为一帧的数量大小,128 64的分辨率,算下来正好128 8字节

二、修改SSD1306的指令

	    OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)OLED_WR_Byte(0x01,OLED_CMD);//OLED_WR_Byte(0x21,OLED_CMD);//设置列地址OLED_WR_Byte(0x00,OLED_CMD);OLED_WR_Byte(0x7f,OLED_CMD);   OLED_WR_Byte(0x22,OLED_CMD);//设置页地址OLED_WR_Byte(0x00,OLED_CMD);OLED_WR_Byte(0x07,OLED_CMD);

  修改为垂直地址寻址模式,设置列行的起始和结束地址。

三、替换原来的刷新函数

//更新显存到OLED	
void OLED_Refresh(void)
{
//    OLED_WR_Byte(0xb0,OLED_CMD); //设置行起始地址
//    OLED_WR_Byte(0x00,OLED_CMD);   //设置低列起始地址
//    OLED_WR_Byte(0x10,OLED_CMD);   //设置高列起始地址HAL_SPI_Transmit_DMA(&hspi1, (uint8_t *)OLED_GRAM, 128*8);
}

当然也可以修改DMA为循环模式,使得数据自动刷新。

    //hdma_spi1_tx.Init.Mode =DMA_NORMAL;hdma_spi1_tx.Init.Mode = DMA_CIRCULAR;//切换为循环模式

这样一来这个刷新函数甚至都不需要调用了,只要修改缓存区,数据自动发送,屏幕就跟着刷新了。

验证结果

  OLED_Refresh();//循环模式DMA要先开一次OLED_ShowPicture(0,0,128,64,BMP1,1);//之后就不要调用DMA函数了,自动就会刷新//只需要调用画图函数,OLED刷新函数不用调用了,舒服多了。

在这里插入图片描述

我这个图片显示有问题不清晰,是因为我的这块0.96OLED屏幕坏了,导致隔一行有一行没有的。后续我会整理好代码后发出来。


http://www.ppmy.cn/news/119535.html

相关文章

OLED代码详细解析

2019年7月29日 取模软件和相关代码在文末 之前解释了一下怎么在OLED显示汉字,大致就是先把想要显示的汉字的字模放在一个数组中,之后在主函数里一个一个把它调出来,那么这样汉字就显示出来了。 那么汉字显示是显示出来,那么你怎么…

0.96寸OLED(SSD1306)屏幕显示(一)——基础功能介绍

0.96寸OLED(SSD1306)屏幕显示 (一)基础功能介绍 (二)超长文字水平滚动 (三)屏幕垂直水平滚动 文章目录 前言 一、0.96寸OLED屏幕介绍 二、SSD1306驱动芯片 1)图像显示R…

在Unity中将运行时物体转换为预制体的代码实现

在Unity中,预制体(Prefab)是一种非常有用的功能,可以重复使用已经创建好的物体。但是,有时候我们可能需要在运行时动态地创建物体,并将其转换为预制体以便在其他场景中使用。本篇博客将介绍如何使用代码将运…

0.96寸OLED显示屏介绍续

0.96 寸OLED 显示屏使用方法 (以中景园电子的0.96 寸OLED 显示屏为例) 0.96寸OLED显示屏实物图 七针SPI/IIC 0.96寸OLED显示屏使用方法: 七针SPI/IIC 0.96寸OLED显示屏共有七个管脚,1~7 分别为 GDN、VCC、D0、D1、RES、…

SSD1315驱动的OLED

屏幕参数: 尺寸:0.96寸 分辨率:128*64 通信方式:I2C 模块内部驱动芯片:SSD1315 管脚定义:GND、VCC、SCK、SDA SSD1315 MCU 接口包含 8 个数据引脚和 5 个控制引脚。 下表总结了不同接口模式下的引脚分配。…

0.96寸OLED屏幕

(题外话)为什么选择寄存器来实现,对于初学者而言我非常建议从寄存器配置开始,主要是因为搞单片机本来就是一项接近于底层硬件的工作,不要嫌麻烦。了解硬件外设工作原理和配置过程会对以后的调试有很大帮助。更容易理解…

STM32F103系列_OLED屏幕(SSD1306、SSD1315驱动)SPI驱动【DMA】(高刷)

STM32F103系列_OLED屏幕(SSD1306、SSD1315驱动)SPI驱动【DMA】(高刷) 一、SSD1306和SSD1315二、电路原理图(SPI接法)三、STM32_SPI四、STM32_DMA五、代码OLED.cOLED.hOLED_Library.hDelay.h 六、调用方法例…

OLED(SPI)

为了复习OLED和超声波模块,做了OLED显示超声波测得的距离。 下面分别介绍二者如何使用: OLED我们选用7针 SPI作为通信方式,这种型号的OLED价格便宜,也方便使用。 上图淘宝也就是十几的价格。 一: 7针: 1…