STM32CubeIDE SPI LCD曲线显示

2024-02-10 14:38

本文主要是介绍STM32CubeIDE SPI LCD曲线显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随言:

spi_lcd屏幕其实不适合用于曲线显示。

数据传输太慢了而且传输数据过程还需传一些设置命令。

但是需求来了,软硬件压榨一下也能做出来。

硬件:

STM32F407 + 1.54寸ST7789屏幕

STM32CubeIDE:

SPI配置速度最快。使用硬件SPI发送。

ST7789手册:

翻一下ST7789这个屏幕显示驱动芯片的技术手册,看一下寄存器,有哪些能提升速度的。

看到0xC6这个寄存器可以设置屏幕刷新速度。那就设置成0x01,即111Hz.(不知道为什么设置119Hz黑屏)

编程:

现在就是软件优化了。

首先能确定一点的是,如果是全屏显示曲线,一般来说用画线函数LCD_DrawLine()画出曲线,

然后使用清屏函数LCD_Clear(),清除曲线,一直这样循环。

但是实际操作,由于数据传输太慢,会导致 屏幕的曲线一闪清屏一闪,基本不能看。

所以我们清除不能使用全屏清除这用需要发送大量数据的函数;转而使用反向画线即可清除曲线。

比如:背景是是黑色的,曲线是红色的,延时一下。然后清除曲线,此时重新把刚才画的曲线再在

屏幕上画一次,但是这是的曲线显示颜色换成和背景一样的黑色,画完后就和背景融为一体,即达到清屏目的。

这样由于发送数据少,清屏速度快,这样做完,至少完整显示曲线是人能看的。

代码:

// X轴上两相邻的两个坐标之间的x差值,X轴步进
#define		X_AXIS_STEP			5int main(void)
{/* USER CODE BEGIN 1 */uint16_t x1 = 0, x2 = 0;uint16_t y1 = 0, y2 = 0;uint32_t i = 0, index = 0;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_SPI1_Init();/* USER CODE BEGIN 2 */printf("Sudaroot\r\n");Lcd_Init();LCD_Clear(BLACK);HAL_Delay(1000);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){// 显示曲线for(i = 0, x1 = 0; x1 < (240 - X_AXIS_STEP); i ++, x1 += X_AXIS_STEP){x1 = i * X_AXIS_STEP;x2 = x1 + X_AXIS_STEP;y1 = data[index + i];y2 = data[index + i + 1];LCD_DrawLine(x1, y1, x2, y2, RED);}// 延时HAL_Delay(10);// 清空曲线for(i = 0, x1 = 0; x1 < (240 - X_AXIS_STEP); i ++, x1 += X_AXIS_STEP){x1 = i * X_AXIS_STEP;x2 = x1 + X_AXIS_STEP;y1 = data[index + i];y2 = data[index + i + 1];LCD_DrawLine(x1, y1, x2, y2, BLACK);}if((++index) >= (DATA_SIEZ - (240 / X_AXIS_STEP)))index = 0;/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

效果:

SPI_LCD曲线

进阶:

我的屏幕分辩率是240 x 240.

由于我显示的曲线至少需要240点以上才能看出曲线的完整趋势。

根据上面的代码设置X轴的步进为1 的话,还是会微微闪屏。

故还需要优化代码。

优化方向:

1、直接设置寄存器发送数据,不使用HAL的SPI发送接口。

2、减少发送过程的频繁调用函数开辟栈次数。

3、片选和数据等GPIO尽量也设置一次到位,不要频繁拉高拉低。

4、设置命令尽量少,数据尽量连续发送。

5、不要在刷新曲线的时候计算曲线等数据,应当在芯片空间的时候计算好下一次显示的曲线等数据。

5、由于X轴的步进为1的话,实际上就是画竖直线。那我也不用画线函数了,效率太低。

      改成用  指定区域填充颜色LCD_Fill()这个接口。最后把这个接口流程优化就可以了。

效果和上面的一样,只是刷X轴步进为1的时候一点都不会闪屏,曲线非常流畅。

最后的代码我还做了全局缩放、局部缩放和范围缩放。

演示局部缩放:SPI_LCD曲线缩放_哔哩哔哩_bilibili

SPI

源码链接:

spi-lcd-curve.rar_stm32spilcd-嵌入式文档类资源-CSDN下载

  全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!

 

 

这篇关于STM32CubeIDE SPI LCD曲线显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697372

相关文章

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if