FPGA学习——按键消抖的两种实现方法
文章目录
- 一、按键消抖简介
- 1.1、为什么要按键消抖
- 二、C4开发板原理图
- 三、按键消抖源码
- 3.1、方案一(每当检测到下降沿便开始重新计数)
- 3.2、方案二(检测到第一次下降沿后便开始计数)
- 四、仿真代码及仿真波形图
- 五、拓展:按键消抖版按键控制LED状态
一、按键消抖简介
1.1、为什么要按键消抖
生活中常用的按键为机械按键,而机械按键在按下后就会产生按键抖动
按键抖动:按键抖动通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。当按下一次按键,可能在A点检测到一次低电平,在B点检测到一次高电平,在C点又检测到一次低电平。同时抖动是随机,不可测的。那么按下一次按键,抖动可能会误以为按下多次按键。
一般我们认为抖动存在时间保持在5-10ms左右,而在5-10ms后才会保持稳定,
因此我们很容易意识到可以通过延时采样稳定的按键信号进行消抖。而本次设计中博主在消抖后输出的是一个脉冲信号。
本文博主提出两种按键消抖的解决方案:
- 第一种:每当检测到下降沿便开始重复进行20ms计数
- 第二种:检测到第一次下降沿后,进行一次并只进行这一次20ms计数
第一种方案为博主自行编写,代码略显繁琐。第二种方案为博主老师的方法,较容易理解(但博主认为从第一次下降沿开始便检测有些许不太严谨),大家可以依据自己的喜好进行选择。
二、C4开发板原理图
由原理图可以看出,博主的开发板按键按下后低电平有效,博主接下来提供的代码请各位根据自己实际的开发板进行适当的修改
三、按键消抖源码
3.1、方案一(每当检测到下降沿便开始重新计数)
源码分析:
-
在方案一中,博主设计了key_r0、key_r1、key_r2三个中间寄存器,分别用于同步按键信号key_in并进行打两拍。大家可以认为同步打拍就是在时序电路中,分别将前一个信号的值寄存下来,第一次为同步,后续即为打拍(这里打一拍还是打两拍取决于各位,甚至只同步不打拍也可以进行下降沿检测)。
-
由于是在时序电路中进行非阻塞赋值,因此三个中间信号分别相差了一个时钟周期,而博主就是利用后两个信号进行下降沿检测,具体如图:
由波形图可以看出,我们可以通过key_r1取反并逻辑与上key_r2的运算,检测出下降沿就,即:assign nedge = ~key_r1 && key_r2
-
在本方案中,博主设计的20ms计数器在不断的计数,但是通过前面的分析我们得知,要想按键消抖,应该在检测到下降沿的时候才开始计数,因此博主在计时器中添加了检测nedge的条件,一旦检测到nedge就会自动将进行计数器清零,以此确保计数器检测到下降沿后是从0开始计数。
-
但大家又会想到,按键按下的时间如果远远大于20ms,计数器就会不止一次地计数到20ms,而我们也将采样多次,前文博主说道要求输出脉冲信号,因此在按键按下的低电平持续时间内会产生多个脉冲信号,并不符合要求。对此博主的解决方案是:在计数器计数到最大值-1(代码中是MAX - 2 因为计数是从0开始)时便输出脉冲信号,而一旦计数器计数到最大值(MAX - 1)便将cnt保持在最大值,从而避免产生多个脉冲。(最大值-1与最大值只相差一个时钟周期20ns,因此影响可以忽略不计)。
-
同时注意在一切条件都满足后,输出的key_out的值不应该置1。如果只是单纯置1,假设抖动后按键仍保持在高电平,或者松开按键时产生的释放抖动也会输出一个脉冲信号,很明显在这两种情况下是不成立的,因此key_out的值应该赋为key_in(或者三个中间信号均可)并取反(按键低电平有效需要取反),并且在一个时钟周期后置0(初始值为0)才是输出脉冲信号。
-
本方案每当检测到下降沿便会重新开始20ms计数
module key_filter(input wire clk ,input wire rst_n ,input wire key_in ,//按键输入信号output reg key_out //输出稳定的脉冲信号
);parameter MAX = 20'd1_000_000;reg [19:0] cnt_delay ; //20ms延时计数寄存器
wire add_cnt_delay ; //开始计数的标志
wire end_cnt_delay ; //结束计数的标志reg key_r0 ; //同步
reg key_r1 ; //打一拍
reg key_r2 ; //打两拍wire nedge ; //下降沿寄存器//同步打拍
always @(posedge clk or negedge rst_n) beginif(!rst_n)beginkey_r0 <= 1'b1;key_r1 <= 1'b1;key_r2 <= 1'b1;endelse beginkey_r0 <= key_in; //同步key_r1 <= key_r0; //寄存一拍key_r2 <= key_r1; //寄存两拍end
end//20ms计数器
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_delay <= 1'b0;endelse if(add_cnt_delay )beginif(nedge)begin //检测到下降沿从0开始计数cnt_delay <= 1'b0;endelse if(cnt_delay == MAX - 1'b1)begincnt_delay <= cnt_delay; //计数计满结束后保持,避免产生多个输出脉冲endelse begincnt_delay <= cnt_delay + 1'b1;endendelse begincnt_delay <= 1'b0;end
endassign nedge = ~key_r1 && key_r2; //下降沿检测
assign add_cnt_delay = 1'b1;
assign end_cnt_delay = add_cnt_delay && cnt_delay == MAX - 1'b1;//key_out脉冲信号赋值
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginkey_out <= 1'b0;endelse if(cnt_delay == MAX - 2'd2)begin //计数到最大值减1时产生按键脉冲key_out <= ~key_in;//不可直接置为1!!!!!!!!!endelse beginkey_out <= 1'b0;end
endendmodule
3.2、方案二(检测到第一次下降沿后便开始计数)
源码分析:
- 原理与第一种方案类似,但是此方案引入了中间变量flag,初始值为0,检测到下降沿后便将flag置为1,此时再将flag作为开始计数的条件,同时计满20ms后再将flag置为0,也就省去了在最大值-1时赋值key_out并保持计数器最大值的繁琐。
- 此方法与方案一的区别就在于,方案一相当于是在抖动过程中最后一次下降沿才开始计数,而此方案是在抖动过程中的第一次下降沿便开始计数。
/**************************************功能介绍***********************************
Date : 2023-07-26 14:43:33
Author : majiko
Version : 1.0
Description: 按键消抖模块(1位按键)
*********************************************************************************///---------<模块及端口声名>------------------------------------------------------
module key_filter( input clk ,input rst_n ,input key_in ,output reg key_down //输出脉冲信号(按键按下1次)
);
//---------<参数定义>--------------------------------------------------------- parameter TIME_20MS = 1000_000;//20ms//---------<内部信号定义>-----------------------------------------------------reg key_r0 ;//同步reg key_r1 ;//打两拍reg key_r2 ;wire n_edge ;//下降沿reg flag ;//计数器计数的标志信号(按键按下抖动标志)reg [19:0] cnt_20ms ;//20ms计数器wire add_cnt_20ms ;wire end_cnt_20ms ;//****************************************************************
//--同步打拍
//****************************************************************//同步,将key_in信号,同步到clk时钟域下面always @(posedge clk or negedge rst_n)begin if(!rst_n)beginkey_r0 <= 1'b1;end else begin key_r0 <= key_in;end end//打两拍always @(posedge clk or negedge rst_n)begin if(!rst_n)beginkey_r1 <= 1'b1;key_r2 <= 1'b1;end else begin key_r1 <= key_r0;key_r2 <= key_r1;end end//****************************************************************
//--n_edge
//****************************************************************assign n_edge = ~key_r1 & key_r2;//下降沿检测// assign p_edge = key_r1 & ~key_r2;//上升沿检测//****************************************************************
//--cnt_20ms
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_20ms <= 'd0;end else if(add_cnt_20ms)begin if(end_cnt_20ms)begin cnt_20ms <= 'd0;endelse begin cnt_20ms <= cnt_20ms + 1'b1;end endend assign add_cnt_20ms = flag;assign end_cnt_20ms = add_cnt_20ms && cnt_20ms == TIME_20MS - 1;//****************************************************************
//--flag
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)beginflag <= 'd0;end else if(n_edge)begin flag <= 1'b1;end else if(end_cnt_20ms)beginflag <= 1'b0;endend//****************************************************************
//--key_down
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)beginkey_down <= 1'd0;end else if(end_cnt_20ms)begin key_down <= ~key_in;end else begin key_down <= 1'b0;end endendmodule
四、仿真代码及仿真波形图
本次仿真较为随意,只是为了展示逻辑功能
源码:
`timescale 1ns/1ns
module tb_key_filter();reg clk ;
reg rst_n ;
reg key_in ;wire key_out; parameter CYCLE = 20;
always #(CYCLE / 2) clk = ~clk;initial beginclk = 1'b0;rst_n = 1'b1;key_in = 1'b1;#20rst_n = 1'b0;#20rst_n = 1'b1;#60key_in = 1'b0;#(30*CYCLE);$stop;
endkey_filter#(.MAX(10)) u_key_filter(.clk (clk ) ,.rst_n (rst_n ) ,.key_in (key_in ) ,.key_out(key_out)
);endmodule
仿真波形图:
可以看出,成功输出了一次脉冲信号key_out
五、拓展:按键消抖版按键控制LED状态
按键消抖模块:
module key_filter(input wire clk ,input wire rst_n ,input wire [3:0] key_in ,//按键输入信号output reg [3:0] key_out //输出稳定的脉冲信号
);parameter MAX = 20'd1_000_000;reg [19:0] cnt_delay ; //20ms延时计数寄存器
wire add_cnt_delay ; //开始计数的标志
wire end_cnt_delay ; //结束计数的标志reg [3:0] key_r0 ; //同步
reg [3:0] key_r1 ; //打一拍
reg [3:0] key_r2 ; //打两拍wire nedge ; //下降沿寄存器//同步打拍
always @(posedge clk or negedge rst_n) beginif(!rst_n)beginkey_r0 <= 4'b1111;key_r1 <= 4'b1111;key_r2 <= 4'b1111;endelse beginkey_r0 <= key_in; //同步key_r1 <= key_r0; //寄存一拍key_r2 <= key_r1; //寄存两拍end
end//20ms计数器
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_delay <= 1'b0;endelse if(add_cnt_delay )beginif(nedge)begin //检测到下降沿从0开始计数cnt_delay <= 1'b0;endelse if(cnt_delay == MAX - 1'b1)begincnt_delay <= cnt_delay; //计数计满结束后保持,避免产生多个输出脉冲endelse begincnt_delay <= cnt_delay + 1'b1;endendelse begincnt_delay <= 1'b0;end
endassign nedge = (~key_r1[0] && key_r2[0]) || (~key_r1[1] && key_r2[1]) || (~key_r1[2] && key_r2[2]) || (~key_r1[3] && key_r2[3]); //下降沿检测
assign add_cnt_delay = 1'b1;
assign end_cnt_delay = add_cnt_delay && cnt_delay == MAX - 1'b1;//key_out脉冲信号赋值
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginkey_out <= 4'b0000;endelse if(cnt_delay == MAX - 2'd2)begin //计数到最大值减1时产生按键脉冲key_out <= ~key_in;endelse beginkey_out <= 4'b0000;end
endendmodule
LED控制模块:
module led (input wire clk ,input wire rst_n ,input wire [3:0] key_in ,output reg [3:0] led
);parameter MAX = 15_000_000 ;
reg [25:0] cnt ;
reg [3:0] flag;always @(posedge clk or negedge rst_n) beginif(!rst_n)begincnt <= 1'b0;endelse if(cnt == MAX - 1'b1)begincnt <= 1'b0;endelse begincnt <= cnt + 1'b1;end
endreg [2:0] state ;always @(posedge clk or negedge rst_n)beginif(!rst_n)beginstate <= 1'b0;endelse if(cnt == MAX - 1'b1)beginstate <= state + 1'b1;endelse beginstate <= state;end
endalways@(posedge clk or negedge rst_n)beginif(!rst_n)beginflag <= 4'b0000;endelse if(key_in[0] == 1'b1)beginflag <= 4'b0001;endelse if(key_in[1] == 1'b1)beginflag <= 4'b0010;endelse if(key_in[2] == 1'b1)beginflag <= 4'b0100;endelse if(key_in[3] == 1'b1)beginflag <= 4'b1000;endelse beginflag <= flag;end
endalways @(posedge clk or negedge rst_n) beginif(!rst_n)beginled <= 4'b0001;endelse if(flag == 4'b0001)begincase(state)3'd0 : led <= 4'b0000;3'd1 : led <= 4'b0001;3'd2 : led <= 4'b0011;3'd3 : led <= 4'b0111;3'd4 : led <= 4'b1111;3'd5 : led <= 4'b0111;3'd6 : led <= 4'b0011;3'd7 : led <= 4'b0001;default:;endcaseendelse if(flag == 4'b0010 && cnt == MAX - 1'b1)beginled <= {led[2:0],led[3]};endelse if(flag == 4'b0100 && cnt == MAX - 1'b1)beginled <= {led[2:0],~led[3]};endelse if(flag == 4'b1000 && cnt == MAX - 1'b1)beginled <= 4'b1111;end
endendmodule
顶层模块:
module top_key_led(input wire clk ,input wire rst_n ,input wire [3:0] key_in ,output wire [3:0] led
);wire [3:0] key_out;key_filter u_key_filter(.clk (clk ),.rst_n (rst_n ),.key_in (key_in),.key_out (key_out)
);led u_led(.clk (clk ),.rst_n (rst_n ),.key_in (key_out),.led (led )
);endmodule
注意:led模块有一点问题,在key0跑马灯开始后再按下key1,key2时,呈现效果也许不是流水灯,因为跑马灯开始后led状态不再是4’b0001
六、参考资料
https://blog.csdn.net/weixin_43828944/article/details/122360794
相关文章:

FPGA学习——按键消抖的两种实现方法
文章目录 一、按键消抖简介1.1、为什么要按键消抖 二、C4开发板原理图三、按键消抖源码3.1、方案一(每当检测到下降沿便开始重新计数)3.2、方案二(检测到第一次下降沿后便开始计数) 四、仿真代码及仿真波形图五、拓展:…...

SecureCRT如何将复制的内容粘贴到word中仍然保持原有字体颜色
SecureCRT如何将复制的内容粘贴到word中仍然保持原有字体颜色 QQ 109792317 说明:当SecureCRT加载了配色文件后,输出的关键字会被不同颜色高亮显示,但是如果复制粘贴到word中会发现成了纯文本,字体颜色消失了。 如何保留 &#x…...
微信小程序分享页面代码
在微信小程序中实现分享功能需要以下几个步骤: 1. 在app.json文件中配置分享参数,例如标题、路径等。示例如下: json { "pages": [ "pages/index/index" ], "window": { "navigationBarTit…...

Hadoop 之 Hbase 配置与使用(四)
Hadoop 之 Hbase 配置与使用 一.Hbase 下载1.Hbase 下载 二.Hbase 配置1.单机部署2.伪集群部署(基于单机配置)3.集群部署1.启动 hadoop 集群2.启动 zookeeper 集群3.启动 hbase 集群4.集群启停脚本 三.测试1.Pom 配置2.Yml 配置3.Hbase 配置类4.Hbase 连…...
使用TensorFlow和VGG-19模型实现艺术风格迁移:一步一步打造你的数字艺术世界
在当下的AI领域,神经风格迁移是最富有创新性和艺术性的技术之一。这项技术可以将一种图像的风格迁移至另一种图像,创造出让人眼前一亮的视觉效果。这种转变所展现的技术之美,让我们深感人工智能所带来的可能性。本文将带领大家一步步通过TensorFlow和VGG-19模型实现风格迁移…...

FBX/GLTF在线转换
3Dconvert是一个可以进行3D模型格式转换的在线工具,并支持3D模型在线预览和转换成果下载。网站访问地址:3D模型在线转换。 1、上传3D模型文件 3D模型在线转换工具的使用非常便捷,首先在网站首页选择需要转换的目标格式,网站支持…...

Tensorflow(二)
一、过拟合 过拟合现象:机器对于数据的学习过于自负(想要将误差减到最小)。 解决方法:利用正规化方法 二、卷积神经网络(CNN) 卷积神经网络是近些年来逐渐兴起的人工神经网络,主要用于图像分类、计算机视觉等。 卷积:例如对图片每一小块像素区域的处理ÿ…...

NoSQL之 Redis 部署,配置与优化
文章目录 NoSQL之 Redis配置与优化一.关系数据库与非关系型数据库1.关系型数据库2.非关系型数据库3.关系型数据库和非关系型数据库区别4.非关系型数据库产生背景 二.Redis简介1.了解Redis2.Redis 具有以下几个优点3.Redis为何这么快 三.Redis 安装及应用1.Redis 安装部署2.Redi…...

汽车行业 Y 公司对接斯堪尼亚 SCANIA EDI 项目案例
斯堪尼亚是一家来自瑞典的重型车辆制造公司,成立于1891年,总部位于斯德哥尔摩,主要专注于生产卡车、客车和工业发动机,以及相应的服务与解决方案。斯堪尼亚的产品以其高品质、可靠性和先进技术而闻名。其卡车广泛应用于货运和运输…...
mysql到doris踩坑记录(如果有问题希望大家帮忙指出问题)
1安装mysql(该步骤晚上很多,不做记录) 2安装docker(同上) 3安装并部署doris(下载镜像步骤省略) sudo docker run -p 9030:9030 -p 8030:8030 -p 8040:8040 \-itd starrocks.docker.scarf.sh/starrocks/allin1-ubuntu 官网地址从 Apache Flink 持续导入 Flink-c…...

苹果11手机设置手机跟踪功能
苹果11手机设置手机跟踪功能,就算是手机丢了,也能通过查询手机定位在哪里。 第一步:点击Apple ID进入详情 第二步:点击“查找” 第三步: 第四步: 到了这步,就算是设置成功。 下面需要到官方查询…...

下拉框可筛选可树状多选组件
实际效果图片 父页面 <el-form-item label"转发:" :label-width"formLabelWidth" class"formflex_item"><el-select ref"select" :clearable"true" clear"clearSelect" remove-tag"r…...
【LeetCode】70.爬楼梯
题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2…...
c#中的Math.Ceiling和Math.floor()和Math.Round()
Math.Ceiling(),只要有小数就加1(小数部分不为0) 例如: Math.Ceiling(0.0) -> 0 Math.Ceiling(0.1) -> 1 Math.Ceiling(0.2) -> 1 Math.Ceiling(0.3) -> 1 Math.Ceiling(0.4) -> 1 Math.Ceiling(0.5) -> 1 Math.Ceiling(0.6) -> 1…...

C++day7(异常处理机制、Lambda表达式、类型转换、STL标准库模板、迭代器、list)
#include <iostream>using namespace std; template <typename T> class vector { private:T* first;T* last;T* end; public:vector():first(new T),last(first),end(first){cout<<"无参构造"<<endl;}//无参构造vector(T* f):first(f),last…...

性能优化问题
提升首屏的加载速度,是前端性能优化中「最重要」的环节,这里笔者梳理出一些 常规且有效 的首屏优化建议 1、路由懒加载 SPA 项目,一个路由对应一个页面,如果不做处理,项目打包后,会把所有页面打包成一个文…...

【云原生系列】云计算概念与架构设计介绍
1 什么是云计算 云计算是一种基于互联网的计算模式,在这个模式下,各种计算资源(例如计算机、存储设备、网络设备、应用程序等)可以通过互联网实现共享和交付。云计算架构设计的主要目标是实现高效、可扩展、可靠、安全和经济的计算…...
Swoole协程系统HTTP服务
先启动宝塔 /etc/init.d/bt start 源码参考 https://github.com/zhangyue0503/swoole/tree/main/4.Swoole%E5%8D%8F%E7%A8%8B 对于异步来说,我们需要监听事件,并且监听的进程是并发的,所以会有一个问题,那就是无法保证前后顺…...

SpringCloud学习路线(13)——分布式搜索ElasticSeach集群
前言 单机ES做数据存储,必然面临两个问题:海量数据的存储,单点故障。 如何解决这两个问题? 海量数据的存储问题: 将索引库从逻辑上拆分为N个分片(shard),存储到多个节点。单点故障…...
CMIP6数据处理及在气候变化、水文、生态等领域中的应用
目录 专题一 CMIP6中的模式比较计划 专题二 数据下载 专题三 基础知识 专题四 单点降尺度 专题五 统计方法的区域降尺度 专题六 基于WRF模式的动力降尺度动态降尺度 专题七 典型应用案例-气候变化1 专题八 典型应用案例-气候变化2 专题九 典型应用案例-生态领域 专题…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...