STM32CubeIDE SPI LCD曲线显示

2023-11-03

随言:

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			5



int 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下载交流经验。感谢~!

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeIDE SPI LCD曲线显示 的相关文章

  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • Eclipse 中选定单词的括号

    几天前 我觉得这个问题很愚蠢 所以不要将其发布在这里 但即使在搜索了很多之后 我也没有找到合适的解决方案 对于那些使用过的人TextEdit 在 Mac 上 他们会完全知道我在说什么 在编码时 我只想在单词或一行上加上引号或括号 为此 我必
  • Spyder 未检测到导入的 python 文件中的更改

    我正在使用 Spyder 3 2 4 Python 3 6 Spyder 不会检测导入的 python 文件中的更改 例如 测试2 py def func return 5 测试1 py import test2 a test2 func
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 如何获取结构体中任意成员的位位置

    如何获取结构体中任意成员的位位置 在示例中 gt typedef struct BitExamStruct unsigned int v1 3 unsigned int v2 4 unsigned int v3 5 unsigned int
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • Aptana Studio 3 上的预览选项卡在哪里?

    我在 Windows PC 上使用 Aptana Studio 2 并有一个选项卡用于在 IE 上预览页面 另一个选项卡用于在 Firefox 上预览 但我切换到了 Aptana 3 我不知道是没有预览还是我没有找到它 是的 我在 stac
  • 如何使用 ClangCodeModel 插件在 QtCreator 中设置 C++ 标准?

    抱歉 如果这是一个愚蠢的问题 但我已经尝试了几乎所有的方法 现在正在用头撞墙 问题是 带有 Clang 代码模型插件的 QtCreator 4 8 0 beta for Windows 解析我的项目 为 C 98 而实际上它是 C 17 但
  • JavaScript IDE/编译器

    现在 我希望你们中的一些人能够理解我的要求 我是编程新手 我在 Codecademy com 上了解了 JavaScript 我使用 labs codecademy com 来编写 JavaScript 但它有限制 对于编程新手来说 我可以
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 将 C 函数与 ARM 汇编结合使用

    我见过人们在代码中使用 C 库中的 printf 的示例 如下所示 data balign 4 hello asciz Hello n text global main func main main ldr r0 hello msg bl
  • 在 spring 上下文中通过类路径引用文件

    我正在尝试设置org springframework beans factory config PropertyPlaceholderConfigurerspring bean 我有 jdbc propertiessrc main conf
  • IntelliJ IDEA - 分离编辑器窗口

    我最近从我的 IntelliJ 设置中删除了选项卡 因为有了可用于在文件之间导航的所有功能 谁需要它们 问题是 分离编辑器窗口的正常方法是将选项卡拖动到另一个屏幕 或区域 上 键映射中似乎没有任何用于分离编辑器窗口的内容 有没有办法通过键盘
  • 在 DataGrip JetBrains 中创建新数据库

    任何人都知道如何创建新数据库DataGrip https goo gl 99xqGb JetBrains 的数据库 IDE 找不到DataGrip 帮助页面 https goo gl pnFpGS In 数据夹2017 1 https bl
  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un
  • 有没有可以很好地处理模板的 C++ IDE?

    当使用与模板相关的内容时 我尝试过的每个 IDE 都无法提供代码完成功能 例如 boost shared ptr ptr ptr gt cursor is here 在这种情况下 是否有 IDE 可以提供代码补全功能 带有 Visual A
  • Delphi 2009 IDE结构视图折叠功能

    现在有谁知道折叠 Delphi 2009 IDE 结构视图中的所有项目吗 我不知道折叠所有项目 这使我很难从视图中找到我的课程 Thanks 选择根节点 类 并按数字键盘上的 除号 那会让一切崩溃 然后按数字键盘上的 加号 键 第一级将展开
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • 二叉树前序,中序以及后序的非递归算法实现(外加层序)

    二叉树前序 中序以及后序的非递归算法实现 外加层序 最近在学数据结构里面的二叉树 就把三个遍历的非递归算法以及层序遍历写了一下hhh 感觉就是用栈模拟了一下递归算法 其实三种遍历的方法大体相似 主要就是在访问节点值的时候对代码进行了部分改动
  • 代码质量度量标准_Google研发度量改进实践

    Google改进过程 本文案例源自 Measuring Engineering Productivity 作者 Ciera Jaspen Google 前言 随着敏捷开发 DevOps等方法论在软件行业持续运用 各种用来提升组织研发效率和产
  • Jmeter性能测试3——JMETER-脚本优化

    断言 作用 用于检查检测在测试中得到的响应结果是否符合预期 用以保证性能测试过程中数据交互与预期一致 主要是用来调试 真正执行压力测试时候 断言禁用 目的 在request 请求 返回层面加一层判断机制 实现的过程 在请求下添加断言 请求不
  • 如何解决python安装模块是出现的 error: Unable to find vcvarsall.bat

    看了一圈网上的 觉得知乎里面的答案是最好的 我觉得大部分问题在于python版本和vs版本不配对的问题 例如 python2 7会默认配对msvs2008 python3 4 和3 5是默认配对msvs2010 所以我电脑上python3
  • 【软件测试常见Bug清单】

    软件测试中 bug的类型有很多种 比如 代码错误 界面优化 设计缺陷 需求补充和用户体验等 一般情况下 需求补充和设计缺陷比较好区分 但是代码错误 界面优化和用户体验区分不是很明显 下面我们就来说说这三者 顺带整理一些常见的这些类型的bug
  • 【操作系统】王道考研 p22-26 生产者消费者问题、多生产者多消费者问题、吸烟者问题、读者写者问题、哲学家进餐问题

    生产者消费者问题 多生产者多消费者问题 吸烟者问题 读者写者问题 哲学家进餐问题 生产者消费者问题 有同步和互斥 同步 缓冲区没满才能放产品 缓冲区不空才能取产品 互斥 各进程互斥访问 关于PV P是消耗 V是释放 或理解为P是进 V是出
  • PCB相关知识总结-(1)PCB工艺

    开关电源PCB相关知识总结 PCB工艺 1 前言 2 基础概念 2 1 基本介绍 2 1 1 PCB的基板 2 1 2 相关术语 2 2 分类 2 3 正片和负片 2 4 过孔工艺 2 5 PCB阻焊颜色 2 6 PCB验收标准 1 前言
  • 纳秒是10^(-9),代码写法是1.0e-9不是10.0e-9

    纳秒是10 9 代码写法是1 0e 9不是10 0e 9 参考System nanoTime 简书
  • API 自动化测试难点总结与分享

    API自动化测试的难点包括 接口的参数组合较多 需要覆盖各种可能的情况 接口的状态和数据关联较多 需要验证返回结果是否符合预期 接口的并发访问和性能测试较为复杂 需要合理规划和调度测试策略 接口的安全性和权限控制较为重要 需要针对不同的用户
  • qt中的frame设置边框和颜色,里面控件不变

    需要指定样式对象 比如我的QFrame的名称是frame 2output 那么在设置样式的时候 其代码就如下 frame 2output border radius 10px border 1px solid rgb 100 100 189
  • Mvc项目实例 MvcMusicStore

    原文链接 http www cnblogs com wenming205 archive 2010 08 08 1795341 html 文章不错 看完之后搭建项目就没什么问题了 其他很多就是经验问题了 做过webform的 其实也就需要知
  • Unity关键概念

    Unity是一款跨平台的游戏引擎和开发工具 用于创建2D和3D游戏 交互式内容和应用程序 它提供了一个强大的开发环境 使开发者能够轻松地设计 开发和部署高质量的游戏和应用程序 以下是Unity的几个关键概念 游戏对象 Game Object
  • ubuntu盒盖不睡眠

    修改配置文件里对应的参数即可 需要root权限 需要重启 1 打开文件 etc systemd logind conf 能看到三个控制盒盖后动作的选项 HandleLidSwitch suspend HandleLidSwitchExter
  • 公司现有一个工作组workgroup,需要添加samba服务器作为文件服务器,并发布共享目录

    需求 公司现有一个工作组workgroup 需要添加samba服务器作为文件服务器 并发布共享目录 share 共享名为public 此共享目录允许所有员工访问 samba服务器配置流程 强调 先关闭selinux和防火墙 1 安装samb
  • 【stm32疑难杂症】:Error: L6218E: Undefined symbol TIM_Cmd (referred from timer.o).

    项目场景 在使用工程是发现问题 OBJ OLED axf Error L6218E Undefined symbol TIM Cmd referred from timer o OBJ OLED axf Error L6218E Undef
  • Windows一键清空回收站

    作为一个重度整洁患者 虽然生活较为邋遢 但是 桌面一定是整理的干干净净 桌面上的快捷方式没有几个 甚至打开计算机用的也是快捷键 那么就碰到了一个问题 回收站 它既不美观 又放在桌面上 甚至连快捷键都没有 那我删除的文件那该怎么清理 大家可能
  • KCF目标跟踪方法分析与总结

    KCF目标跟踪方法分析与总结 两个竖杠是什么数学符号 就是这个 这个符号叫做范数 它事实上是由线性赋范空间到非负实数的映射 在线性赋范空间中 它可以表示空间中的点与原点间的距离 两点间的距离也是用两点之差的范数来表示的 范数所满足的条件有
  • J2EE之自定义框架知识(下篇 综合运用增删改查)

    J2EE之自定义框架知识 下篇 综合运用增删改查 文章目录 J2EE之自定义框架知识 下篇 综合运用增删改查 前言 所需文件 1 将框架打成jar包 然后导入新工程 并且把框架的依赖jar包导入进去 1 1将框架打成jar包 1 2 导入所
  • 【51单片机学习笔记】基于STC11F04E的蜂鸣器音乐播放器

    微型播放器 基于STC11F04E的蜂鸣器控制 青岛科技大学 信息科学技术学院 集成162 Listen C 一 简介 1 任务需求 制作一个音乐播放器 能够播放生日快乐歌曲 2 制作原理 基于微控制器通过产生不同频率的方波使蜂鸣器发出特定
  • STM32CubeIDE SPI LCD曲线显示

    随言 spi lcd屏幕其实不适合用于曲线显示 数据传输太慢了而且传输数据过程还需传一些设置命令 但是需求来了 软硬件压榨一下也能做出来 硬件 STM32F407 1 54寸ST7789屏幕 STM32CubeIDE SPI配置速度最快 使