STM32连续采样_STM32 - 利用双缓冲实现实时曲线显示(续)

247c76409e538604f8423c38cf12a5f1.png

前言

大概半个月之前捣鼓了下利用STM32实现实时曲线显示,中间又做了一点小改进和扩充,在这里更新一下:

  1. 利用DMA进行缓冲区到LCD GRAM的像素数据搬运
  2. 效果更好的曲线绘制策略

代码可以在这里找到:<写得比较乱,望谅解( ´・ω・)ノ(._.`)

curve_chart.c​github.com

使用DMA进行像素搬运

利用STM32 DMA的M2M(Memory to Memory)模式,实现像素数据从外置SRAM的双缓冲区到LCD GRAM的搬移。只需要把数据源(SRAM)和终点(LCD-GRAM)的虚拟地址交给DMA,DMA控制器即可自动通知FSMC控制两个外设进行数据交换。

DMA初始化:

DMA_HandleTypeDef 

双缓冲区像素更新:

void 

注意到DMA一次最多搬运65535个数据,这里我们分多次发出DMA请求,一次搬运65535个WORD == 65535 * 2 个RGB565像素,分几部分将双缓冲区的像素刷新到LCD的GRAM中。在每一次DMA传输请求发出后,得等它传完才能进行下一次传输。
虽然CPU还是得在这里挂起等待,不过,,DMA传得快啊!ヽ(•̀ω•́ )ゝ

如果你的双缓冲区数据量小于65535 * 4个字节,甚至可以把DMA配置成CIRCULAR模式,或者利用一个定时器中断隔一段时间整体刷新一次,这样就不用在这里挂起等待啦。对于
320x240这种小屏幕甚至可以把整个屏幕区域开辟双缓冲区,然后利用DMA一直刷新就好,反正一次就能把所有像素搬完。没错是有这种操作的

但我用的屏分辨率比较高,就emmmmmmm

效果更好的曲线绘制策略

之前我们直接在数据点对应的位置处画一个点, 最多在它的邻域多画几个点。这样对于“平滑”的波形显示效果还行,但是对于竖直方向有快速变化的信号(比如方波),这种绘制策略会产生视觉上的不连续性,看起来很丑就是了XD

9bb8cc5aa67ff009825cb5bc667b998a.png
网格表示像素,红色点表示数据点

解决思路很简单粗暴,把两个数据点之间的垂直间隔补上即可,在局部产生一种阶梯状的填充,是不是有点像信号与系统里面学的离散采样点恢复连续信号使用的零阶保持╮( •́ω•̀ )╭

7354562e28c2f675ffb8edb2c38ce0ac.png
灵魂画风了解一下,橙色为补上的像素点

好啦我们上代码!

void 

看到这里就要问了,这种绘制策略只是解决了y方向上数据点显示不连续的问题,那x方向呢?
我们默认传入的数据数组和绘图区域的宽度(即x方向上的像素数)一致,所以x方向我觉得十分OK!这不耍流氓吗,你怎么保证采集的数据刚好和图表的宽度一样多啊?
线性插值了解一下:

uint16_t 

q15_t arm_linear_interp_q15(q15_t * pYData, q31_t x, uint32_t nValues)
这个函数是ARM DSP库自带的线性插值函数,除了16位的q15_t还有其他数据类型的版本
不管原始数据点数比显示区域的宽度多还是少,都可以利用这样的线性插值得到数量和图表宽度刚好匹配的显示数据。

总结与效果演示

进行了这两个地方的小改进,不管是速度还是效果都比之前的版本更好了

99869175fe88127c94ad5fa0c464e2d3.png
https://www.zhihu.com/video/987057417087148032


欢迎吐槽与提建议,一起交流学习!

ฅ(๑ ̀ㅅ ́๑)ฅ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vmware虚拟机三种网络模式详解

原文来自http://note.youdao.com/share/web/file.html?id236896997b6ffbaa8e0d92eacd13abbf&typenote 我怕链接会失效&#xff0c;故转载此篇文章。通过这篇文章&#xff0c;我对之前疑惑的地方有了直观的理解&#xff0c;很多地方并没有自己动手实践&#xff0c;所以这篇…

ros 双wan配置_基于ROS搭建简易软件框架实现ROV水下目标跟踪(九)--程序解析之PWM波下发...

模块对应cabin_controllers/serial_to_mcu。模块实现的功能为监听网络中PWM矩阵信息&#xff0c;将其转换成十六进制数据通过串口下发至MCU&#xff0c;实现对推进器电机的控制。模块数据的串口通信借助了ros的serial工具包&#xff08;sudo apt-get install ros-melodic-seria…

2018php项目实战视频教程,2018PHP实战技术VIP在线学习视频课程

课程目录&#xff1a;1-1 疯狂讲义之web简介2-1 从搭建PHP开发环境开始2-2 第一个PHP程序2-3 PHP变量相关知识2-4 PHP数据类型2-5 PHP数据类型之进制转换2-6 PHP数据类型之浮点型2-7 PHP数据类型系统函数简介3-1 PHP数据类型字符串的声明与定义3-2 数据类型之数组、资源、null类…

Struts1.x在MyEclipse中的环境搭建和配置

2019独角兽企业重金招聘Python工程师标准>>> &#xff08;一&#xff09; 先解压Struts-1.3.10-all.zip的文件夹Struts-1.3.10-all备用 -> 打开MyEclipse -> 新建一个 web project -> 在工程名上按右键鼠标选 Properties -> 弹出 Properties 面板 …

iphone固件降级_iPhone无法开机怎么办?三种快速维修方法

苹果手机的流畅让许多用户为之买单&#xff0c;但毕竟是电子产品&#xff0c;难免会有一些故障&#xff0c;其中无法开机就是一个很头疼的问题&#xff0c;一方面担心手机报废&#xff0c;一方面担心修理费过高&#xff0c;而造成 iPhone 无法开机的原因有很多&#xff0c;这里…

strspn函数php,php strspn函数怎么用?

strspn()函数是PHP中的一个内置函数&#xff0c;语法为strspn(string,charlist,start,length)&#xff0c;用于返回在字符串中包含 charlist 参数中指定字符的数目。php strspn()函数怎么用&#xff1f;strspn() 函数返回在字符串中包含 charlist 参数中指定的字符数目。语法&a…

【转载】架构师需要了解的Paxos原理、历程及实战

原文链接&#xff0c;请参见&#xff1a;http://weibo.com/ttarticle/p/show?id2309403952892003376258 数据库高可用性难题 数据库的数据一致和持续可用对电子商务和互联网金融的意义不言而喻&#xff0c;而这些业务在使用数据库时&#xff0c;无论 MySQL 还是 Oracle&#x…

酷冷至尊官方psu计算工具_酷冷至尊为Raspberry Pi推出Pi Case 40机壳,提供被动散热、卖27美元起...

Raspberry Pi(树莓派)是众所周知的廉价Single Board Computer&#xff0c;虽然名字里面有个“电脑”&#xff0c;但与我们一般广泛认知的台式机不同&#xff0c;它基本都是裸着一块主机板来使用&#xff0c;显得很极客、创客&#xff0c;当然也还是有一些玩家自制或者小作坊给R…

一个websocket 可以多个页面创建吗_实战分享|给我一个Puppeteer,没有爬不了的网站

Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包&#xff0c;用来模拟 Chrome 浏览器的运行。我们团队从 Puppeteer 刚发布出来就开始成为忠实用户了(主要是因为 PhantomJs 坑太多了)&#xff0c;本文主要在介绍 Puppeteer 的同时&#xff0c;结合我们平时的实践…

c++ 工厂模式_大连中山融雪剂工厂自营工厂批发

摘要&#xff1a; 大连中山融雪剂工厂自营工厂大连中山 源头工厂一站式采购 直发 大量库存 优势柠檬酸 欢迎选购 柠檬酸(Citric Acid&#xff0c;简称CA)是一种重要的有机酸&#xff0c;又名枸橼酸&#xff0c;分子式C₆H₈O₇&#xff0c;无色晶体&#xff0c;常含一分子结晶水…

开源Registry项目Harbor源代码结构解析

2019独角兽企业重金招聘Python工程师标准>>> 上周我们介绍了Harbor开源企业级容器Registry的架构&#xff0c;获得了社区很多朋友的反馈和建议&#xff0c;再次一并感谢&#xff0c;希望和大家一起&#xff0c;共同建设一个优秀的开源项目。本文请Harbor项目工程师尹…

苹果怎么关闭系统自动更新_你经过我的同意了吗?论手机系统自动更新

说起手机系统的更新&#xff0c;相信大致是有两个党派&#xff0c;一个是有出必追&#xff0c;第一时间更新到最新系统&#xff0c;体验新特性&#xff0c;修复已知BUG&#xff0c;二就是保守派&#xff0c;认为买来时自带的系统版本即是最好用的&#xff0c;不喜升级&#xff…

mysql手动安装配置,mysql8.0.11 winx64手动安装配置教程

首先跟大家唠一唠家常&#xff0c;随着MySQL迅速的更新&#xff0c;MySQL突飞猛进已经更新到了8.0版本&#xff0c;那么它和我们之前用的5.X版本有什么明显的区别那?首先给大家看下MySQL5.X自带表的查询速度之后献上MySQL8.0的自带表的查询速度一样的数据结果显而易见&#xf…

苹果照片未删却不见了_iPhone手机照片不见的解决方法

遇到iPhone手机中的照片不见了这种问题&#xff0c;相信大家都很着急&#xff01;不过着急也没用&#xff0c;照片也不会自己回来&#xff0c;SO!跟着清弦瞧瞧下面几种iPhone手机照片不见的解决方法吧&#xff01;一、ios系统BUG&#xff1a;iPhone系统有时会出现一些BUG&#…

windows azure虚拟机创建——快速创建,库模板创建

在 Windows Azure 上创建新虚拟机是一件非常轻松的事情。只需使用浏览器访问 Windows Azure 管理门户&#xff0c;选择左侧的“虚拟机”选项卡&#xff0c;然后单击底部命令栏中的“新 建”按钮。这里我们有两种方式可以选择&#xff1a;快速创建创建虚拟机或者从库中选择模板来…

苹果屏幕一半失灵一半好的_佛说:一半一半(写的真好!)

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供读…

IntelliJ IDEA中文乱码解决办法

1. 预热 刚刚接触IntelliJ IDEA几天&#xff0c;在易用性方面的确比Eclipse好很多&#xff0c;比较智能&#xff0c;各种插件、工具都已经集成&#xff0c;和Mac OS X类似——开箱即用&#xff0c;并且在试用了之后在开源中国三折&#xff08;后悔2折的时候没有下手&#xff09…

css background 一半_CSS小技巧

点击上方蓝字 关注我们左右布局将内部的子元素加浮动&#xff0c;父元素清除浮动即可。代码&#xff1a;DOCTYPE html><html><head><title>testtitle><style type"text/css"> .big{ width: 300px; heig…

rsoft透射谱_基于Rsoft软件光纤光栅的仿真模拟

​光纤光栅无论在光纤传感领域还是光纤激光器方面被大量研究&#xff0c;那么如何在没有进行实体实验的情况下来进行光纤光栅的模拟呢&#xff0c;本案例主要利用光波导Rsoft仿真软件对光纤光栅进行模拟分析研究。相信这种方法很实用哦。仿真优点&#xff1a;操作简便&#xff…

oracle 静态监听 端口,侦听动态注册静态注册local_listener参数端口PORT

之前都是网上看过整理的&#xff0c;今天看到local_listener竟然一点印象都没有&#xff0c;太恐怖&#xff0c;索性再好好整理一下&#xff0c;避免再次忘记。一&#xff0e;什么是注册注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名&#xf…