硬件SPI+LCD增强屏幕刷新率

这篇具有很好参考价值的文章主要介绍了硬件SPI+LCD增强屏幕刷新率。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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;	//复位SPI2
	RCC->APB1RSTR&=~(1<<14);//停止复位SPI2
		
	SPI2->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=1
	SPI2->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1  
	SPI2->CR1|=7<<3; //Fsck=Fcpu/256
	SPI2->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取数据。文章来源地址https://www.toymoban.com/news/detail-598653.html

到了这里,关于硬件SPI+LCD增强屏幕刷新率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity垂直同步:帧率和刷新率

             帧率(英语:frame rate)是用于测量显示帧数的度量。测量单位为“每秒显示帧数”(frame per second,FPS)或“赫兹”,一般来说FPS用于描述视频、电子绘图或游戏每秒播放多少帧。         显示器的刷新率是指显示器每秒绘制新图像的次数。其单位为赫兹 (

    2024年02月08日
    浏览(50)
  • 位深度/像素/分辨率/图像大小的计算/帧率/刷新率

    有关图像的基本名词解释: 在记录数字图像的颜色时,计算机实际上是用每个像素需要的位深度来表示的。黑白二色的图像是数字图像中最简单的一种,它只有黑、白两种颜色,也就是说它的每个像素只有1位颜色,位深度是1,用2的一次幂来表示;考虑到位深度平均分给R,

    2024年02月11日
    浏览(47)
  • 游戏在小米设备上因自适应刷新率功能,帧率减半

    1)游戏在小米设备上因自适应刷新率功能,帧率减半 2)Lua在计算时出现非法值,开启Debugger之后不再触发 3)如何在Unity中实现液体蔓延的效果 这是第357篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学

    2024年02月06日
    浏览(39)
  • xrandr: error BadMatch (invalid parameter attributes) 无法设置自定义分辨率刷新率解决办法

    Manjaro KDE Nvidia 显卡 前几天在创建虚拟显示屏让 iPad 成为副屏时,我打算使用 xrandr 给虚拟显示屏自定义分辨率以及 144hz 的刷新率(为了与主屏幕同步) 但是当进行了如下操作后发生了RT报错: Manjaro系统下修改 /etc/X11/mhwd.d/nvidia.conf 其他linux发行版本系统可修改 /etc/X11/xorg.conf (如

    2024年01月24日
    浏览(38)
  • [桌面运维] 显示器 色准,色域,色深,分辨率,带宽,刷新率的基本概念,图像呈现的基本原理

    ⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 🙉联系作者🙈by QQ:813942269🐧 🌈致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事

    2024年02月13日
    浏览(48)
  • 解决小新13pro2020连接4k60hz显示器后,出现卡顿,查看刷新率只有30hz的问题

    我买了一台4k60hz的屏幕,手上的笔记本为轻薄本小新13pro2020 独显MX350版本,笔记本连上屏幕后,发现鼠标移动有拖影,打开和浏览网页出现卡顿情况。 通过分析,我意识到可能是显卡带不动导致的降低刷新率,于是在显示设置里查看,发现刷新率果然只有30hz。 但是原因并不

    2024年02月09日
    浏览(301)
  • ESP32 入门笔记08:1.54寸(240*240)彩色TFT 显示高清IPS LCD 屏幕 SPI接口

    TFT 一般指薄膜晶体管。 薄膜晶体管(Thin Film Transistor,简称TFT)是一种器件。 ZJY154T-PG04厚.pdf ST7789VW芯片手册.pdf (见资料下载处) ST7789屏幕驱动电路图 参考:ESP32 入门笔记01:乐鑫ESP32-DevKitC开发板信息、开发环境搭建以及学资料准备 参考:使用DOIT ESP32 DEVKIT V1驱动屏幕ST7789

    2023年04月12日
    浏览(64)
  • 单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕

    说明:此篇为学习记录。可能存在错误或者不足。如有问题请指出。 主控芯片:STM32F411CEU6 主控开发板:WeAct STM32F411CEU6最小系统板 TFT-LCD屏幕:合宙1.8寸TFT-LCD,驱动为ST7735s MDK版本:5,32 HAL库版本:1.27.1 STM32CubeMX版本:6.7.0 ST7735s支持8080并口,3线和4线串行接口,模块的驱动方

    2024年02月03日
    浏览(59)
  • 雅特力车规级MCU-AT32A403A开发板评测 06 GC9A01 SPI-LCD 1.28圆形屏幕

    雅特力车规级MCU-AT32A403A开发板评测 06 GC9A01 SPI-LCD 1.28圆形屏幕 AT32A403A Board开发板 1.28寸圆形彩色TFT显示屏高清IPS 模块240X240 SPI接口GC9A01 推荐一个屏幕资料参考网站 http://www.lcdwiki.com/1.28inch_IPS_Module 1.28寸圆形IPS彩屏,支持 RGB 65K色显示,显示色彩丰富 240X240分辨率,显示清晰

    2024年03月22日
    浏览(46)
  • ZYNQ7000 SPI LCD与Petalinux

    ZYNQ内部集成两个ARM Cortex A9核心,Xilinx也推出了Petalinux工具,与Vidado搭配可以方便地完成Linux的uboot、kernel、rootfs部署。 开发板上集成了HDMI,但是需要在FPGA中实现逻辑,但是实现之后占用了7010快一半的资源,多少有点离谱,而且HDMI还是不方便,所以就用linux内核中的fbtft驱动

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包