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…

dede plus ad js.php,织梦程序中plus文件作用介绍及安全设置

官方网站下载了Dedecms安装包以后&#xff0c;解压出来&#xff0c;有一个uploads文件&#xff0c;这里面的文件夹才是网站的安装文件&#xff0c;里面文件很多&#xff0c;今天织梦58就主要介绍下plus文件夹里面的各个功能模块&#xff0c;如果你只是做一个宣传网站的话&#…

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

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

Jquery实战——横纵向的菜单

横纵向的菜单效果&#xff0c;点击纵向菜单显示其子菜单。鼠标指向横菜单的时候。显示其子菜单&#xff0c;鼠标离开&#xff0c;子菜单隐藏。 HTML代码&#xff1a; <span style"font-size:18px;"><!DOCTYPE html> <html xmlns"http://www.w3.o…

基于php的工厂管理系统,PHP设计模式——工厂模式

工厂模式&#xff0c;工厂方法或者类生成对象&#xff0c;而不是在代码中直接new。 使用工厂模式&#xff0c;可以避免当改变某个类的名字或者方法之后&#xff0c;在调用这个类的所有的代码中都修改它的名字或者参数。示例&#xff1a;Test1.phpclass Test1{static function t…

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

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

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

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

php curl 关闭tcp连接,BASH CURL:顺序运行时,请勿关闭请求之间的连接

我正在尝试编写一个BASH命令,该命令使用CURL将GET请求发送到两个不同的网页,但使用相同的连接.对我来说,就像向登录页面发送GET请求以向服务器进行身份验证,然后第二个请求模仿自动重定向到主页,这将发生在Web浏览器中(通过元刷新标记).我需要链接请求,因为主页的内容(由服务器…

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

说起手机系统的更新&#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;快速创建创建虚拟机或者从库中选择模板来…

python 编程快速上手,Python编程快速上手

**部分 Python编程基础**章 Python基础1.1 在交互式环境中输入表达式1.2 整型、浮点型和字符串数据类型1.3 字符串连接和复制1.4 在变量中保存值1.4.1 赋值语句1.4.2 变量名1.5 **个程序1.6 程序剖析1.6.1 注释1.6.2 print()函数1.6.3 input()函数1.6.4 打印用户的…