OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4495|回复: 3

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

[复制链接]

1141

主题

1153

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4901
金钱
4901
注册时间
2019-5-8
在线时间
1249 小时
发表于 2021-12-16 15:05:32 | 显示全部楼层 |阅读模式
以下文章来源于:公众号开源电子网读取更多技术文章,请扫码关注




如何使用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口,具体情况如下:

         



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

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




第三步:初始化FSMC

       FSMC外设相关介绍可以参考LCD实验章节教程,这里就不展开说明参数的意义。
       首先定义SRAM的句柄
       SRAM_HandleTypeDefg_oled_handle;   /*SRAM句柄(用于控制OLED)*/
       其次还需要定义FSMC时序(读时序和写时序)相关的句柄
       FSMC_NORSRAM_TimingTypeDeffsmc_write_handle;
       FSMC_NORSRAM_TimingTypeDeffsmc_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的推文。带领大家玩转屏幕。

       链接:https://pan.baidu.com/s/151G8kANt2dwYpJ2TOIKLPA
       提取码:zdhz


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1023
金钱
1023
注册时间
2019-9-21
在线时间
269 小时
发表于 2021-12-16 15:23:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2022-3-14
在线时间
8 小时
发表于 2022-3-17 15:27:27 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

13

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-3-24
在线时间
3 小时
发表于 2022-3-27 19:52:12 | 显示全部楼层
“#define FSMC_ADDR_DATA          ((uint32_t) 0X6C000000 | (1 << 10))”
这里为什么要移动10位?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 21:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表