当前位置: 首页 > news >正文

【蓝桥杯嵌入式】【模块】六、PWM相关配置及代码模板

 1. 前言

最近在准备16届的蓝桥杯嵌入式赛道的国赛,打算出一个系列的博客,记录STM32G431RBT6这块比赛用板上所有模块可能涉及到的所有考点,如果有错误或者遗漏欢迎各位大佬斧正。

本系列博客会分为以下两大类:

1.1. 单独模块的讲解

在这部分,我会分享自己总结的各个模块的相关配置、代码书写模板,涉及到的大致框架如下:

这个框架后续可能会不断更新,欢迎各位给出建议。

这一大类相关的文章链接如下(持续补充中):

【蓝桥杯嵌入式】【模块】一、系统初始化-CSDN博客

【蓝桥杯嵌入式】【模块】二、LED相关配置及代码模板-CSDN博客

【蓝桥杯嵌入式】【模块】三、LCD相关配置及代码模板-CSDN博客

【蓝桥杯嵌入式】【模块】四、按键相关配置及代码模板-CSDN博客

【蓝桥杯嵌入式】【模块】五、ADC相关配置及代码模板-CSDN博客

【蓝桥杯嵌入式】【模块】六、PWM相关配置及代码模板-CSDN博客

1.2. 蓝桥杯各届的真题、模拟题复盘及个人答案

在这一部分,我会分享个人练过的所有题的复盘思路及代码,每篇文章结构如下:

这一大类相关的文章链接如下(持续补充中):

【蓝桥杯嵌入式】【复盘】第13届国赛真题_蓝桥杯嵌入式13届国赛题-CSDN博客


以下是本篇博客正文内容:

2. 在cubemx中配置pwm

这里分别展示pwm输出和pwm捕获的配置方法,以13届国赛为例,用PA1捕获,用PA7输出:

2.1. 配置pwm捕获

配置pwm的捕获主要分为以下几步:

1. 首先将对应的io配置为定时器通道,因为pwm都是与定时器相关的,捕获和输入都与pwm的通道有关。

2. 在定时器中选择时钟源、并且将对应的通道配置为输入捕获模式。

3. 在下面的参数配置中,将预分频系数设置为(prescaler)设置为80 - 1(这个因人而异,我选80是因为好计算),重装载值设置为最大(避免一个周期未到便发生了捕获计数器清0)。 

4. 打开定时器的中断。

这里先简单讲讲pwm捕获的原理: 每捕获到pwm波的上升沿一次,就会进入中断函数,在函数内读出捕获计数器的值,便可以得到一个pwm周期内会计数的次数,用总频 / 分频系数 / 这个捕获值,得到的便是pwm频率。

2.2. 配置pwm输出 

配置pwm输出主要为以下几步:

1. 首先将对应的io配置为定时器通道。

2. 在定时器中选择时钟源、并且将对应的通道配置为pwm输出模式。

3. 在下面的参数配置中,将预分频系数设置为(prescaler)设置为10 - 1(选择10是因为这个值可可以使得pwm频率的调节在一个合适的分辨率下面),重装载值设置为4000(这个并不固定,这里设置为4000可以使得初始化时输出80000000 / 10 / 4000 = 2000hz的pwm)。


3. pwm输出特定频率及占空比

我的模板代码如下:

void pwm_init(void)
{HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
}void pwm_set_fre_duty_reg(uint32_t fre, uint32_t duty)
{uint32_t clk = 80000000;uint32_t div = 1;uint32_t period = clk / div / fre - 1;uint32_t pulse  = period * duty / 100;if (pulse > period) pulse = period - 1;// 设置周期与占空比TIM2->ARR  = period;TIM2->CCR2 = pulse;// 强制立即更新(如果启用了预装载)TIM2->EGR = TIM_EGR_UG;// 启用输出(CH2),如果已启用则忽略TIM2->CCER |= TIM_CCER_CC2E;// 启动定时器TIM2->CR1 |= TIM_CR1_CEN;
}

 这里的核心在于pwm输出频率及占空比部分,我采用了直接操作寄存器的办法,核心是对ARR和CCR2(代表通道2)寄存器做操作,通过改变定时器的重装载值以及捕获比较寄存器来改变pwm输出的频率及占空比。

ARR设置的是 计数器的最大值,当计数器数到这个值就会清零重启。

CCR2决定占空比,当计数器 < CCR2 时,PWM 输出为高电平;之后变低。

采用寄存器赋值是因为在之前的试卷实践中,我发现直接寄存器赋值比用库函数的效果更准确一些,不过这里也给出对应的库函数版本:

void pwm_set_fre_duty(uint32_t fre, uint32_t duty)
{uint32_t clk = 80000000;uint32_t div = 1;uint32_t period = clk / div / fre - 1;uint32_t pulse = period * duty / 100;if (pulse > period) pulse = period - 1; // 防止CCR超出ARR__HAL_TIM_SET_AUTORELOAD(&htim2, period);__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pulse);HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // 再启动
}

4. pwm捕获频率及占空比

float fre, duty;
uint32_t count1, count2, count_h1, count_h2;
uint32_t tmp1, tmp2;
bool is_rising = 1, is_first = 1; // 1:上升沿触发
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){if(is_rising){// 上升沿触发,进入高电平区间count1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);if(is_first){// 第一次上升沿,表示pwm起点count_h1 = count1;}else{// 第二次上升沿,表示pwm终点count_h2 = count1;// 计算频率tmp1 = (count_h2 > count_h1) ? (count_h2 - count_h1) : (count_h2 + 0xffffffff - count_h1);if(tmp1 != 0){fre = 80000000.0f / 80.0f / (float)(tmp1 + 1);}}is_first ^= 1;// 切换触发方式__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);}else{// 下降沿区间,高电平区间结束,可以开始计算占空比count2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);// 计算占空比tmp2 = (count2 > count1) ? (count2 - count1) : (0xffff + count2 - count1);if(tmp1 != 0){duty = (float)tmp2 / (float)tmp1;}// 切换触发方式__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);}is_rising ^= 1;}
}

对于频率的测量,实际核心就是去捕获一个周期pwm的计数差;

占空比的测量则要复杂一些,核心是测量高电平的计数时间,为此需要先捕获上升沿时的计数值,值,再捕获下降沿时的计数值,这依赖我们不断切换中断的触发方式。 

在上面的函数中没有采用滤波算法,导致频率测量有大概1%的误差,我尝试加入滑动均值滤波,发现结果没啥变化。


总结

本文主要介绍了pwm相关操作的模板代码,主要是pwm的cubemx配置、pwm输出、pwm捕获。

相关文章:

【蓝桥杯嵌入式】【模块】六、PWM相关配置及代码模板

1. 前言 最近在准备16届的蓝桥杯嵌入式赛道的国赛&#xff0c;打算出一个系列的博客&#xff0c;记录STM32G431RBT6这块比赛用板上所有模块可能涉及到的所有考点&#xff0c;如果有错误或者遗漏欢迎各位大佬斧正。 本系列博客会分为以下两大类&#xff1a; 1.1. 单独模块的讲…...

力扣-盛最多水的容器

1.题目描述 2.题目链接 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 3.题目解析 题目中的储水量两边差*短边高度。也就是说&#xff0c;两条边中&#xff0c;决定储水量的是短边的高度。 我们可以定义两个指针&#xff0c;一个在最左边&#xff0c;一个在…...

数据实时同步:inotify + rsync 实现数据实时同步

1 数据实时同步 在生产环境中&#xff0c;某些场景下&#xff0c;要将数据或文件进行实时同步&#xff0c;保证数据更新后其它节点能立即获得最新的数据。 数据同步的两种方式 PULL&#xff1a;拉&#xff0c;使用定时任务的方式配合同步命令或脚本等&#xff0c;从指定服务…...

C#学习第24天:程序集和部署

程序集知识点 1.程序集的基本概念 程序集是部署和版本控制的最小单位。它可以是可执行文件&#xff08;.exe&#xff09;或动态链接库&#xff08;.dll&#xff09;。包含元数据和清单&#xff08;Manifest&#xff09;&#xff0c;描述程序集的内容和依赖关系。 2.程序集清单…...

mac .zshrc:1: command not found: 0 解决方案

nano ~/.zshrc 使用自带的nano命令打开文件&#xff0c;修改后 Ctrl X 然后输入y 然后回车即可保存成功 一般情况下&#xff0c;不是常用这个命令&#xff0c;除非是遇到有问题的文件&#xff0c;才用&#xff0c; 例如 遇到下面的问题 /Users/xxli/.zshrc:1: command no…...

学习设计模式《十》——代理模式

一、基础概念 代理模式的本质【控制对象访问】&#xff1b; 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问&#xff1b; 代理模式的功能&#xff1a;代理模式是通过创建一个代理对象&#xff0c;用这个代理对象去代表真实的对象&#xff1b;客户端得…...

RestFul操作ElasticSearch:索引与文档全攻略

RestFul方式操作ES 索引库操作 创建索引库 PUT /索引库名称 {"mappings":{"properties":{"字段名":{"type":"字段类型","analyzer":"分词器","index":"是否参与搜索(布尔值)"},…...

OpenCV 图像读取与显示

一、知识点: 1、读取图像 (1)、Mat imread( const String & filename, int flags IMREAD_COLOR_BGR ); (2)、返回值: Mat&#xff0c;返回读取的图像。 若读取图像失败&#xff0c;则返回一个空的对象&#xff0c;对象.empty()为true。 (3)、参数filename: String是…...

Django快速入门篇

Django官网 https://docs.djangoproject.com/zh-hans/4.2/ 官方介绍 官方版本 推荐LTS版本&#xff0c;python3.9/3.10 djongo 每两年会出一个LTS版本 关于环节djongo&#xff0c;conda直接安装即可 conda create -n myenv python3.9 conda activate myenv pip install dj…...

C++23 新增扁平化关联容器详解

文章目录 一、引言已有关联容器回顾新容器的引入原因 二、std::flat_set定义与特性代码示例适用场景 三、std::flat_multiset定义与特性代码示例适用场景 四、std::flat_map定义与特性代码示例适用场景 五、std::flat_multimap定义与特性代码示例适用场景 六、与其他容器的比较…...

当PLC遇上电焊机器人:EtherCAT转CANopen上演工业级“语言翻译官”

在汽车自动化产线中&#xff0c;PLC与电焊机器人的高效协同是提升生产效率的关键。但PLC常用的EtherCAT协议与电焊机器人采用的CANopen协议存在通信壁垒&#xff0c;JH-ECT009疆鸿智能EtherCAT转CANopen技术成为打破这一障碍的核心方案。 应用拓扑图 EtherCAT是高速工业以太网协…...

LeetCode 1345. 跳跃游戏 IV(困难)

题目描述 给你一个整数数组 arr &#xff0c;你一开始在数组的第一个元素处&#xff08;下标为 0&#xff09;。 每一步&#xff0c;你可以从下标 i 跳到下标 i 1 、i - 1 或者 j &#xff1a; i 1 需满足&#xff1a;i 1 < arr.lengthi - 1 需满足&#xff1a;i - 1 …...

Linux bash shell的循环命令for、while和until

1、for命令 for命令&#xff0c;允许你创建一个遍历一系列值的循环&#xff0c;每次迭代都使用其中一个 值来执行已定义好的一组命令。 for var in list do commands done # 在list参数中&#xff0c;你需要提供迭代中要用到的一系列值。 # 可以通过几种不同的方法指定列表中的…...

三、【数据建模篇】:用 Django Models 构建测试平台核心数据

【数据建模篇】&#xff1a;用 Django Models 构建测试平台核心数据 前言我们要设计哪些核心数据&#xff1f;准备工作&#xff1a;创建 Django App开始设计数据模型 (Models)1. 通用基础模型 (可选但推荐)2. 项目模型 (Project)3. 模块模型 (Module)4. 测试用例模型 (TestCase…...

Mac如何允许安装任何来源软件?

打开系统偏好设置-安全性与隐私&#xff0c;点击右下角的解锁按钮&#xff0c;选择允许从任何来源。 如果没有这一选项&#xff0c;请到打开终端&#xff0c;输入命令行&#xff1a;sudo spctl --master-disable, 输入命令后回车&#xff0c;输入电脑的开机密码后回车。 返回“…...

云原生主要架构模式

云原生(Cloud Native)是一种利用云计算的优势来构建和运行可扩展、弹性和高效应用程序的方法。它不仅仅是技术的集合,更是一种架构和设计理念。本文将围绕你提出的几部分,深入探讨云原生主要的架构模式,帮助你理解如何利用这些模式构建现代化的应用。 1. 服务化架构模式(…...

Neon数据库:让Postgres更智能的选择!

Neon&#xff1a;革新的Serverless PostgreSQL解决方案 在当今快速发展的技术世界&#xff0c;数据库的效率和灵活性成为众多开发者关注的重中之重。Neon&#xff0c;以其独特的serverless架构&#xff0c;正引领着这一变革。本文将深入探讨Neon的独特构架、应用场景以及具体的…...

《Metasploit框架核心模块解析与安全防护实践》​

目录 ​​一、框架模块化设计与安全验证价值​​ ​​1. 漏洞验证模块&#xff08;Exploit Modules&#xff09;​​ ​​2. 安全评估模块&#xff08;Auxiliary Modules&#xff09;​​ ​​3. 安全响应模块&#xff08;Post-Exploitation&#xff09;​​ ​​4. 载荷安全…...

C#:多线程Task使用

一.Task与Thread Task是架构在Thread之上的&#xff0c;也就是说任务最终还是要抛给线程去执行。Task跟Thread不是一对一的关系&#xff0c;比如开10个任务并不是说会开10个线程&#xff0c;这一点任务有点类似线程池&#xff0c;但是任务相比线程池有很小的开销和精确的控制。…...

Nginx笔记

一、概述 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】&#xff0c;同时也是一个电子邮件代理服务器。正向代理服务的是客户端&#xff08;比如VPN&#xff09;&#xff0c;反向代理服务的是服务端。Nginx是多进程的&#xff0c;有一个Master进程控制多个Worke…...

小米便签源码部署流程

一、准备环境 1. 安装必要工具 Android Studio&#xff1a;最新稳定版&#xff08;需支持 Kotlin 和 Jetpack Compose&#xff09;。 JDK&#xff1a;建议 JDK 11 或更高&#xff08;通过 sdkman 或 brew 安装&#xff09;。 Git&#xff1a;用于克隆源码。 2. 配置国内镜像源&…...

DAY 30 超大力王爱学Python

知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 步骤 1&#xff1a;创建项目结构 …...

左右边界策略

这是一套完整的交易逻辑策略,涵盖了从函数定义、指标计算、信号生成到资金和仓位管理、加仓和减仓逻辑、以及止损和止盈逻辑的各个方面。 以下对该交易系统进行详细分析: 交易逻辑思路 1. 函数定义 - DZSell 和 DZBuy 函数:这两个函数用于计算卖出和买入的价格区间。它…...

iOS苹果和Android安卓测试APP应用程序的区别差异

在当今这个移动互联网时代&#xff0c;iOS和Android作为两大主流操作系统&#xff0c;它们在测试应用程序时存在哪些差异呢&#xff1f;这不仅是一个技术问题&#xff0c;也是一个市场策略问题。让我们从一个实际案例开始探讨。 假设我们有一个新的社交应用需要在iOS和Android…...

【Python装饰器深潜】从语法糖到元编程的艺术

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:基础计时装饰器案…...

Kubernetes中微服务JVM监控与自动发现的解决方案

以下是针对 Kubernetes 中微服务 JVM 监控与自动发现的解决方案,结合 Prometheus 的动态发现机制和 Spring Boot 的监控能力,解决 Pod IP 动态变化和当前微服务监控数据暴露匿名随意访问的安全问题。 一、微服务端配置(Spring Boot 微服务) 1. 依赖配置(pom.xml) <…...

mapbox进阶,纯前端geojson转shape,并将shape相关文件压缩成zip压缩包并下载

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式二、🍀纯前端geojson转…...

Oracle ASM Rebalance Power 了解

Oracle ASM Rebalance Power 了解 基本概念 ASM (Automatic Storage Management) 的 Rebalance Power 参数控制磁盘组重新平衡操作的速度和资源使用。当添加、删除或调整 ASM 磁盘时&#xff0c;ASM 会自动执行重新平衡操作来重新分布数据。 ASM_POWER_LIMIT 参数 作用 控…...

sqlite的拼接字段的方法(sqlite没有convert函数)

我在sqlserver 操作方式&#xff1a; /// <summary>///获取当前门店工资列表/// </summary>/// <param name"wheres">其他条件</param>/// <param name"ThisMendian">当前门店</param>/// <param name"IsNotU…...

深入解析 OpenManus:开源 AI 智能体框架的技术原理与实践

深入解析 OpenManus&#xff1a;开源 AI 智能体框架的技术原理与本地部署指南 在当今人工智能快速发展的时代&#xff0c;智能体&#xff08;Agent&#xff09;技术正逐渐成为推动自动化和智能化的关键力量。OpenManus&#xff0c;由 MetaGPT 团队开发的开源 AI 智能体框架&am…...

[面试精选] 0001. 两数之和

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个…...

CAP分布式理论

CAP分布式理论 文章目录 CAP分布式理论事务本地事务定义适用场景优点缺点 分布式事务一、分布式事务的定义二、分布式事务的标准与 CAP 理论的关系1. CAP 理论的核心内容2. CAP 理论对分布式事务的指导意义3. 分布式事务的其他关键标 三、总结&#xff1a;CAP 理论与分布式事务…...

如何管理和优化内核参数

Linux 系统中的内核参数&#xff08;Kernel Parameters&#xff09;对系统的性能、安全性和稳定性有很大影响。通过调整内核参数&#xff0c;可以优化系统性能、增强网络能力、调整内存管理等。管理和优化内核参数通常涉及以下几个步骤&#xff1a; 1. 查看当前内核参数 在 L…...

sgRNA的靶基因基因组如何获得? for 下游的 T7E1验证

愿武艺晴小朋友一定得每天都开心&#xff01; 1&#xff09;在基因组&#xff0c;靶标区域上下游&#xff0c;设计引物&#xff08;以Zfp532基因为例&#xff09;&#xff1a; a. NCBI&#xff08;Home - Gene - NCBI&#xff09;Gene 页面上输入&#xff1a;Zfp532。 b. 在新…...

人工智能+:职业价值的重构与技能升级

当“人工智能”成为产业升级的标配时&#xff0c;一个令人振奋的就业图景正在展开——不是简单的岗位替代&#xff0c;而是职业价值的重新定义。这场变革的核心在于&#xff0c;AI并非抢走工作机会&#xff0c;而是创造了人类与技术协作的全新工作范式。理解这一范式转换的逻辑…...

【前端开发】Uniapp日期时间选择器:实现分钟动态步长设置

技术栈 Uniapp Vue3 uView年份显示前后一年&#xff0c;分钟动态设置间隔 效果图 主体显示 <view class"uni-row selector" click"openPicker"><uni-icons color"#c0c4cc" type"calendar" size"22"></uni-…...

目标检测DN-DETR(2022)详细解读

文章目录 gt labels 和gt boxes加噪query的构造attention maskIS&#xff08;InStability&#xff09;指标 在DAB-Detr的基础上&#xff0c;进一步分析了Detr收敛速度慢的原因&#xff1a;二分图匹配的不稳定性&#xff08;也就是说它的目标在频繁地切换&#xff0c;特别是在训…...

榕壹云上门家政系统:基于Spring Boot+MySQL+UniApp的全能解决方案

一、项目背景&#xff1a;家政服务行业的数字化升级需求 随着城市化进程加快&#xff0c;居民对上门家政服务的需求持续增长。传统家政行业存在服务效率低、信息不透明、管理成本高的问题&#xff0c;亟需通过数字化工具实现服务标准化、流程自动化。榕壹云上门家政系统应运而…...

目标检测DINO-DETR(2023)详细解读

文章目录 对比去噪训练混合查询选择look forward twice 论文全称为&#xff1a;DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 提出了三个新的方法&#xff1a; 首先&#xff0c;为了改进一对一的匹配效果&#xff0c;提出了一种对比去噪训练方法…...

LLM笔记(十)vLLM(1)PagedAttention论文笔记

文章目录 PagedAttention论文笔记论文摘要概览1. 引言问题背景提出的解决方案主要贡献和成果 2. 背景2.1 基于Transformer的大语言模型2.2 LLM服务与自回归生成2.3 LLM的批处理技术 3. LLM服务中的内存挑战3.1 现有系统中的内存管理 4. 方法: PagedAttention 和 vLLMvLLM 系统概…...

5.20 note

不用if else实现递归 原代码 class Solution { public: int mechanicalAccumulator(int target) { if (target 0) return 0; // 终止条件&#xff1a;基准情况 return target mechanicalAccumulator(target - 1); // 递归累加 } }; 变形 class Solution { public: int…...

vuejs处理后端返回数字类型精度丢失问题

标题问题描述 后端返回数据有5.00和3.30这种数据&#xff0c;但是前端展示的时候返回对应分别为5和3.0&#xff0c;小数点后0都丢失了。 接口返回数据展示network-Response&#xff1a; 接口返回数据展示network-Preview&#xff1a; 错误数据效果展示 发现问题 浏览器接口…...

指令烧录ORIN NANO操作系统

1 概述 模组为ORIN NANO 4GB版本 Ubuntu系统为18.04虚拟机 说明&#xff1a;刷机过程会有重新连接USB的操作&#xff0c;烧写过程需要注意虚拟机提示&#xff0c;官方不建议使用虚拟机&#xff0c;建议直接使用ubuntu操作系统的机器。 2 下载烧录所需文件 进入到下载网址&am…...

每日算法刷题Day11 5.20:leetcode不定长滑动窗口求最长/最大6道题,结束不定长滑动窗口求最长/最大,用时1h20min

6. 1695.删除子数组的最大得分(中等) 1695. 删除子数组的最大得分 - 力扣&#xff08;LeetCode&#xff09; 思想 1.给你一个正整数数组 nums &#xff0c;请你从中删除一个含有 若干不同元素 的子数组**。**删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个 子…...

List介绍

什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法 Iterable也是一个接口&#xff0c;表示实现该接口的类是可以逐个元素进行遍历的&#xff0c;具体如下&#xff1…...

List更简洁的编码构建

List的链式构建需求 jdk1.8&#xff0c;编码时需要手动构建一个List 传统List构建方式 - 声明列表&#xff0c;依次添加元素&#xff1b; - 利用Arrays.asList方法声明并添加元素 //1 先声明创建 List<String> createList new ArrayList<>();//2 逐个添加元素 c…...

Java 单元测试框架比较:JUnit、TestNG 哪个更适合你?

Java 单元测试框架比较&#xff1a;JUnit、TestNG 哪个更适合你&#xff1f; 在 Java 开发领域&#xff0c;单元测试是保证代码质量的重要环节。而选择一个合适的单元测试框架&#xff0c;对于提升测试效率和代码可靠性至关重要。本文将深入比较 JUnit 和 TestNG 这两个主流的…...

变频器如何通过Profibus DP主站转Modbus RTU/TCP接入到上位机

变频器如何通过Profibus DP主站转Modbus RTU/TCP接入到上位机 在工业自动化领域&#xff0c;Profibus DP和Modbus RTU是两种常见的通信协议。Profibus DP广泛应用于工厂自动化&#xff0c;而Modbus RTU则常用于串行通信。当需要将支持Profibus DP的设备&#xff08;如变频器&a…...

ElasticSearch性能优化

ES基础概念介绍&#xff1a; 索引&#xff1a;类似于MySQL中的表&#xff0c;它是具有相同特征的一个数据集。文档&#xff1a;格式为JSON格式&#xff0c;类似于MySQL中的一条数据&#xff0c;它是数据存储的基本数据单元&#xff0c;每一条文档都有一个唯一的ID。查询&#x…...

pom.xml中的runtime

在 Maven 的 pom.xml 文件中&#xff0c;<scope> 元素可以指定依赖项的作用范围&#xff0c;而 runtime 是其中的一个作用范围值。以下是 runtime 作用范围的含义&#xff1a; 定义&#xff1a;runtime 作用范围表示该依赖项在编译时不需要&#xff0c;但在运行时需要。…...