【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是一种周期固定,脉宽可调整的输出波形。 0.通用寄存器输出 1.捕获/比较通道1的主电路--中间部分 2.捕获/比较通道的输出部分--输出 3.通用定时器输出PWM原理 PWM波周期或者频率由ARR(就是要进递增/递减的值)决定,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期间各大云计算服务商都会推出特价云服务器,今年自然也不例外,下面给大家分享2023年双11有哪些便宜的云服务器值得推荐。 1、阿里云【传送门>>>】 阿里云双11推出了金秋云创季活动,2核2G3M不限流量,1年99元&…...

[Java/力扣160]相交链表
这道题的关键是,使两个链表上的指针同时到达相交点处 方法一:分别遍历两个链表,得到其长度。然后先让较长的链表上的指针走“两链表长度之差”。然后两指针分别一步一步走,就能同时到达相交点处。 方法二:让 p1 遍历…...
LLVM学习笔记(60)
4.4.3. X86Subtarget 在X86TargetMachine构造函数的105行调用了X86Subtarget构造函数来创建具体的目标机器对象。 4.4.3.1. FMV的支持(v7.0) V7.0将具体目标机器对象的生成推迟到第一次调用getSubtarget ()时才创建。不过,为了方便起见&am…...
Linux命令查看pcap包报文数量、包体包含内容、包长
查看pcap包内容 要查看pcap文件中的包数量,可以使用网络分析工具,如Wireshark或Tcpdump,或者使用编程语言中的网络分析库,如Python中的Scapy或Sniffy。 使用Wireshark的方法如下: 打开Wireshark软件。选择要查看的p…...

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

【计算机网络笔记】网络层服务模型——虚电路网络
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...

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

说说对React中类组件和函数组件的理解?有什么区别?
一、类组件 类组件,顾名思义,也就是通过使用ES6类的编写形式去编写组件,该类必须继承React.Component 如果想要访问父组件传递过来的参数,可通过this.props的方式去访问 在组件中必须实现render方法,在return中返回…...
Unity 实例化物体以及赋予到父物体之下
Unity 实例化物体并赋予父物体操作如下: 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 国内镜像: https://vscode.cdn.azure.cn/stable/6c3e3dba23e8fadc360aed75ce363ba185c49794/VSCodeUserSetup-x64-1.81.1.exe二.打开vscode在扩展搜索SSH并安装 三.添加主机 按F1选择添加新的ssh主机 按格式输入后在左边会出现电视的图标 之后输入…...

Redis之事务
文章目录 前言一、概述二、Redis事务使用1.正常执行事务2.取消事务3.编译型异常4.运行时异常(1/0)5.清空数据库6.监控1.乐观锁正常执行成功2.多线程 总结 前言 Redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化&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:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉…...

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

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

Docsify 和 Hugo 之间的选型
对文档的编译,目前的发布方案是越来越注重 MD 的编辑和发布。 针对其他 Wiki 的选择,MD 文件的编辑通常会保留修改记录,同时不依赖中央数据库和其他类型的 Web 应用服务。 随着各大云平台的支持,包括 GitHub Page 和 Google 的 …...
第二十章 ObjectScript 应用程序中的数值计算 - 转换:十进制到 $DOUBLE
文章目录 第二十章 ObjectScript 应用程序中的数值计算 - 转换:十进制到 $DOUBLE 转换:十进制到 $DOUBLE转换:$DOUBLE 到十进制$DECIMAL(x)$DECIMAL(x, n) 转换:十进制到字符串 第二十章 ObjectScript 应用程序中的数值计算 - 转…...

C语言【趣编程】我们怎样便捷输出空心的金字塔
目录 1问题: 2解题思路: 3代码如下: 4代码运行结果如下图所示: 5总结: r如若后续有不会的问题,可以和我私聊; 1问题: 2解题思路: 方法:找规律࿰…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 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也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...