1.前言

近日在研究如何提高LCD的刷新率,修改程序发现LCD屏幕用的是模拟通信,所以刷新特别慢,在设置硬件SPI,并使用通过HAL库HAL_SPI_Transmit()函数发送数据后刷新率并没有提升,为此疑惑了很久。

对此研究了整整一两天,网上找到可能的答案并在此记录一下,网上说可能是“HAL库的HAL_SPI_Transmit()函数其实并没有这么快,建议改一下寄存器的方法试一试”,也许是HAL库并不完善,之后我尝试该方法,发现刷新率瞬间提高了。

设备芯片用的是STM32F103C8T6,目的仅仅是通过SPI发送数据给LCD屏幕,而手册规定STM32的SPI时钟最快是18MHz。对于STM32F103的SPI1接口时钟,由72M的PCLK2分频得到,所以分配系数大于等于4(72M/4 = 18M)。对于STM32F103的SPI2/3接口时钟,由36M的PCLK1分频得到,所以分配系数等于2时候达到最高速率,可以更快,但可能不稳定。

由于实验只是LCD刷屏或者实时显示大字体文字刷新速率提高,没有CS片选信号,只需要两条线SCK和SDA。代码基于HAL库开发,只是在SPI配置上直接用寄存器写,小知识在正点原子的库函数和HAL库中写寄存器操作都是通用的,因为无论是标准库还是库函数都是实现对寄存器操作的封装。

2.SPI协议概括

  SPI协议简单介绍一下。SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线。

3.SPI相关代码

        spi.h

SDA连接PB15 SCK连接PB13(端口选择要根据自己的原理图修改,寻找支持SPI的引脚)

#ifndef __SPI_H
#define __SPI_H#include "sys.h"/* SPI接口定义 */
#define SPI_INTERFACE                SPI2
#define SPI_PRESCALER                SPI_BAUDRATEPRESCALER_2
#define SPI_CLK_ENABLE()             do{ __HAL_RCC_SPI2_CLK_ENABLE(); }while(0)/* 引脚定义 */
#define SPI_SCK_GPIO_PORT            GPIOB
#define SPI_SCK_GPIO_PIN             GPIO_PIN_13
#define SPI_SCK_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)#define SPI_SDA_GPIO_PORT            GPIOB
#define SPI_SDA_GPIO_PIN             GPIO_PIN_15
#define SPI_SDA_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)/* 操作函数 */
void SPI2_Init(void);
void SPI2_SetSpeed(u8 SpeedSet);
u8  SPI2_WriteData(u8 *TxData, u16 size);  #endif

spi.c

该文件在SPI的GPIO设置初始化中运用了HAL库,其他设置用寄存器,特别是函数编写部分。


#include "spi.h"/*** @brief       SPI接口初始化* @param       无* @retval      无*/
void SPI2_Init(void)
{GPIO_InitTypeDef SPI2_Init_Struct;/* 使能时钟 */SPI_CLK_ENABLE();SPI_SCK_GPIO_CLK_ENABLE();SPI_SDA_GPIO_CLK_ENABLE();/* 初始化SCK引脚 */SPI2_Init_Struct.Pin    = SPI_SCK_GPIO_PIN;SPI2_Init_Struct.Mode   = GPIO_MODE_AF_PP;SPI2_Init_Struct.Pull   = GPIO_PULLUP;SPI2_Init_Struct.Speed  = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(SPI_SCK_GPIO_PORT, &SPI2_Init_Struct);/* 初始化SDA引脚 */SPI2_Init_Struct.Pin    = SPI_SDA_GPIO_PIN;SPI2_Init_Struct.Mode   = GPIO_MODE_AF_PP;SPI2_Init_Struct.Pull   = GPIO_PULLUP;SPI2_Init_Struct.Speed  = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(SPI_SDA_GPIO_PORT, &SPI2_Init_Struct);RCC->APB1RSTR|=1<<14;   //复位SPI2RCC->APB1RSTR&=~(1<<14);//停止复位SPI2SPI2->CR1|=0<<10;//全双工模式  SPI2->CR1|=1<<9; //软件nss管理SPI2->CR1|=1<<8;  SPI2->CR1|=1<<2; //SPI主机SPI2->CR1|=0<<11;//8bit数据格式 SPI2->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1SPI2->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1  SPI2->CR1|=7<<3; //Fsck=Fcpu/256SPI2->CR1|=0<<7; //MSBfirst   SPI2->CR1|=1<<6; //SPI设备使能SPI2->I2SCFGR&=~(1<<11);//选择SPI模式SPI2_ReadWriteByte(0xff);//启动传输(主要作用:维持MOSI为高)     }void SPI2_SetSpeed(u8 SpeedSet)
{SpeedSet&=0X07;           //限制范围SPI2->CR1&=0XFFC7; SPI2->CR1|=SpeedSet<<3;  //设置SPI2速度  SPI2->CR1|=1<<6;      //SPI设备使能
} u8  SPI2_WriteData(u8 *TxData, u16 size)
{u16 i=0;for(i=0;i<size;i++){SPI2->DR=TxData[i];while((SPI2->SR&1<<1)==0);        //等待发送区空 }return 1;
}

接下来就是LCD部分代码,其实只要更改两个函数即可,因为其他写文字刷屏的函数都是基于这两个函数写数据的。

//写寄存器函数(命令)
void LCD_WR_REG(u8 cmd)
{   LCD_RS=0;//RS=0的时候写命令    SPI2_WriteData(&cmd,sizeof(cmd));
}//写LCD数据
void LCD_WR_DATA(u8 data)
{     LCD_RS=1;//RS=1的时候写数据       SPI2_WriteData(&data,siezof(data));
}

这些函数都是基于正点原子的历程修改的,硬件SPI加上后LCD刷屏速率应该会加快很多,其实可以更快就是加上DMA取数据。

硬件SPI+LCD增强屏幕刷新率相关推荐

  1. 修改手机屏幕刷新率_简谈手机屏幕的「高刷新率」

    >>>2020 苹果教育优惠来袭,购买就送 AirPods!社区晒单更有机会赢价值万元「AJ1 倒钩」潮鞋!点击进入苹果教育商店.(注意:若威锋 App 端无法直接点开链接,请尝试长 ...

  2. Android 10 (Android Q)中的屏幕刷新率(display refresh rate)切换方法和策略

           本文禁止转载,如有需求,请联系作者. 1. 屏幕刷新率和应用的显示帧率 首先请区分好屏幕刷新率(Panel Refresh Rate)和应用的帧率(APP Frame Rate)两个概念 ...

  3. echarts词云第一次出现不了数据要刷新才能出现_红米K30 4G版评测:1599元的120Hz屏幕刷新率...

    1599 元起.120Hz 屏幕刷新率.前置双挖孔屏.27W 快充,索尼 IMX 686 6400 万像素主摄,高通骁龙 730G 等等,这就是最新发布的 Redmi K30 4G,手机价格一出,一阵 ...

  4. 一秒点击屏幕次数_手机屏幕刷新率那点事儿!

    屏幕刷新率是指电子束对屏幕上的图像重新扫描的次数.刷新率越高,显示的画面稳定性就会越好,眼睛也就不会累. 屏幕有刷新率,我们的眼睛也有刷新率,所谓的人眼刷新率就是我们眼睛一秒看到的图像数量.到目前为止 ...

  5. 手机知识:90Hz或120Hz屏幕刷新率有啥区别,看完你就懂了!

    今天小编给大家介绍手机90Hz或120Hz屏幕刷新率有啥区别,看完你就懂了! 1.屏幕刷新率概念介绍 2.显示器的工作原理 简单来说,显示是通过向你显示一系列图像或"帧"来进行的. ...

  6. 摄像头 - 屏幕刷新率(Hz)与帧率(fps)的区别与关系

    帧数是指显卡在每秒内传输的图片的数量,也是GPU每秒钟能够刷新的次数,通常用FPS表示.每一帧都是显卡渲染出来的静止图像,帧数越高,所显示的画面就会越流畅.我们平时看到的动态图像其实是由一帧帧静止的画 ...

  7. ESP8266+MicroPython开发:ESP8266使用硬件SPI驱动TFT屏幕(ST7735)

    由于上次模拟SPI驱动TFT屏幕太慢,所以,本次采用硬件SPI来进行驱动,但是,当我直接把对应SPI接口更换时,发现TFT屏幕驱动并没有因此得到好转,依然是非常的满,然后只能从对应花点铺色,显示字符串 ...

  8. 多屏幕刷新率(refresh rate)模式下的帧显示流水线

    给Android应用和游戏开发工程师的最新参考. 长时间以来,手机显示屏幕的刷新率一直是固定的60Hz. 从2019年开始,由于游戏等应用对响应速度的需求越来越高,越来越多的手机开始在高刷新率(90/ ...

  9. 修改手机屏幕刷新率_到底高刷新率屏幕为智能手机带来什么?

    高刷新率屏幕 2019/4/30 当年乔布斯说道:"当你距离屏幕10-12英寸时,300以上的ppi就分辨不出像素点."显然,现在人们已经不再满足这"10-12英寸&qu ...

最新文章

  1. 使用nmonchart把.nmon文件转换成html
  2. 畅享云游戏,AWS云峰会邀你零距离体验强化学习!
  3. 计算机操作系统(7):进程的基本概念
  4. Redis工作笔记-List类型
  5. rust怎么拆除墙壁指令_拆除墙体前准备:区分承重墙与非承重墙,拆错影响整栋楼房...
  6. 20 Alarms, sigaction(), and Reentrant System Calls
  7. leetcode Valid Palindrome
  8. 聊一聊你了解的程序猿是什么样的?
  9. 【Axure原型】新闻资讯客户端APP原型 今日头条同类APP实战原型
  10. 批量打印word文档_如何安排打印Word 2007+文档
  11. 几分钟就可做出的酷炫PPT动画效果
  12. 题目:Frodo and pillows(二分)
  13. 老版本 linux 浮点,Linux-浮点运算
  14. HTL5 JavaScript里的DOM节点简单思维导图(元素节点,文本节点,节点的增删改查) 高清可打印
  15. 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51
  16. Nodejs 中的非阻塞I/O、异步和事件驱动
  17. 二、互联网思维之用户思维
  18. LightCMS1.3.7-RCE漏洞
  19. 网络RTK无人机上机测试
  20. 计算机应用基础0006 19春在线作业1,《计算机应用基础0006》19春在线作业1 为了实现自动控制处理 需要计算机具有的基础条件是...

热门文章

  1. 生成VBAK-UPD_TMSTMP的TIMESTAMP TIMESTAMPL示例
  2. 编程水平很高的程序员是如何训练出来的?
  3. [flink1.14.4]net.sf.ezmorph.Morpher
  4. PLC西门子电梯PLC程序,有单部六层,三部十层,六部十层等
  5. 前段时间一直不知道怎么学习,在网上找到一篇好文章分享给在路上的产品经理...
  6. 数据是企业的上帝之眼,企业经营过程中如何正确的使用数据?
  7. 温室大棚管理系统应用温室类型
  8. bridge 2021 64位中文版(资源管理器) v11.0.0.83直装版
  9. 说一说美国大学常用的课本吧,各位想自学的可以参考
  10. Python +tensorflow+pygame 破解任意字体反爬