STM32定时器简单采集编码器脉冲
MCU:STM32H723ZGT6
编码器:(欧姆龙)E6B2-CWZ1X;1000P/R;8根线信号线分别为 A+ A- B+ B- Z+ Z- 以及5V和GND;
- A 脉冲输出
- B 脉冲输出
- Z 零点信号 当编码器旋转到零点时,Z信号会发出一个脉冲表示现在是零位置 表示编码器转了1圈,可用来记录编码器转了多少圈,从而知道运行距离
采用定时器1的CH1(PE9)接A+和CH2(PE11)接B+;一般是定时器的通道1和2才能作为编码器输入口,对应编码器输出的两相。
串口1TX(PA9)、RX(PA10)打印输出信息;
编码器介绍
正交编码器(又名双通道增量式编码器),用于将线性移位转换为脉冲信号。通过监控脉冲的数目和两个信号的相对相位,用户可以跟踪旋转位置、旋转方向和速度。另外,第三个通道称为索引信号,可用于对位置计数器进行复位,从而确定绝对位置。
原理:增量型编码器通过内部两个光敏接受管将编码器的转向转化为A相和B相脉冲的时序和相位关系。编码器每转还输出一个Z相脉冲以代表零位参考位。
正转时:A相在上升沿时,B相是低电平;B相上升沿时,A相是高电平;A相在下降沿时,B相是高电平;B相下降沿时,A相是低电平;
反转时:B相在上升沿时,A相是低电平;A相上升沿时,B相是高电平;B相在下降沿时,A相是高电平;A相下降沿时,B相是低电平;可见正转和反转两者对应正好相反!
使用定时器编码器接口模式就是将A相和B相的所有跳变沿作为计数器的计数时钟,出现边沿信号时,计数自增(正转)或自减(反转)!
STMCubeMX配置
时钟树
debug
串口usart1
定时器TIM1
MCU代码
tim.c代码:
相关GPIO配置为配置为上拉输入模式
/* USER CODE BEGIN Header */
/********************************************************************************* @file tim.c* @brief This file provides code for the configuration* of the TIM instances.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "tim.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */TIM_HandleTypeDef htim1;/* TIM1 init function */
void MX_TIM1_Init(void)
{/* USER CODE BEGIN TIM1_Init 0 *//* USER CODE END TIM1_Init 0 */TIM_Encoder_InitTypeDef sConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};/* USER CODE BEGIN TIM1_Init 1 *//* USER CODE END TIM1_Init 1 */htim1.Instance = TIM1;htim1.Init.Prescaler = 0;htim1.Init.CounterMode = TIM_COUNTERMODE_UP;htim1.Init.Period = 65535;htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim1.Init.RepetitionCounter = 0;htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;sConfig.EncoderMode = TIM_ENCODERMODE_TI12;sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;sConfig.IC1Prescaler = TIM_ICPSC_DIV1;sConfig.IC1Filter = 0xF;sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;sConfig.IC2Prescaler = TIM_ICPSC_DIV1;sConfig.IC2Filter = 0xF;if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM1_Init 2 *//* USER CODE END TIM1_Init 2 */}void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(tim_encoderHandle->Instance==TIM1){/* USER CODE BEGIN TIM1_MspInit 0 *//* USER CODE END TIM1_MspInit 0 *//* TIM1 clock enable */__HAL_RCC_TIM1_CLK_ENABLE();__HAL_RCC_GPIOE_CLK_ENABLE();/**TIM1 GPIO ConfigurationPE9 ------> TIM1_CH1PE11 ------> TIM1_CH2*/GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);/* USER CODE BEGIN TIM1_MspInit 1 *//* USER CODE END TIM1_MspInit 1 */}
}void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle)
{if(tim_encoderHandle->Instance==TIM1){/* USER CODE BEGIN TIM1_MspDeInit 0 *//* USER CODE END TIM1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_TIM1_CLK_DISABLE();/**TIM1 GPIO ConfigurationPE9 ------> TIM1_CH1PE11 ------> TIM1_CH2*/HAL_GPIO_DeInit(GPIOE, GPIO_PIN_9|GPIO_PIN_11);/* USER CODE BEGIN TIM1_MspDeInit 1 *//* USER CODE END TIM1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 */
uint16_t Encoder_Get_CNT(void)
{return __HAL_TIM_GET_COUNTER(&htim1);
}/* USER CODE END 1 */
新添加的代码
__HAL_TIM_GET_COUNTER函数获取当前的CNT计数值!
/*** @brief Get the TIM Counter Register value on runtime.* @param __HANDLE__ TIM handle.* @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT)*/
#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT)
usart.c代码
/* USER CODE BEGIN Header */
/********************************************************************************* @file usart.c* @brief This file provides code for the configuration* of the USART instances.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usart.h"/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */UART_HandleTypeDef huart1;/* USART1 init function */void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 *//* USER CODE END USART1_Init 2 */}void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//** Initializes the peripherals clock*/PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1;PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16910CLKSOURCE_D2PCLK2;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK){Error_Handler();}/* USART1 clock enable */__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**USART1 GPIO ConfigurationPA9 ------> USART1_TXPA10 ------> USART1_RX*/GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN USART1_MspInit 1 *//* USER CODE END USART1_MspInit 1 */}
}void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspDeInit 0 *//* USER CODE END USART1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_USART1_CLK_DISABLE();/**USART1 GPIO ConfigurationPA9 ------> USART1_TXPA10 ------> USART1_RX*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);/* USER CODE BEGIN USART1_MspDeInit 1 *//* USER CODE END USART1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);return ch;
}/* USER CODE END 1 */
添加重定向函数,添加头文件#include "stdio.h"
勾选微库
main.c代码
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MPU Configuration--------------------------------------------------------*/MPU_Config();/* 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_TIM1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf("Init-ok!\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */uint16_t speed = 0;/* 使能编码器接口 */HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */speed = Encoder_Get_CNT();printf("cnt = %d\r\n",speed);HAL_Delay(500);}/* USER CODE END 3 */
}
串口打印
顺时针旋转计数值增加,逆时针旋转计数值减少!转一圈计数4000!
采用4倍频方式,即分别在A、B相波形的上升沿和下降沿计数,分辨率可以提高4倍!
想只测速,在不分方向的情况下,只需要用单片机随意选择一个信号线就行了,然后定时器边沿触发,检测脉冲计数,然后清零!
定时器编码器模式介绍
表中的TI1FP1信号可类比上文提到的A相,TI2FP2信号可类比B相;上升对应A/B相上升沿、下降对应A/B相的下降沿;
仅在TI1处计数,指在A相的跳变沿进行计数,不考虑B相的跳变沿;仅在TI2处计数,指在B相的跳变沿进行计数,不考虑A相的跳变沿;
在TI1和TI2处均计数,类似上文提到的正转反转的情况!
正转对应递增情况:TI1FP1信号(A相)上升(上升沿)低(B相低电平)、TI1FP1信号(A相)下降(下降沿)高(B相高电平);TI2FP2信号(B相)上升(上升沿)高(A相高电平)、TI2FP2信号(B相)下降(下降沿)低(A相低电平);
类似可分析反转情况!
分析:TI1上升(上升沿),TI2低,递增;TI2上升,TI1高,递增;TI1下降,TI2高,递增;TI2下降,TI1低,递增;可以看到抖动对计数没干扰!类似可分析反向递减的情况!
对应CH1或CH2的极性选择,这里CH1或者CH2某一个选择下降沿就会变成反相,如果两个又都选为FallingEdge,则又变回正常模式(反相的反相)!
相关文章:
STM32定时器简单采集编码器脉冲
MCU:STM32H723ZGT6 编码器:(欧姆龙)E6B2-CWZ1X;1000P/R;8根线信号线分别为 A A- B B- Z Z- 以及5V和GND; A 脉冲输出 B 脉冲输出 Z 零点信号 当编码器旋转到零点时,Z信号会发出一个脉…...
第 4 章:网络与总线——CAN / Ethernet / USB-OTG
本章目标: 深入理解三种关键通信总线(CAN、Ethernet、USB-OTG)的协议架构、硬件接口与软件驱动 掌握 STM32(或同类 MCU)中各总线的寄存器配置、中断/DMA 驱动框架 通过实战案例,实现基于 CAN 总线的节点通信、基于 Ethernet 的 TCP/IP 通信,以及基于 USB-OTG 的虚拟串口…...
【python进阶知识】Day 31 文件的规范拆分和写法
知识点 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 机器学习流程 - 数据加载:从文件、数据库、API 等获取原始数据。 - 命名参考:load_data.py 、data_loader.py - 数据探索与可视化:了解数据特性,初期…...
leetcode 162. Find Peak Element
题目描述 如果nums[i-1]<nums[i]并且nums[i]>nums[i1],那么nums[i]就是峰值。除此情况之外,nums[i-1]和nums[i1]至少有一个大于nums[i],因为题目已经保证相邻的元素不相等。坚持向上坡方向走一定能达到一个峰值,如果往两边走…...
2025系统架构师---案例题(押题)
1. 微服务相关的概念: 微服务是一种架构风格,它将单体应用划分为一组小服务,服务之间相互协作,实现业务功能每个服务运行在独立的进程中,服务间采用轻量级的通信机制协作(通常是HTTP/JSON),每个服务围绕业务能力进行构建,并且能够通过自动化机制独立的部署。 微服务有…...
t检验详解:原理、类型与应用指南
t检验详解:原理、类型与应用指南 t检验(t-test)是一种用于比较两组数据均值是否存在显著差异的统计方法,适用于数据近似正态分布且满足方差齐性的场景。以下从核心原理、检验类型、实施步骤到实际应用进行系统解析。 一、t检验的…...
使用 OpenCV 实现万花筒效果
万花筒效果(Kaleidoscope Effect)是一种图像处理效果,通过对图像进行对称旋转或镜像处理,产生具有多重反射和对称的艺术效果。它常用于视频编辑、视觉艺术、游戏设计等领域,为图像添加富有创意和视觉冲击力的效果。 在…...
Rocketmq broker 是主从架构还是集群架构,可以故障自动转移吗
RocketMQ Broker的架构与故障转移机制 RocketMQ的Broker架构同时采用了主从架构和集群架构,并且支持故障自动转移。下面详细说明: 一、架构类型 1. 集群架构 RocketMQ天然支持分布式集群部署 一个RocketMQ集群包含多个Broker组(每组有主从) 不同Bro…...
MySQL中添加一个具有创建数据库权限的用户
要在MySQL中添加一个具有创建数据库权限的用户,可按以下步骤操作: 1. 登录MySQL 使用拥有足够权限(一般是root用户 )的账号登录到MySQL数据库。在命令行输入: mysql -u root -p然后输入对应的密码,即可进…...
Go语言使用通义灵码辅助开发 - AI编程助手提升效率
一、引言 Go 语言以其高效性能和简洁语法,成为构建微服务、分布式系统及高性能后端的首选。对于有其他语言编程经验的开发者和初学者,入门 Go 语言时,如何快速开发第一个程序是关键。传统方式如慢慢摸索、向老师请教或查找资料,效…...
演示:【WPF-WinCC3D】 3D工业组态监控平台源代码
一、目的:分享一个应用WPF 3D开发的3D工业组态监控平台源代码 二、功能介绍 WPF-WinCC3D是基于 WPF 3D研发的工业组态软件,提供将近200个预置工业模型(机械手臂、科幻零部件、熔炼生产线、机加生产线、管道等),支持组态…...
Oracle资源管理器
14.8资源管理器 14.8.1资源管理器的功能和控制种类 传统意义上,系统的资源分配是由 OS 来完成的,但是对于数据库资源,OS 分配资源会带来一些问题。以 Linux 为例,最为突出的一个问题是:Linux 的资源调度是基于进程的&…...
下载Ubuntu 64 位
学习目标: 下载 学习内容: 学习时间: 学习时间为学习时间 学习时间筋肉人为学习时间future 内容为笔记【有时比较抽象,有时比较过于详细,请宽恕。作者可能写的是仅个人笔记,筋肉人future】 学习产出&…...
ubuntu14.04/16.06 安装vscode(实测可以用)
地址:https://code.visualstudio.com/updates/v1_38 选择deb 这个版本还支持ubuntu14.04和16.06 sudo dpkg -i code_1.38.1-1568209190_amd64.deb sudo apt-get install -f安装成功,正常使用...
Linux命令大全
前言:工作中或多或少都会用到Linux服务器,我为大家分享一下常用命令 一丶文件与目录操作 命令作用示例ls列出目录内容ls -l(详细列表)cd切换目录cd /homepwd显示当前目录路径pwdmkdir创建目录mkdir -p dir1/dir2(递归…...
spark的缓存提升本质以及分区数量和task执行时间的先后
文章目录 示例代码缓存效果分析第1次 user.count第2次 user.count——这里解释了spark缓存提升的本质原因关于分区数量和task数量以及task的执行流程有多少个分区就有多少线程task并发执行不同分区数量对计算效率的提升 示例代码 import org.apache.spark.storage.StorageLeve…...
SQL次日留存率计算精讲:自连接与多字段去重的深度应用
一、问题拆解:理解次日留存率的计算逻辑 1.1 业务需求转换 题目:运营希望查看用户在某天刷题后第二天还会再来刷题的留存率。 关键分析点: 留存率 (第一天刷题且第二天再次刷题的用户数) / 第一天刷题的总用户数需…...
PostgreSQL初体验
目录 一:PostgreSQL 1.简介 3.优势 4.架构 5.应用场景 6.结论 二:安装PostgreSQL 1.编译安装 三:PostgreSQL架构 1.PG的逻辑结构 2.PG的物理结构 前言 在数据驱动的时代,掌握 PostgreSQL 这一全球顶尖的开源关系型数据…...
Vue 3.0 Transition 组件使用详解
Vue 3.0 的 Transition 组件提供了一种简单的方式来为元素或组件的进入/离开添加动画效果。下面是使用<script setup>语法糖的实现方式。 1. 基本用法 使用场景:当需要为元素的显示/隐藏添加简单的淡入淡出效果时,这是最基础的过渡实现方式。 &…...
深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第三篇:Verilog实现I2C Master核
第三篇:Verilog实现I2C Master核 副标题 :从零构建工业级I2C控制器——代码逐行解析与仿真实战 1. 架构设计 1.1 模块分层设计 三层架构 : 层级功能描述关键信号PHY层物理信号驱动与采样sda_oe, scl_oe控制层协议状态机与数据流控制state…...
通义灵码助力JavaScript开发:快速获取API与智能编码技巧
一、引言 JavaScript 拥有丰富的 API 生态,从浏览器的 Web API 到 Node.js 的环境生态,为开发者提供了强大的工具和库。然而,面对如此庞大的生态系统,开发者常常需要花费大量时间翻阅文档来查找和学习如何使用这些 API。通义灵码…...
ubuntu kubeasz 部署高可用k8s 集群
ubuntu kubeasz 部署高可用k8s 集群 测试环境主机列表软件清单kubeasz 部署高可用 kubernetes配置源配置host文件安装 ansible 并进行 ssh 免密登录:下载 kubeasz 项⽬及组件部署集群部署各组件开始安装修改 config 配置文件增加 master 节点增加 kube_node 节点登录dashboard…...
如何看待镍钯金PCB在当代工业制造中的地位和应用?
随着电子科技的飞速发展,电路板作为电子设备的核心组成部分,其制造材料和工艺也在不断进步。镍钯金(NiPdAu)电路板因其独特的物理和化学性质,在众多领域得到了广泛应用。本文将探讨镍钯金电路板的主要应用领域…...
Datawhale PyPOTS时间序列5月第4次笔记
端到端学习:使用一个模型直接接受包含缺失值的数据。 brits_classification.py 完整代码如下: # brits_classification.pyfrom benchpots.datasets import preprocess_physionet2012 from pypots.classification import BRITS from pypots.nn.function…...
(05)数字化转型之生产制造:从通常的离散制造到柔性化生产的全景指南
当今制造业正经历着前所未有的数字化变革,从传统的离散制造到流程制造,再到新兴的项目制造和柔性制造,各种生产模式都在加速向智能化方向演进。本文将系统性地介绍制造业生产管理的完整体系,为企业数字化转型提供全面的方法论和实…...
JMeter 教程:JSON 断言的简单介绍
目录 JMeter 教程:JSON 断言的简单介绍【快速上手】 ✅ 什么是 JSON 断言? 🛠️ 使用前提 📄 JSON 断言添加步骤 步骤一:添加 JSON Assertion 📌 示例说明 ✅ 常用 JSONPath 写法速查 ✅ 断言结果查…...
RedissonClient主要功能概述
以下是 RedissonClient 提供的主要功能和特性的详细用法说明,结合代码示例和实际应用场景: 1. 分布式集合与映射 Redisson 提供了多种线程安全的分布式集合和映射,适用于分布式环境下的数据存储和操作。 RMap(分布式 Map&#x…...
USB学习【13】STM32+USB接收数据过程详解
目录 1.官方的描述2.HAL的流程把接收到的数据从PMA拷贝到用户自己定义的空间中 3.处理接收到的数据4.最后再次开启准备接收工作 1.官方的描述 2.HAL的流程 以上的官方说法我们暂时按下不表。 如果接收到数据,会激活中断进入到USB_LP_CAN1_RX0_IRQHandler࿰…...
更新2011-2025经济类联考 396-真题+解析 PDF
目录树: ├── 2011-2025经综-真题 │ ├── 2011年396经济联考综合能力真题 .pdf │ ├── 2012年396经济联考综合能力真题 .pdf │ ├── 2013年396经济联考综合能力真题 .pdf │ ├── 2014年396经济联考综合能力真题 .pdf │ ├── 2015年396经…...
string在c语言中代表什么(非常详细)
在 C 语言中,string 更多让人联想到的是 <string.h> 这个标准库。 <string.h> 库为我们提供了一系列用于操作字符串的函数接口,就像是一个功能强大的工具箱,让程序员能够方便地对字符串进行各种操作。 例如,当我们想…...
JIT即时编译器全面剖析:原理、实现与优化
引言 在现代软件开发领域,性能优化一直是开发者关注的核心问题之一。随着计算能力的提升和应用场景的多元化,如何提高程序运行效率成为技术发展的关键驱动力。即时编译器(Just-In-Time Compiler,简称JIT)作为一项革命性…...
电网中窃电分析:概念、算法与应用
一、引言 在现代电力系统中,窃电行为是一个严重影响电网经济运行和供电秩序的问题。窃电不仅导致供电企业的经济损失,破坏了电力市场的公平性,还可能对电网的安全稳定运行构成威胁,甚至引发安全事故。随着科技的不断进步ÿ…...
从零开始的嵌入式学习day24
标准IO 头文件需求: #include <stdio.h>1.fopen和fclose (1)fopen fopen的函数功能是打开一个文件。 首先看看fopen的函数声明: FILE *fopen(const char *path, const char *mode);第一个参数path是文件地址,传入的是不可变的字符…...
高级SQL技巧:窗口函数与复杂查询优化实战
高级SQL技巧:窗口函数与复杂查询优化实战 开篇:数据库开发中的挑战 在现代企业级应用中,数据库不仅是存储数据的核心组件,更是处理复杂业务逻辑的重要工具。然而,随着数据量和并发请求的不断增长,传统的S…...
C++修炼:map和set的使用
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...
ABC 355
D. Intersecting Intervals 首先思考两个区间相交会有哪些情况:有两种左右端点包含,一种大区间包含小区间。 但是反过来思考,两个区间不相交只会有两种情况:Ri < Lj 和 Rj < Li。非常典型的逆向思考 对左右端点升序排序后&a…...
正则表达式进阶(三):递归模式与条件匹配的艺术
在正则表达式的高级应用中,递归模式和条件匹配是处理复杂嵌套结构和动态模式的利器。它们突破了传统正则表达式的线性匹配局限,能够应对嵌套括号、HTML标签、上下文依赖等复杂场景。本文将详细介绍递归模式((?>...)、 (?R) 等࿰…...
芯片分享之AD5542性能介绍
产品特征: AD5541/AD5542均为单通道、16位、串行输入、电压输出数模转换器(DAC),采用2.7 V至5.5 V单电源供电。DAC输出范围为0 V至VREF DAC输出范围为0 V至VREF,保证单调性,提供1 LSB INL精度(16位)&…...
从零开始:Python 从0到1轻松入门
你是否曾好奇,那些能自动处理数据、搭建网站、甚至预测未来趋势的神奇程序是如何诞生的?答案或许就藏在 Python 这门简洁而强大的编程语言中!Python以其“代码即可读性”的设计哲学,成为全球开发者的心头好——无论是初学者入门&a…...
Linux线程互斥与同步(上)(29)
文章目录 前言一、资源共享问题多线程并发访问临界区与临界资源“锁”概念引入 二、多线程抢票并发抢票引发问题 三、线程互斥互斥锁相关操作解决抢票问题互斥锁的原理多线程封装互斥锁的封装 总结 前言 马上要结束了!!! 我们在学习 多线…...
深入解析 hping3网络探测与测试利器
一、什么是 hping3? 体量轻巧:安装包仅约 255 KB。协议多样:支持 TCP、UDP、ICMP、RAW IP 四种模式。灵活定制:可设置任意报文头、分片、Payload 长度;还支持伪造源地址、随机目标等高级操作。脚本化:集成…...
SPA模式下的es6如何加快宿主页的显示速度
SPA的模式下,宿主页是首先加载的页面,会需要一些主要的组件,如element-plus,easyui,devextreme,ant-design等,这些组件及其依赖组件,文件多,代码量大,可能导致…...
环境配置!
1.下载openEuler虚拟机和rocky虚拟机 下载好后,ping一下看一下手动配置的网络ok不,再把复杂密码改成自己能记住的简单密码 2.安装软件 下载yum源 也可以用阿里云的yum源 把里面的:%d全删了,然后把 #generic-repos is licensed …...
【VS Code】Qt程序的调试与性能分析
要对 Qt 程序进行性能分析和调试,尤其是使用像 Valgrind、Perf 或 GDB 这类工具时,通常需要结合开发环境(如 VS Code)与相关插件或命令行工具。 以下是一些常用的方法和步骤: 1. VS Code 调试 Qt 程序 所需配置&…...
记录学习的第三十六天
很久没写过博客了,今天又开始了。 今天很不错,了解了查分数组的实质。 还是做了一道滑动窗口的题,我什么时候才能刷完滑动窗口啊。...
ANSI V 级对夹球阀控制阀:高性价比零泄漏流体控制新选择-耀圣
ANSI V 级对夹球阀控制阀:高性价比零泄漏流体控制新选择 在化工、食品、给排水等工业领域,流体控制的精准性与密封性直接关乎生产安全与效率。ANSI V 级对夹球阀控制阀凭借零泄漏密封性能(ANSI VI 级标准)、紧凑的对夹式结构、亲…...
pcdn核心要素
开展PCDN业务最核心的是明确业务定位、保障网络与硬件基础、确保合规运营,并选择合适的盈利模式。以下是具体要点: 1. 明确业务定位与目标 内容类型适配:PCDN适合高并发、大流量的内容分发场景,如视频直播、点播、大文件下载等。…...
数据分析_主播考核指标体系搭建
作为一名合格的数据分析师,要同时具备逻辑框架搭建能力以及解决实际问题的经验。通过指标量化问题、监控业务健康度并驱动决策。以下是我搭建抖音电商主播考核指标体系时的一些经验,希望对大家有些帮助。 搭建主播能力考核指标体系需要结合直播业务的核心…...
联合索引失效情况分析
一.模拟表结构: 背景: MySQL版本——8.0.37 表结构DDL: CREATE TABLE unite_index_table (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,clomn_first varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMEN…...
ZYNQ Cache一致性问题解析与实战:从原理到创新优化
一、Cache一致性:多核系统的"记忆迷宫" 1.1 为什么需要关注Cache一致性? 在Zynq-7000系列SoC的双核ARM Cortex-A9架构中,每个CPU核心拥有32KB L1数据Cache和512KB共享L2 Cache。当两个核心同时操作共享内存时,可能会出现: #mermaid-svg-RD2USaYdR7mMPPIA {fon…...