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

【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外设
}

相关文章:

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

PWM是一种周期固定&#xff0c;脉宽可调整的输出波形。 0.通用寄存器输出 1.捕获/比较通道1的主电路--中间部分 2.捕获/比较通道的输出部分--输出 3.通用定时器输出PWM原理 PWM波周期或者频率由ARR&#xff08;就是要进递增/递减的值&#xff09;决定&#xff0c;PWM波占空比由…...

DRF 学习

一、安装DRF 1、pip install djangorestframework -i https://pypi.douban.com/simple 2、pip install pymysql -i https://pypi.douban.com/simple 二、创建Django项目 1、django-admin startproject drfdemo 三、添加rest_framework应用 1、INSTALLED_APPS …...

2023年双11有哪些便宜的云服务器值得推荐?

每年的双11期间各大云计算服务商都会推出特价云服务器&#xff0c;今年自然也不例外&#xff0c;下面给大家分享2023年双11有哪些便宜的云服务器值得推荐。 1、阿里云【传送门>>>】 阿里云双11推出了金秋云创季活动&#xff0c;2核2G3M不限流量&#xff0c;1年99元&…...

[Java/力扣160]相交链表

这道题的关键是&#xff0c;使两个链表上的指针同时到达相交点处 方法一&#xff1a;分别遍历两个链表&#xff0c;得到其长度。然后先让较长的链表上的指针走“两链表长度之差”。然后两指针分别一步一步走&#xff0c;就能同时到达相交点处。 方法二&#xff1a;让 p1 遍历…...

LLVM学习笔记(60)

4.4.3. X86Subtarget 在X86TargetMachine构造函数的105行调用了X86Subtarget构造函数来创建具体的目标机器对象。 4.4.3.1. FMV的支持&#xff08;v7.0&#xff09; V7.0将具体目标机器对象的生成推迟到第一次调用getSubtarget ()时才创建。不过&#xff0c;为了方便起见&am…...

Linux命令查看pcap包报文数量、包体包含内容、包长

查看pcap包内容 要查看pcap文件中的包数量&#xff0c;可以使用网络分析工具&#xff0c;如Wireshark或Tcpdump&#xff0c;或者使用编程语言中的网络分析库&#xff0c;如Python中的Scapy或Sniffy。 使用Wireshark的方法如下&#xff1a; 打开Wireshark软件。选择要查看的p…...

C++二分算法: 找出第 K 小的数对距离

题目 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 0 < i < j < nums.length 。返回 所有数对距离中 第 k 小的数对距离。 示例 1&#x…...

【计算机网络笔记】网络层服务模型——虚电路网络

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

软文推广过程中,如何精准定位受众

互联网发展带来信息的爆炸式增长&#xff0c;消费者的注意力成为稀缺资源&#xff0c;传统硬广很难获取用户注意&#xff0c;而软文凭借故事化、针对性的特点更能吸引用户注意&#xff0c;在软文推广中&#xff0c;我们只有精准定位受众才能更好地传播&#xff0c;今天媒介盒子…...

说说对React中类组件和函数组件的理解?有什么区别?

一、类组件 类组件&#xff0c;顾名思义&#xff0c;也就是通过使用ES6类的编写形式去编写组件&#xff0c;该类必须继承React.Component 如果想要访问父组件传递过来的参数&#xff0c;可通过this.props的方式去访问 在组件中必须实现render方法&#xff0c;在return中返回…...

Unity 实例化物体以及赋予到父物体之下

Unity 实例化物体并赋予父物体操作如下&#xff1a; public class ExampleScript : MonoBehaviour { public GameObject prefab; // 引用预制体 public Transform parentTran; // 引用父物体的 Transform void Update() { if (Input.GetKeyDown(KeyCode.Space)) { //…...

Docker 介绍

Docker 介绍 1 介绍1.1 概述1.2 资源高效利用1.3 发展历程1.4 组件1.5 工具1.6 对环境部署和虚拟化的影响1.7 优点1.8 容器技术核心CgroupNamespaceUnionFS 2 命令信息、状态、配置info命令用于显示当前系统信息、docker容器、镜像个数、设置等信息 镜像容器资源 3 安装3.1 版本…...

VScode连接Xshell 并解决【过程试图写入的管道不存在】报错

一.下载vscode 国内镜像&#xff1a; https://vscode.cdn.azure.cn/stable/6c3e3dba23e8fadc360aed75ce363ba185c49794/VSCodeUserSetup-x64-1.81.1.exe二.打开vscode在扩展搜索SSH并安装 三.添加主机 按F1选择添加新的ssh主机 按格式输入后在左边会出现电视的图标 之后输入…...

Redis之事务

文章目录 前言一、概述二、Redis事务使用1.正常执行事务2.取消事务3.编译型异常4.运行时异常&#xff08;1/0&#xff09;5.清空数据库6.监控1.乐观锁正常执行成功2.多线程 总结 前言 Redis事务本质&#xff1a;一组命令的集合&#xff01;一个事务中的所有命令都会被序列化&a…...

【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…...

【HarmonyOS】HarmonyOS备案获取公钥和指纹

【关键字】 HarmonyOS应用、鸿蒙应用、元服务、应用备案 HarmonyOS应用在华为云等平台进行应用备案时&#xff0c;平台需要提供用公钥和签名指纹的信息&#xff0c;Android可以直接通过keystore或jks签名文件进行签名信息获取&#xff0c;HarmonyOS签名方式与Android不同&…...

,多数据源+Mybatisplus + Sharding JDBC同一库中分表

水平分表是在同一个数据库内&#xff0c;把同一个表的数据按一定规则拆到多个表中,多数据源采用 mybatis-plus的dynamic-datasource 分库分表采用sharding-jdbc 数据库连接池管理是alibaba的druid-spring-boot-starter 同一个数据库内分表 目录 1.数据库表 2.配置 3.引入的…...

Docsify 和 Hugo 之间的选型

对文档的编译&#xff0c;目前的发布方案是越来越注重 MD 的编辑和发布。 针对其他 Wiki 的选择&#xff0c;MD 文件的编辑通常会保留修改记录&#xff0c;同时不依赖中央数据库和其他类型的 Web 应用服务。 随着各大云平台的支持&#xff0c;包括 GitHub Page 和 Google 的 …...

第二十章 ObjectScript 应用程序中的数值计算 - 转换:十进制到 $DOUBLE

文章目录 第二十章 ObjectScript 应用程序中的数值计算 - 转换&#xff1a;十进制到 $DOUBLE 转换&#xff1a;十进制到 $DOUBLE转换&#xff1a;$DOUBLE 到十进制$DECIMAL(x)$DECIMAL(x, n) 转换&#xff1a;十进制到字符串 第二十章 ObjectScript 应用程序中的数值计算 - 转…...

C语言【趣编程】我们怎样便捷输出空心的金字塔

目录 1问题&#xff1a; 2解题思路&#xff1a; 3代码如下&#xff1a; 4代码运行结果如下图所示&#xff1a; 5总结&#xff1a; r如若后续有不会的问题&#xff0c;可以和我私聊&#xff1b; 1问题&#xff1a; 2解题思路&#xff1a; 方法&#xff1a;找规律&#xff0…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...