如何使用FSMC让OLED屏幕刷新率飞起来?

以下文章来源于:公_众_号开源电子网
读取更多技术文章,请扫码关注
在这里插入图片描述

如何使用FSMC让OLED屏幕刷新率飞起来?

前言

这篇文章不过多描述OLED工作原理及驱动过程还有FSMC外设,仅从实用性出发,如何使用FSMC外设模拟8080时序驱动OLED屏幕,让刷新率飞起来。这里我们以正点原子战舰板OLED实验例程为基础,LCD例程为辅助。

使用FSMC模拟8080时序驱动OLED屏幕步骤如下:
1、确认IO连接关系
2、初始化IO口(配置为复用模式)
3、初始化FSMC
4、编写读写接口函数
5、编写OLED初始化函数
6、编写OLED画点和读点函数

第一步:确认IO连接关系

这时候我们并不是用战舰板OLED专用的插槽,而是使用LCD插槽一部分,具体如下:
在这里插入图片描述

(注意:F1系列大容量且引脚数目在100脚以上的芯片才有FSMC,MINI板并没有)
IO连接关系,可以通过查阅战舰板原理图知道相对应标号对应的IO口,具体情况如下:
OLED信号引脚 FSMC对应标号 MCU引脚 作用
RST RESET 复位引脚
CS FSMC_NE4 PG12 片选信号
RW FSMC_NWE PD5 写信号
RD FSMC_NOE PD4 读信号
DC(RS) FSMC_A10 PG0 数据/命令线
D[x] FSMC_Dx D[1:0]PD[15:14]
D[3:2]PD[1:0]
D[7:4]PE[10:7] 数据线(8根)

第二步:初始化IO口(配置为复用模式)

这里可以借鉴一下LCD实验中lcd.c文件中的HAL_SRAM_MspInit函数,并对没有用到的GPIO口进行删减,例如FSMC_D8~15可以删除。具体代码如下:
在这里插入图片描述

第三步:初始化FSMC

FSMC外设相关介绍可以参考LCD实验章节教程,这里就不展开说明参数的意义。
首先定义SRAM的句柄
SRAM_HandleTypeDef g_oled_handle; /* SRAM句柄(用于控制OLED) */
其次还需要定义FSMC时序(读时序和写时序)相关的句柄
FSMC_NORSRAM_TimingTypeDef fsmc_write_handle;
FSMC_NORSRAM_TimingTypeDef fsmc_read_handle;
然后对以上句柄结构体成员进行赋值,代码如下:
在这里插入图片描述

这里我们需要注意存储器的数据宽度是8位,因为正点原子的OLED模块的就是使用8根数据线。
通过HAL_SRAM_Init函数就可以完成FSMC的初始化,并且前面的HAL_SRAM_MspInit函数也会被执行。

第四步:编写读写接口函数

修改的函数就是OLED_WR_Byte函数,函数内部实现可以参考LCD例程,具体代码如下:
在这里插入图片描述

这里我们需要解决两个变量即FSMC_ADDR_DATA和FSMC_ADDR_CMD,这两个变量其实就是代表着是写数据还是写命令,作用和OLED_RS引脚作用是一样的。
怎么去确认这个地址呢?
在这里插入图片描述

这里跟LCD的地址有所区别,没有地址的偏移,是因为这里HADDR是字节地址,并且存储器的数据宽度也是8位,就不像LCD需要再乘2。
这里还有一个读接口函数,代码如下:
在这里插入图片描述

第五步:编写OLED初始化函数

这里主要是要发送初始化序列进行配置。
在这里插入图片描述

这里唯一的修改点就是0xC0修改成0xC8,即COM扫描方向改变了。

第六步:编写OLED画点和读点函数

画点函数,我们就不用大数组OLED_GRAM,我们采用的方式是先读取修改写入。
这里并没有实现读点函数,而是实现读页函数,因为我们读取的是一个页即一个字节,读操作是8080时序支持的,在IIC或者SPI通信接口是不支持的。这里我们看一下代码实现:
在这里插入图片描述

画点函数的实现:
在这里插入图片描述

除此之外,还要修改一下OLED_Clear函数,代码如下:
在这里插入图片描述

初始化OLED之后,进行清屏。

最后修改一下main函数。
在这里插入图片描述

紧接着就可以编译一下,注意我们需要添加stm32f1xx_hal_sram.c和stm32xx_ll_fsmc.c文件支持,最后你就会发现跟例程效果是一样的。
在这里插入图片描述

使用定时器还可以测试一下帧率,使用FSMC模拟8080时序驱动OLED,使用OLED_Clear函数测试,帧率可以达到1800多帧。
大家有正点原子的OLED屏幕可以下载测试一下,熟悉一下FSMC这个外设,附件也把工程提供给大家。后面更新一波如何在OLED上播放badapple的推文。带领大家玩转屏幕。

版权声明:本文为CSDN博主「正点原子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_55796564/article/details/122199877

生成海报
点赞 0

正点原子

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

【STM32Cube笔记】12-配置外部中断

【STM32Cube笔记】系列文章目录 1-基于STM32的VSCode入门级教程前言 2-STM32Cube安装教程 3-STM32CubeIDE汉化 4-STM32Cube配置时钟设置 5-跑马灯引脚配置 6-Cortex-M7内核基本配

stm32cubemx+HAL+串口接收中断

stm32cubemxHAL串口接收中断 在cubemx配置完串口和global interrupt后需要在keil中添加如下代码。 第一步:在main函数中添加接收中断标志位开启函数 HAL_UART_Receive_IT