【STM32】TIM2的PWM:脉冲宽度调制

PWM是一种周期固定,脉宽可调整的输出波形。

0.通用寄存器输出

1.捕获/比较通道1的主电路--中间部分

2.捕获/比较通道的输出部分--输出

3.通用定时器输出PWM原理

PWM波周期或者频率由ARR(就是要进递增/递减的值)决定,PWM波占空比由CRRx决定。

1.定时器的PWM输出功能介绍

1)通过定时器的中断,在isr中将一个GPIO引脚电平反转,可以实现PWM输出功能【麻烦,设置多】

2)定时器附带专用的PWM输出功能,定时器那边和某一个引脚绑定,然后定时器设置好了之后内部开始+1或者-1,然后时间到了之后不是产生中断,而是直接将绑定的引脚电平反转产生PWM输出。【CPU不参与,效率高】

1.占空比:脉宽(高电平)占总周期的比例

1)可以用来调制脉冲宽度--》脉冲宽度调制

2)占空比的调节,是通过比较值与计数器的大小差距,当两者的关系改变的时,会进行电平反转。

2.PWM频率

频率越大,切换速度越快,时间段越短

3.PWM占空比和周期

4.PWM1  VS  PWM2

2.专用PWM输出的实现原理

1.比较功能

1)所谓的比较原理,设计3个计数有关的寄存器:CMP(比较),CNT(计数器),ARR(存放计数原始值)

定时器有4个输出通道,每一个通道都有一个捕获/比较寄存器,将寄存器值(ARR)和计数器值(CNT)进行比较,通过比较结果输出高低电平,实现PWM信号输出。

高低电平的1和0可以进行设置

2)在输入捕获/输出比较功能中--都要使用同一个外部引脚

3)每一个定时器只有一个计数器,但是每一个通道都有自己的捕获/比较寄存器,因此对于一个定时器来说,4路输出的PWM频率(周期)都是相同的,而不同通道的占空比可以不同。

2.相关寄存器

1.TIMx_CNT(计数器),TIMx_ARR(自动重装载寄存器),TIMx_CCRn(捕获/比较寄存器)

TIMx_CCRn:是来选择哪一条通道

2.CCMR1,CCMR2,CCER:捕获/比较模式寄存器

CCMR1:处理了通道1和通道2

CCMR2:处理了通道3和通道4

CCER:配置要什么电平才是有效的

3.CR1,CR2,PSC

CR1,CR2:使能,开关

PSC:分频功能

3.标准库中相关的API

1.TIM_TimeBaseInit

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
{uint16_t tmpcr1 = 0;/* Check the parameters */assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));tmpcr1 = TIMx->CR1;  if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)||(TIMx == TIM4) || (TIMx == TIM5)) {/* Select the Counter Mode */tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;}if((TIMx != TIM6) && (TIMx != TIM7)){/* Set the clock division */tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD));tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;}TIMx->CR1 = tmpcr1;/* Set the Autoreload value *///要计数的值TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;/* Set the Prescaler value *///预分频参数TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;if ((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)|| (TIMx == TIM16) || (TIMx == TIM17))  {/* Set the Repetition Counter value */TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;}/* Generate an update event to reload the Prescaler and the Repetition countervalues immediately *///预分频器参数的改变TIMx->EGR = TIM_PSCReloadMode_Immediate;           
}

2.TIM_OC1Init(TIM_OCnInit)

TIM_OCn--->指的使用了哪一个通道

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
{uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;/* Check the parameters */assert_param(IS_TIM_LIST8_PERIPH(TIMx));assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));   /* Disable the Channel 1: Reset the CC1E Bit */TIMx->CCER &= (uint16_t)(~(uint16_t)TIM_CCER_CC1E);/* Get the TIMx CCER register value */tmpccer = TIMx->CCER;/* Get the TIMx CR2 register value */tmpcr2 =  TIMx->CR2;/* Get the TIMx CCMR1 register value */tmpccmrx = TIMx->CCMR1;/* Reset the Output Compare Mode Bits */tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC1M));tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC1S));/* Select the Output Compare Mode */tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;/* Reset the Output Polarity level */tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1P));/* Set the Output Compare Polarity */tmpccer |= TIM_OCInitStruct->TIM_OCPolarity;/* Set the Output State */tmpccer |= TIM_OCInitStruct->TIM_OutputState;if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)||(TIMx == TIM16)|| (TIMx == TIM17)){assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState));assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity));assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState));assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState));/* Reset the Output N Polarity level */tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NP));/* Set the Output N Polarity */tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity;/* Reset the Output N State */tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NE));    /* Set the Output N State */tmpccer |= TIM_OCInitStruct->TIM_OutputNState;/* Reset the Output Compare and Output Compare N IDLE State */tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1));tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1N));/* Set the Output Idle state */tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState;/* Set the Output N Idle state */tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState;}/* Write to TIMx CR2 */TIMx->CR2 = tmpcr2;/* Write to TIMx CCMR1 */TIMx->CCMR1 = tmpccmrx;/* Set the Capture Compare Register value */TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse; /* Write to TIMx CCER */TIMx->CCER = tmpccer;
}

3.TIM_OCInitTypeDef:OC的结构体

typedef struct
{
//选择TIM的模式uint16_t TIM_OCMode;        /*!< Specifies the TIM mode.This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */
//选择TIM的输出状态uint16_t TIM_OutputState;   /*!< Specifies the TIM Output Compare state.This parameter can be a value of @ref TIM_Output_Compare_state */uint16_t TIM_OutputNState;  /*!< Specifies the TIM complementary Output Compare state.This parameter can be a value of @ref TIM_Output_Compare_N_state@note This parameter is valid only for TIM1 and TIM8. */
//要进行比较的值uint16_t TIM_Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register. This parameter can be a number between 0x0000 and 0xFFFF */
//输出的极性uint16_t TIM_OCPolarity;    /*!< Specifies the output polarity.This parameter can be a value of @ref TIM_Output_Compare_Polarity */uint16_t TIM_OCNPolarity;   /*!< Specifies the complementary output polarity.This parameter can be a value of @ref TIM_Output_Compare_N_Polarity@note This parameter is valid only for TIM1 and TIM8. */uint16_t TIM_OCIdleState;   /*!< Specifies the TIM Output Compare pin state during Idle state.This parameter can be a value of @ref TIM_Output_Compare_Idle_State@note This parameter is valid only for TIM1 and TIM8. */uint16_t TIM_OCNIdleState;  /*!< Specifies the TIM Output Compare pin state during Idle state.This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State@note This parameter is valid only for TIM1 and TIM8. */
} TIM_OCInitTypeDef;

1.TIM_OCMode:选择TIM的模式

2.TIM_OutputState:选择输出类型

选择输出有效电平类型

3.TIM_Pulse:输入要进行比较的值

4.TIM_OCPolarity:设置输出极性

4.TIM_OCnPreloadConfig

void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
{uint16_t tmpccmr1 = 0;/* Check the parameters */assert_param(IS_TIM_LIST8_PERIPH(TIMx));assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));tmpccmr1 = TIMx->CCMR1;/* Reset the OC1M Bits */tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1M);/* Configure The Forced output Mode */tmpccmr1 |= TIM_ForcedAction;/* Write to TIMx CCMR1 register */TIMx->CCMR1 = tmpccmr1;
}

5.TIM_OC1PreloadConfig

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)
{uint16_t tmpccmr1 = 0;/* Check the parameters */assert_param(IS_TIM_LIST8_PERIPH(TIMx));assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));tmpccmr1 = TIMx->CCMR1;/* Reset the OC1PE Bit */tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1PE);/* Enable or Disable the Output Compare Preload feature */tmpccmr1 |= TIM_OCPreload;/* Write to TIMx CCMR1 register */TIMx->CCMR1 = tmpccmr1;
}

6.TIM_ClearOC1Ref

void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)
{uint16_t tmpccmr1 = 0;/* Check the parameters */assert_param(IS_TIM_LIST3_PERIPH(TIMx));assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear));tmpccmr1 = TIMx->CCMR1;/* Reset the OC1CE Bit */tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1CE);/* Enable or Disable the Output Compare Clear Bit */tmpccmr1 |= TIM_OCClear;/* Write to TIMx CCMR1 register */TIMx->CCMR1 = tmpccmr1;
}

7.TIM_OC1PolarityConfig

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
{uint16_t tmpccer = 0;/* Check the parameters */assert_param(IS_TIM_LIST8_PERIPH(TIMx));assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));tmpccer = TIMx->CCER;/* Set or Reset the CC1P Bit */tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1P);tmpccer |= TIM_OCPolarity;/* Write to TIMx CCER register */TIMx->CCER = tmpccer;
}

4.GPIO引脚和PWM的对应关系

STM32F103中文教程及参考手册.pdf · 林何/STM32F103C8 - 码云 - 开源中国 (gitee.com)

在AFIO中进行查找

没有重映像:表示默认接入的io口

完全重映像:如果使用这个则要调用函数进行声明【GPIO_PinRemapConfig】

5.TIM2的专用PWM输出编程实践

1.官方示例代码

我们使用的是TIM3,因为我们复用了GPIOA,所以要去AFIO中去查找TIM3对应的关系

#include "pwm.h"
#include "led.h"//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);			// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  		//使能GPIO外设时钟使能//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 						//TIM_CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  				//复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = arr; 						//设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 80KTIM_TimeBaseStructure.TIM_Prescaler =psc; 						//设置用来作为TIMx时钟频率除数的预分频值  不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0; 					//设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//TIM向上计数模式TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 				//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 				//选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//比较输出使能TIM_OCInitStructure.TIM_Pulse = 0;								//设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 		//输出极性:TIM输出比较极性高TIM_OC1Init(TIM1, &TIM_OCInitStructure);  						//根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(TIM1,ENABLE);								//MOE 主输出使能	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  				//CH1预装载使能	 TIM_ARRPreloadConfig(TIM1, ENABLE); 							//使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM1, ENABLE);  										//使能TIM1
}

2.代码移植

我们先去查看我们进行操作的TIM2对应应该复用哪一个AFIO引脚

可知TIM2的通道1对于的没有重映像是PA0

#include "stm32f10x.h"                  // Device header
/**使用TIM2的Channel1,无重映射时对应PA0引脚,在原理图上对应P1.0
*/void pwm_init(void);int main(){pwm_init(); //频率是2Khreturn 0;
}void pwm_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIOTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx/* 开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);/*  配置GPIO的模式和IO口 */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOA,&GPIO_InitStructure);		// GPA15,// time = CNT/fHz = 9000/72000000s// Fpwm = 1/T = 72000000/9000Hz = 8000Hz = 8KHz//TIM3定时器初始化TIM_TimeBaseInitStructure.TIM_Period = 9000 - 1;	   //不分频,PWM 频率=72000/900=8Khz//设置自动重装载寄存器周期的值TIM_TimeBaseInitStructure.TIM_Prescaler = 0;//设置用来作为TIMx时钟频率预分频值,100Khz计数频率TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);// 将TIM2的输出引脚进行fll remap到PA15,也就是P3.7//GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);//PWM初始化	  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能//TIM_OCInitStructure.TIM_Pulse = 4500 - 1;//TIM_Pulse:设置占空比【占了1/3==3000/9000】TIM_OCInitStructure.TIM_Pulse = 3000 - 1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM2,&TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_Cmd(TIM2,ENABLE);//使能或者失能TIMx外设
}

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

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

相关文章

力扣每日一题 ---- 2906. 构造乘积矩阵

这题很简单(一下就能想到是前缀和的提米)&#xff0c;但是在处理12345上面需要仔细一点&#xff0c;本来我最开始想到的时候全部累乘在除掉当前数&#xff0c;但是这样就没有把12345考虑进去&#xff0c;如果他本身是12345的话&#xff0c;那么除他以外的乘积并不一定是0&#…

前端缓存机制——强缓存、弱缓存、启发式缓存

强缓存和弱缓存的主要区别是主要区别在于缓存头携带的信息不同。 强缓存&#xff1a; 浏览器发起请求&#xff0c;查询浏览器的本地缓存&#xff0c;如果找到资源&#xff0c;则直接在浏览器中使用该资源。若是未找到&#xff0c;或者资源已过期&#xff0c;则浏览器缓存返回未…

Pytest插件

官方文档&#xff1a;API Reference — pytest documentation BaseReport 定义Case结果输出 >>> from _pytest.reports import TestReport >>> test TestReport(1,1,1,pass,,running) >>> print(dir(test)) [__annotations__, __class__, __delatt…

基础课26——业务流程分析方法论

基础课25中我们提到业务流程分析方法包括以下几种&#xff1a; 价值链分析法&#xff1a;主要是找出或设计出哪些业务能够使得客户满意&#xff0c;实现客户价值最大化的业务流程。要进行价值链分析的时候可以从企业具体的活动进行细分&#xff0c;细分的具体方面可以从生产指…

UserAgent使用隧道HTTP代码示例

首先&#xff0c;我们需要安装一个Perl模块来处理HTTP请求&#xff0c;然后&#xff0c;我们需要配置代理信息&#xff0c;如proxy_host和proxy_port。接下来&#xff0c;我们可以使用正则表达式来解析网页内容并提取我们需要的信息。最后&#xff0c;我们可以将这些信息存储到…

基于DevEco Studio的OpenHarmony应用原子化服务(元服务)入门教程

一、创建项目 二、创建卡片 三、应用服务代码 Index.ets Entry Component struct Index {State TITLE: string OpenHarmony;State CONTEXT: string 创新召见未来&#xff01;;build() {Row() {Column() {Text(this.TITLE).fontSize(30).fontColor(0xFEFEFE).fontWeight(…

java版本转换小工具

工作之余写了一个转换小工具&#xff0c;具有以下功能&#xff1a; 时间戳转换Base64编码/解码URL编码/解码JSON格式化 时间戳转换 package org.binbin.container.panel;import javax.swing.*; import java.awt.*; import java.text.DateFormat; import java.text.SimpleDat…

【pytest】html报告修改和汉化

前言 Pytest框架可以使用两种测试报告&#xff0c;其中一种就是使用pytest-html插件生成的测试报告&#xff0c;但是报告中有一些信息没有什么用途或者显示的不太好看&#xff0c;还有一些我们想要在报告中展示的信息却没有&#xff0c;最近又有人问我pytest-html生成的报告&a…

[论文阅读]PV-RCNN++

PV-RCNN PV-RCNN: Point-Voxel Feature Set Abstraction With Local Vector Representation for 3D Object Detection 论文网址&#xff1a;PV-RCNN 论文代码&#xff1a;PV-RCNN 简读论文 这篇论文提出了两个用于3D物体检测的新框架PV-RCNN和PV-RCNN,主要的贡献如下: 提出P…

Figma转Sketch文件教程,超简单!

相信大家做设计的都多多少少听过一点Figma和Sktech&#xff0c;这2个设计软件是目前市场上很受欢迎的专业UI设计软件&#xff0c;在全球各地都有很多粉丝用户。但是相对来说&#xff0c;Figma与Sketch只支持iOS系统有所不同&#xff0c;Figma是一个在线设计软件&#xff0c;不限…

IBM Qiskit量子机器学习速成(一)

声明&#xff1a;本篇笔记基于IBM Qiskit量子机器学习教程的第一节&#xff0c;中文版译文详见&#xff1a;https://blog.csdn.net/qq_33943772/article/details/129860346?spm1001.2014.3001.5501 概述 首先导入关键的包 from qiskit import QuantumCircuit from qiskit.u…

HackTheBox-Starting Point--Tier 2---Base

文章目录 一 题目二 过程记录2.1 打点2.2 权限获取2.3 横向移动2.4 权限提升 一 题目 Tags Web、Vulnerability Assessment、Custom Applications、Source Code Analysis、Authentication、Apache、PHP、Reconnaissance、Web Site Structure Discovery、SUDO Exploitation、Au…

lua脚本实现redis分布式锁(脚本解析)

文章目录 lua介绍lua基本语法redis执行lua脚本 - EVAL指令使用lua保证删除原子性 lua介绍 Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。 设…

Ubuntu 创建用户

在ubuntu系统中创建用户&#xff0c;是最基本的操作。与centos7相比&#xff0c;有较大不同。 我们通过案例介绍&#xff0c;讨论用户的创建。 我们知道&#xff0c;在linux中&#xff0c;有三类用户&#xff1a;超级管理员 root 具有完全权限&#xff1b;系统用户 bin sys a…

split() 函数实现多条件转为数据为数组类型

使用 split() 函数并传递正则表达式 /[,;.-]/ 作为分隔符来将字符串按照逗号、分号和破折号进行拆分&#xff0c;并将结果赋值给 splitArray 数组。下面是一个示例代码&#xff1a; 在上面的示例中&#xff0c;我们使用 split() 函数将 inputString 字符串按照逗号、分号和破折…

分享4个MSVCP100.dll丢失的解决方法

msvcp100.dll是一个重要的动态链接库文件&#xff0c;它是Microsoft Visual C 2010 Redistributable Package的一部分。这个文件的作用是提供在运行C程序时所需的函数和功能。如果计算机系统中msvcp100.dll丢失或者损坏&#xff0c;就会导致软件程序无法启动运行&#xff0c;会…

综合布线可视化管理系统价值分析

传统综合布线管理&#xff0c;全部依靠手工登记&#xff0c;利用标签标示线缆&#xff0c;利用文档资料记录链路的连接和变更&#xff0c;高度依赖网络管理员的管理能力&#xff0c;维护效率低下。同时&#xff0c;网络接入故障和非法接入难以及时发现。在以往的文章中小编一直…

GitHub金矿:一套智能制造MES的源代码,可以直接拿来搞钱的好项目

目前国内智能制造如火如荼&#xff0c;工厂信息化是大趋势。如果找到一个工厂&#xff0c;搞定一个老板&#xff0c;搞软件的小虾米就能吃几年。 中国制造业发达&#xff0c;工厂林立&#xff0c;但是普遍效率不高&#xff0c;需要信息化提高效率。但是矛盾的地方在于&#xf…

聊一聊被人嘲笑的if err!=nil和golang为什么要必须支持多返回值?

golang多返回值演示 我们知道&#xff0c;多返回值是golang的一个特性&#xff0c;比如下面这段代码,里面的参数名我起了几个比较好区分的 package mainfunc main() {Swap(10999, 10888) }func Swap(saaa, sbbb int) (int, int) {return sbbb, saaa }golang为什么要支持多返回…

【Unity细节】如何让组件失活而不是物体失活

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…