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

【复旦微FM33 MCU 底层开发指南】高级定时器ATIM

请添加图片描述

0 前言

本系列基于复旦微FM33LC0系列MCU的DataSheet编写,提供基于寄存器开发指南、应用技巧、注意事项等
本文章及本系列其他文章将持续更新,本系列其它文章请跳转↓↓↓
【复旦微FM33 MCU 寄存器开发指南】总集篇

本文章最后更新日期:2025/04/13

文章目录

  • 0 前言
  • 1 概述
  • 2 基本描述
    • 2.1 ATIM工作时钟
    • 2.2 ATIM计数源
      • 2.2.1 内部时钟模式
      • 2.2.2 外部时钟模式1
      • 2.2.3 外部时钟模式2
      • 2.2.4 内部触发模式
    • 2.3 ATIM复位
  • 3 基础功能描述
    • 3.1 从机模式
      • 3.1.1 复位模式
      • 3.1.2 门控模式
      • 3.1.3 触发模式
      • 3.1.4 外部事件触发的外部时钟计数模式(触发模式的一个应用)
    • 3.2 输入捕捉模式
      • 3.2.1 输入捕捉示例:ATIM_CH1上升沿捕获
      • 3.2.2 输入捕捉示例:PWM占空比计算
    • 3.3 输出比较模式
      • 3.3.1 比较通道CH1—CH3
      • 3.3.2 比较通道CH4
    • 3.4 PWM输出模式
    • 3.5 编码器接口模式
  • 4 附加功能描述
    • 4.1 自动重装载
    • 4.2 软件Force输出
    • 4.3 互补输出和死区插入
      • 4.3.1 互补输出
      • 4.3.2 死区插入
    • 4.4 刹车功能
    • 4.5 6-step PWM输出
    • 4.6 单脉冲输出
    • 4.7 外部事件清除OCxREF
    • 4.8 输入异或功能
    • 4.9 Debug模式
  • 5 应用Tips
    • 5.1 调试记录:P端和N端的极性?

1 概述

在这里插入图片描述

(我觉得FM33LC0ATIMSTM32F407TIM1可能是一个IP,因为寄存器基本都是一样的)

2 基本描述

2.1 ATIM工作时钟

在使用ATIM之前,必须在RCC中配置RCC->OPCCR1寄存器的ATCKEATCKS,以使能ATIM工作时钟,并配置工作时钟源。
在这里插入图片描述在这里插入图片描述

2.2 ATIM计数源

ATIM有四个计数源:内部时钟、外部时钟1、外部时钟2、内部触发。
在这里插入图片描述
注意:DataSheet上仍将该部分命名为工作时钟,我认为这不恰当。因为这里的“ATIM计数源”指的是定时器的计数值,无论是否使用ATIM的工作时钟作为计数源,都必须使能工作时钟。因此本文使用计数源这个名词代替。

2.2.1 内部时钟模式

ATIM默认使用的就是内部时钟模式,不需要特别配置寄存器。

如前文所述,ATIM的工作时钟可以来源于APBCLK2USBPLL的2倍频。
在该模式下,ATIM的工作时钟经过分频后作为计数源。
在这里插入图片描述

分频值可以在ATIM->PSC寄存器配置。
在这里插入图片描述

2.2.2 外部时钟模式1

外部时钟模式1直接使用外部引脚输入信号作为计数时钟。

外部时钟模式1外部时钟同步采用简单的2级触发器结构,因此为了避免亚稳态,要求外部输入时钟宽度至少大于2APBCLK周期,如果不满足该条件,需要用外部时钟模式2
在这里插入图片描述

从上图可以看到,需要对ATIM->CCMR1ATIM->CCERATIM->SMCR寄存器配置。

ATIM->CCMR1寄存器的IC2F定义如下图所示,用于配置输入捕捉的数字滤波
ATIM->CCMR1寄存器在输出比较和输入捕捉配置下,寄存器的功能定义是不同的。在外部时钟模式1下,使用的是输入捕捉配置。)
在这里插入图片描述

ATIM->CCMR1寄存器的CC2SIC2PSC定义如下图所示,这里将CC2S配置为01
在这里插入图片描述

ATIM->CCER1寄存器的CC2PCC2E定义如下图所示。在输出模式下,用于配置输出极性和输出使能;在输入模式下,用于配置边沿捕获和捕获使能,这里是输入模式。
在这里插入图片描述
ATIM->SMCR寄存器的ETPECEETPS定义如下图所示。
在这里插入图片描述
ATIM->SMCR寄存器的TS用于配置ATIM同步计数器的触发源,需要配置TS110
在这里插入图片描述

ATIM->SMCR寄存器的SMS用于配置ATIM外部时钟模式1,需要配置SMS111
在这里插入图片描述
以上寄存器介绍就完成了,手册给出了配置寄存器的顺序和时序图。
在这里插入图片描述在这里插入图片描述

2.2.3 外部时钟模式2

外部时钟模式2使用ATIM_ETR管脚输入信号的上升沿或下降沿(不支持双沿)来计数。

外部时钟模式2外部时钟模式1的主要差别是,ETR输入直接被分频后再进行滤波,产生CK_PSC时钟,这意味着可以支持ETR输入频率高于APBCLK的应用场景,这种情况下,需要首先对ETR输入进行预分频,再用于驱动计数器。
在这里插入图片描述
ATIM->SMCR寄存器的ETPECEETPSETF定义如下图所示。
在这里插入图片描述在这里插入图片描述
以上寄存器介绍就完成了,手册给出了配置寄存器的顺序和时序图。
在这里插入图片描述
在这里插入图片描述

2.2.4 内部触发模式

ATIM支持4个内部触发输入,可用于计数触发或者内部信号捕捉。
在这里插入图片描述

当用于内部信号(TRC)捕捉时,需要将ATIM->SMCR寄存器的TS配置为000001010011,用于选择ITR0ITR1ITR2ITR3
并将ATIM->CCMR1ATIM->CCMR2CCxS(x=1,2,3,4,即选择4个ATIM通道之一用作捕捉TRC信号)配置为11,即将TRC选为捕捉信号。

ATIM->SMCR寄存器的TS定义如下:
在这里插入图片描述
ATIM->CCMR1CC1S定义如下:
在这里插入图片描述

2.3 ATIM复位

如果需要对ATIM复位,则需要在RCC中配置RCC->APBRSTCR2寄存器,先写1复位,再写0取消复位。
在这里插入图片描述

3 基础功能描述

3.1 从机模式

和手册顺序不同,这里先说ATIM的从机模式,因为后面一些基础功能实现需要用到从机模式。

ATIM从机模式的配置在ATIM->SMCR寄存器中的SMS,可以配置为三种工作模式:复位模式(100)、门控模式(101)和触发模式(110)。
在这里插入图片描述

3.1.1 复位模式

此模式下,外部输入的事件将导致TIM内部所有preload寄存器重新初始化, CNT回到0开始计数。
以下图为例,计数器正常计数,外部TI1输入上升沿时,触发计数器清零,重新开始计数。
在这里插入图片描述

注:TI1—外部输入信号;UG—软件UPDATE事件标志;CEN—使能; Timer clock—计数时钟;
Atim_CNT——计数值,对应ATIM->CNT寄存器; TIF—触发事件中断标志

上图对应的配置如下:
在这里插入图片描述

3.1.2 门控模式

门控模式下,计数器仅在输入信号为特定电平时工作。电平变换导致计数器开始或停止计数时,都会触发中断标志。
在这里插入图片描述

注:TI1—外部输入信号;CEN—使能; Timer clock—计数时钟;
Atim_CNT——计数值,对应ATIM->CNT寄存器; TIF—触发事件中断标志

上图对应的配置如下:
在这里插入图片描述

3.1.3 触发模式

触发模式下,计数器在外部输入的某个事件到来后才开始计数。
在这里插入图片描述

注:TI1—外部输入信号;CEN—使能; Timer clock—计数时钟;
Atim_CNT——计数值,对应ATIM->CNT寄存器; TIF—触发事件中断标志;

上图对应的配置如下:
在这里插入图片描述

3.1.4 外部事件触发的外部时钟计数模式(触发模式的一个应用)

可以将ETR设置为计数时钟,同时使用另一个外部输入作为计数器启动触发信号。比如在检测到TI1的上升沿之后,计数器开始以ATIM_ETR引脚输入的上升沿计数。
在这里插入图片描述

注:TI1—外部输入信号;CEN—使能; ETRATIM_ETR引脚输入的时钟信号; Timer clock—计数时钟;
Atim_CNT——计数值,对应ATIM->CNT寄存器; TIF—触发事件中断标志

上图对应的配置如下:
在这里插入图片描述

3.2 输入捕捉模式

以通道1为例,输入/比较通道的示意图如下:
在这里插入图片描述
捕捉/比较通道的主电路示意图如下(供参考,不需了解):
在这里插入图片描述
手册提供了如下两个应用示例:

3.2.1 输入捕捉示例:ATIM_CH1上升沿捕获

这个应用示例用于获取ATIM_CH1数字信号两个上升沿之间的时间间隔,结果将保存到ATIM->CCR1寄存器。
在这里插入图片描述

注:ATIM->CCR1寄存器保存的是时钟数,要转换单位为ms:
两个上升沿时间间隔(ms) = ATIM->CCR1 / ATIM工作时钟(MHz)

3.2.2 输入捕捉示例:PWM占空比计算

这个示例用于获取一个PWM信号的占空比。
需要将PWM信号接入ATIM_CH1通道的外部引脚(TI1输入),通过内部配置将PWM信号输入到ATIM的CH1和CH2通道,一个通道捕获上升沿,另一个通道捕获下降沿。
在这里插入图片描述
这里用到了ATIM从机模式复位模式,选择IC1信号(即PWM的上升沿)为TRGI信号。在复位模式下,TRGI信号会初始化计数器(即ATIM->CNT),并触发UPDATE事件。

在这里插入图片描述

注:Timer clock—计数时钟;Atim_CNT——计数值,对应ATIM->CNT寄存器; TI1—外部输入信号;
ATIM_CCR1IC1的捕获值,对应ATIM->CCR1寄存器;
ATIM_CCR2IC2的捕获值,对应ATIM->CCR2寄存器

具体的寄存器配置步骤如下:
在这里插入图片描述在这里插入图片描述

3.3 输出比较模式

3.3.1 比较通道CH1—CH3

在这里插入图片描述
ATIM->CCMR1 捕捉/比较模式寄存器1,通道1相关配置定义如下:
在这里插入图片描述在这里插入图片描述

ATIM->CCER捕捉/比较使能寄存器CC1ECC1PCC1NECC1NP定义如下:
在这里插入图片描述

ATIM->BDTR刹车和死区控制寄存器的DTG定义如下:
在这里插入图片描述
ATIM->CR2控制寄存器2的OIS1OIS1N定义如下:
在这里插入图片描述

3.3.2 比较通道CH4

捕捉/比较通道不支持死区插入、互补输出等功能。
在这里插入图片描述

3.4 PWM输出模式

在这里插入图片描述

3.5 编码器接口模式

编码器接口模式涉及到两个外部输入信号, ATIM根据其中一个信号的边沿相对于另一个信号的电平来决定递增还是递减计数值。

下表是计数方式与两路输入信号之间的关系:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

4 附加功能描述

4.1 自动重装载

自动重装载(Preload),其实就是在改写一些寄存器时,ATIM不会立刻应用这些值,而是等待下一次Update事件的时候,再加载这些值。

因此,自动重装载至少需要两组物理实体:

  • Shadow register:影子寄存器,存储定时器实际使用的值。
  • Preload register:预装载寄存器,供软件访问,临时存储软件修改的值。

使能自动重装载功能:软件在修改预装载寄存器时,不会立刻更新到影子寄存器中,而是当Update事件发生的时候再更新。
没有使能自动重装载功能:软件在修改预装载寄存器时,会立刻更新到影子寄存器中。

ATIM->ARRATIM->RCRATIM->PSCATIM->CCRATIM->CCERCCxECCxNE(x=1,2,3,4)、ATIM->CCMR1ATIM->CCMR2OCxM(x=1,2,3,4)是支持预装载功能的。

预装载功能在ATIM->CR1寄存器中配置。
在这里插入图片描述

4.2 软件Force输出

在比较输出模式下,软件可以直接将OCxREF force成特定电平,而独立于CCR和计数器的比较结果。

软件通过写OCxM=101,可以直接将OCxREF强制为有效(OCxREF固定为高有效),通过写OCxM=100可以直接将OCxREF强制为无效(低电平)。以下是ATIM->CCMR1寄存器OC1M的定义:
在这里插入图片描述但是软件force操作不会取消比较过程,CCR和计数器的比较还会一直进行。

4.3 互补输出和死区插入

4.3.1 互补输出

互补输出通过控制两个相位相反的信号(如上桥臂和下桥臂的驱动信号),确保同一时刻只有一个开关管导通,避免直通短路。这种设计可降低开关损耗,提升能量转换效率,尤其适用于高频开关场景。

ATIM->CCER捕捉/比较使能寄存器CC1ECC1PCC1NECC1NP定义如下:
在这里插入图片描述

4.3.2 死区插入

死区时间是在互补信号切换时插入的一段短暂延迟,确保上桥臂和下桥臂的开关管不会同时导通。这避免了因开关速度差异或信号延迟导致的直通短路,保护开关管免受过流损坏。

手册上提供了死区插入的三种情况,如下图右侧所示(左侧是没有死区插入的波形)
其中,OCxREF是输出基准信号,OCx是P端引脚的输出信号,OCxN是N端引脚的输出信号。
在这里插入图片描述
手册写明:输出信号OCx与参考信号OCxREF同相, OCxN与参考信号反相;OCx的上升沿是OCxREF上升沿的delay, OCxN的上升沿是OCxREF下降沿的delay。

从上图的三个例子来理解这句话:

例1: delay的时长 < OCxREF的低电平脉宽,delay的时长 < OCxREF的高电平脉宽
OCx的上升沿相对于OCxREF的上升沿延迟delay;
OCxN的上升沿相对于OCxREF的下降沿延迟delay。
例2: delay的时长 > OCxREF的低电平脉宽,delay的时长 < OCxREF的高电平脉宽
OCx的上升沿相对于OCxREF的上升沿延迟delay;
OCxN的上升沿相对于OCxREF的下降沿延迟delay,但由于这时候OCxN已经应该是低电平了,所以OCxN不会有任何高电平输出。
例3: delay的时长 < OCxREF的低电平脉宽,delay的时长 > OCxREF的高电平脉宽
OCx的上升沿相对于OCxREF的上升沿延迟delay,但由于这时候OCx已经应该是低电平了,所以OCx不会有任何高电平输出。
OCxN的上升沿相对于OCxREF的下降沿延迟delay。

死区时间可以通过ATIM->BDTR寄存器的DTG设置:
在这里插入图片描述

4.4 刹车功能

在这里插入图片描述
在这里插入图片描述

4.5 6-step PWM输出

六步换相通过控制电机三相绕组的通电顺序,产生旋转磁场,驱动转子持续旋转。每一步切换两个绕组的电流方向,保持一个绕组不通电,形成六步循环,对应电机转子每旋转一圈的六个关键位置。

(手册已经很详细了,且没有更深的理解,因此不进一步描述了)

当某个通道使用互补输出时,OCxMCCxECCxNE寄存器支持preload功能,preload寄存器的值在换相(COM)事件发生时被装载到shadow寄存器中。用户因此可以预先设置下一步配置,并在COM事件发生时同步更新所有通道。

COM事件可以由软件写ATIM->EGR中的COM位触发,或者由TRGI上升沿硬件触发。当COM事件发生时,换相标志寄存器置位,并且可以产生中断或DMA请求。
在这里插入图片描述

4.6 单脉冲输出

(手册已经很详细了,且没有更深的理解,因此不进一步描述了)

单脉冲输出是比较输出模式的特殊情况,允许用户在某个事件发生后,经过可编程的延迟,输出一个可编程宽度的脉冲信号。

与其他输出模式不同的是,在下一次update event到来时,计数器会自动停止。只有当CCR和计数器初值不同时,脉冲才有可能正确输出。在向上计数时,要求NT<CCR<=ARR,在向下计数时,要求CNT>CCR

在这里插入图片描述
上图是以TI2输入为计数器触发信号,计数值等于CCROCxREF输出低电平,计数到ARROCxREF回到高电平,并且计数器回滚到0,停止计数。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.7 外部事件清除OCxREF

OCxREF的有效状态为高电平,通过对外部ETR引脚施加高电平,可以直接拉低OCxREF,直到下一次update event。此功能仅在输出比较和PWM模式下有效。使能此功能需要将OCxCE置1。
在这里插入图片描述

ATIM->CCMR1OC1CE定义如下:
在这里插入图片描述

4.8 输入异或功能

通道1~3的输入信号可以被异或起来之后,接入到通道1的滤波和边沿电路输入,用于通道1的输入捕捉或者触发。

ATIM->CR2寄存器的TI1S用于选择通道1的输入是否来自于三个通道输入的异或。
在这里插入图片描述

4.9 Debug模式

DBG->CR寄存器可以控制在Debug模式下,ATIM的工作状态。
在这里插入图片描述

5 应用Tips

5.1 调试记录:P端和N端的极性?

高级定时器有多个通道,每个通道都有P端和N端。通过配置寄存器,可以分别控制使能和极性。
比如可以将通道3的P端和N端配置为完全相同的PWM输出,也可以配置为互补的PWM输出。

但在我调试中发现:如果一个通道只使能P端,另一个通道只使能N端时,在不配置极性的情况下,他们的输出是完全相同的(而非希望的互补输出)

解决该问题有两种可参考的方法:
(1)将开启N端的那个通道的P端也使能。
(2)配置开启N端那个通道的输出极性。

相关文章:

【复旦微FM33 MCU 底层开发指南】高级定时器ATIM

0 前言 本系列基于复旦微FM33LC0系列MCU的DataSheet编写&#xff0c;提供基于寄存器开发指南、应用技巧、注意事项等 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转↓↓↓ 【复旦微FM33 MCU 寄存器开发指南】总集篇 本文章最后更新日期&#xff1a;2025…...

vdso概念及原理,vdso_fault缺页异常,vdso符号的获取

一、背景 vdso的全称是Virtual Dynamic Shared Object&#xff0c;它是一个特殊的共享库&#xff0c;是在编译内核时生成&#xff0c;并在内核镜像里某一段地址段作为该共享库的内容。vdso的前身是vsyscall&#xff0c;为了兼容一些旧的程序&#xff0c;x86上还是默认加载了vs…...

4.13学习总结

学习完异常和文件的基本知识 完成45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09;的算法题&#xff0c;对于我来说&#xff0c;用贪心的思路去写该题是很难理解的&#xff0c;很难想到&#xff0c;理解了许久&#xff0c;也卡了很久。...

Day14:关于MySQL的索引——创、查、删

前言&#xff1a;先创建一个练习的数据库和数据 1.创建数据库并创建数据表的基本结构 -- 创建练习数据库 CREATE DATABASE index_practice; USE index_practice;-- 创建基础表&#xff08;包含CREATE TABLE时创建索引&#xff09; CREATE TABLE products (id INT PRIMARY KEY…...

概率论与数理统计核心知识点与公式总结(就业版)

文章目录 概率论与数理统计核心知识点与公式总结&#xff08;附实际应用&#xff09;一、概率论基础1.1 基本概念1.2 条件概率与独立性 二、随机变量及其分布2.0 随机变量2.0 分布函数&#xff08;CDF&#xff09;2.1 离散型随机变量2.2 连续型随机变量2.3 多维随机变量2.3.1 联…...

AF3 ProteinDataset类的_patch方法解读

AlphaFold3 protein_dataset模块 ProteinDataset 类 _patch 方法的主要目的是围绕锚点残基(anchor residues)裁剪蛋白质数据,提取一个局部补丁(patch)作为模型输入。 源代码: def _patch(self, data):"""Cut the data around the anchor residues."…...

openssh 10.0在debian、ubuntu编译安装 —— 筑梦之路

OpenSSH 10.0 发布&#xff1a;一场安全与未来兼顾的大升级 - Linux迷 OpenSSH: Release Notes sudo apt-get updatesudo apt install build-essential zlib1g-dev libssl-dev libpam0g-dev libselinux1-devwget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/opens…...

Go 跨域中间件实现指南:优雅解决 CORS 问题

在开发基于 Web 的 API 时&#xff0c;尤其是前后端分离项目&#xff0c;**跨域问题&#xff08;CORS&#xff09;**是前端开发人员经常遇到的“拦路虎”。本文将带你了解什么是跨域、如何在 Go 中优雅地实现一个跨域中间件&#xff0c;支持你自己的 HTTP 服务或框架如 net/htt…...

【数据结构_6】双向链表的实现

一、实现MyDLinkedList&#xff08;双向链表&#xff09; package LinkedList;public class MyDLinkedList {//首先我们要创建节点&#xff08;因为双向链表和单向链表的节点不一样&#xff01;&#xff01;&#xff09;static class Node{public String val;public Node prev…...

【双指针】专题:LeetCode 1089题解——复写零

复写零 一、题目链接二、题目三、算法原理1、先找到最后一个要复写的数——双指针算法1.5、处理一下边界情况2、“从后向前”完成复写操作 四、编写代码五、时间复杂度和空间复杂度 一、题目链接 复写零 二、题目 三、算法原理 解法&#xff1a;双指针算法 先根据“异地”操…...

Foxmail邮件客户端跨站脚本攻击漏洞(CNVD-2025-06036)技术分析

Foxmail邮件客户端跨站脚本攻击漏洞&#xff08;CNVD-2025-06036&#xff09;技术分析 漏洞背景 ‌漏洞编号‌&#xff1a;CNVD-2025-06036 ‌CVE编号‌&#xff1a;待分配 ‌厂商‌&#xff1a;腾讯Foxmail ‌影响版本‌&#xff1a;Foxmail < 7.2.25 ‌漏洞类型‌&#x…...

39.[前端开发-JavaScript高级]Day04-函数增强-argument-额外知识-对象增强

JavaScript函数的增强知识 1 函数属性和arguments 函数对象的属性 认识arguments arguments转Array 箭头函数不绑定arguments 函数的剩余&#xff08;rest&#xff09;参数 2 纯函数的理解和应用 理解JavaScript纯函数 副作用概念的理解 纯函数的案例 判断下面函数是否是纯…...

0x05.为什么 Redis 设计为单线程?6.0 版本为何引入多线程?

回答重点 单线程设计原因: Redis 的操作是基于内存的,其大多数操作的性能瓶颈主要不是 CPU 导致的使用单线程模型,代码简便的同时也减少了线程上下文切换带来的性能开销Redis 在单线程的情况下,使用 I/O 多路复用模型就可以提高 Redis 的 I/O 利用率了6.0 版本引入多线程的…...

CST1019.基于Spring Boot+Vue智能洗车管理系统

计算机/JAVA毕业设计 【CST1019.基于Spring BootVue智能洗车管理系统】 【项目介绍】 智能洗车管理系统&#xff0c;基于 Spring Boot Vue 实现&#xff0c;功能丰富、界面精美 【业务模块】 系统共有三类用户&#xff0c;分别是&#xff1a;管理员用户、普通用户、工人用户&…...

CST1018.基于Spring Boot+Vue滑雪场管理系统

计算机/JAVA毕业设计 【CST1018.基于Spring BootVue滑雪场管理系统】 【项目介绍】 滑雪场管理系统&#xff0c;基于 Spring Boot Vue 实现&#xff0c;功能丰富、界面精美 【业务模块】 系统共有两类用户&#xff0c;分别是管理员和普通用户&#xff0c;管理员负责维护后台数…...

剖析 Rust 与 C++:性能、安全及实践对比

1 性能对比&#xff1a;底层控制与运行时开销 1.1 C 的性能优势 C 给予开发者极高的底层控制能力&#xff0c;允许直接操作内存、使用指针进行精细的资源管理。这使得 C 在对性能要求极高的场景下&#xff0c;如游戏引擎开发、实时系统等&#xff0c;能够发挥出极致的性能。以…...

SDHC接口协议底层传输数据是安全的

SDHC&#xff08;Secure Digital High Capacity&#xff09;接口协议在底层数据传输过程中确实包含校验机制&#xff0c;以确保数据的完整性和可靠性。以下是关键点的详细说明&#xff1a; 物理层与数据链路层的校验机制 物理层&#xff08;Electrical Layer&#xff09;&…...

Gateway-网关-分布式服务部署

前言 什么是API⽹关 API⽹关(简称⽹关)也是⼀个服务, 通常是后端服务的唯⼀⼊⼝. 它的定义类似设计模式中的Facade模式(⻔⾯模式, 也称外观模式). 它就类似整个微服务架构的⻔⾯, 所有的外部客⼾端访问, 都需要经过它来进⾏调度和过滤. 常⻅⽹关实现 Spring Cloud Gateway&a…...

c++STL——string学习的模拟实现

文章目录 string的介绍学习的意义auto关键字和范围forstring中的常用接口构造和析构对string得容量进行操作string的访问迭代器(Iterators)&#xff1a;运算符[ ]重载 string类的修改操作非成员函数 string的模拟实现不同平台下的实现注意事项模拟实现部分所有的模拟实现函数预…...

【寻找Linux的奥秘】第四章:基础开发工具(下)

请君浏览 前言1. 自动化构建1.1 背景1.2 基本语法1.3 make的运行原理1.4通用的makefile 2. 牛刀小试--Linux第一个小程序2.1 回车与换行2.2 行缓冲区2.3 倒计时小程序2.4 进度条小程序原理代码 3. 版本控制器git3.1 认识3.2 git的使用三板斧 3.3 其他 4. 调试器gdb/cgdb4.1 了解…...

RK3588上Linux系统编译C/C++ Demo时出现BUG:The C/CXX compiler identification is unknown

BUG的解决思路 BUG描述&#xff1a;解决方法&#xff1a;首先最重要的一步&#xff1a;第二步&#xff1a;正确设置gcc和g的路径方法一&#xff1a;使用本地系统中安装的 aarch64-linux-gnu-gcc 和 aarch64-linux-gnu-g方法二&#xff1a;下载使用官方指定的交叉编译工具方法三…...

记录一次/usr/bin/ld: 找不到 -lOpenSSL::SSL

1、cmake 报错内容如下&#xff1a; /usr/bin/ld: 找不到 -lOpenSSL::SSL /usr/bin/ld: 找不到 -lOpenSSL::Crypto2、一开始以为库没有正确安装 sudo yum install openssl-devel然后查看openssl 结果还是报错&#xff01; 3、尝试卸载安装都不管用&#xff0c;网上搜了好多…...

[16届蓝桥杯 2025 c++省 B] 水质检测

思路&#xff1a;分类讨论&#xff0c;从左到右枚举&#xff0c;判断当前的河床和下一个河床的距离是第一行更近还是第二行更近还是都一样近&#xff0c;分成三类编写代码即可 #include<iostream> using namespace std; int main(){string s1,s2;cin>>s1>>…...

基于PySide6与pycatia的CATIA绘图比例智能调节工具开发全解析

引言&#xff1a;工程图纸自动化处理的技术革新 在机械设计领域&#xff0c;CATIA图纸的比例调整是高频且重复性极强的操作。传统手动调整方式效率低下且易出错。本文基于PySide6pycatia技术栈&#xff0c;提出一种支持智能比例匹配、实时视图控制、异常自处理的图纸批处理方案…...

四、Appium Inspector

一、介绍 Appium Inspector 是一个用于移动应用自动化测试的图形化工具&#xff0c;主要用于检查和交互应用的 UI 元素&#xff0c;帮助生成和调试自动化测试脚本。类似于浏览器的F12(开发者工具),Appium Inspector 的主要作用包括&#xff1a;‌ 1.‌检查 UI 元素‌ …...

玩转Docker | 使用Docker部署MicroBin粘贴板

玩转Docker | 使用Docker部署MicroBin粘贴板 前言一、MicroBin介绍MicroBin 简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署MicroBin服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问MicroBin服务访问MicroBin首页登录管理后台…...

BGP分解实验·23——BGP选路原则之路由器标识

在选路原则需要用到Router-ID做选路决策时&#xff0c;其对等体Router-ID较小的路由将被优选&#xff1b;其中&#xff0c;当路由被反射时&#xff0c;包含起源器ID属性时&#xff0c;该属性将代替router-id做比较。 实验拓扑如下&#xff1a; 实验通过调整路由器R1和R2的rout…...

MQTT:单片机中MQTTClient-C移植定时器功能

接下来我们完善MQTTTimer.c和MQTTTimer.h两个功能 MQTTTimer.h void TimerInit(Timer* timer); 功能&#xff1a;此函数用于对 Timer 结构体进行初始化。在 MQTT 客户端里&#xff0c;定时器被用于追踪各种操作的时间&#xff0c;像连接超时、心跳包发送间隔等。初始化操作会…...

可拖动的关系图谱原型案例

关系图谱是一种以图结构形式组织和呈现实体间复杂关联关系的可视化数据模型。它通过节点和线构建多维度网络&#xff0c;能直观揭示隐藏的群体特征和传播路径。在社交网络分析、智能推荐系统、知识图谱构建等领域广泛应用。 软件版本&#xff1a;Axure RP 9 作品类型&#xf…...

CST1016.基于Spring Boot+Vue高校竞赛管理系统

计算机/JAVA毕业设计 【CST1016.基于Spring BootVue高校竞赛管理系统】 【项目介绍】 高校竞赛管理系统&#xff0c;基于 DeepSeek Spring AI Spring Boot Vue 实现&#xff0c;功能丰富、界面精美 【业务模块】 系统共有两类用户&#xff0c;分别是学生用户和管理员用户&a…...

从三次方程到复平面:复数概念的奇妙演进(二)

注&#xff1a;本文为 “复数 | 历史 / 演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载&#xff0c;此为第二篇。 生料&#xff0c;不同的文章不同的点。 机翻&#xff0c;未校。 History of Complex Numbers 复数的历史 The problem of complex numbers dates back to …...

PCL 点云投影至指定平面

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前的文章中介绍过一个点在平面上的投影坐标,其主要的思路就是利用投影垂线与平面法向量平行的特性,通过推导出的投影公式可以很容易的计算出在某点在某一平面内的投影点。因此只需要重复该过程就可以将整个点云…...

批量将文件名称、文件路径、文件扩展名提取到 Excel 清单

在数字化时代&#xff0c;文件的高效管理至关重要。当我们想要对磁盘中的文件进行整理&#xff0c;想要获取多个文件夹中的文件和路径信息&#xff0c;就需要现将这些文件的名称及路径信息提取出来。本文将介绍一种实用的批量提取技术&#xff0c;帮助用户优化文件管理流程&…...

KWDB创作者计划—KWDB场景创新:多模态数据融合与边缘智能的产业实践

引言&#xff1a;AIoT时代的数据基座重构 在工业物联网设备数量突破千亿、边缘计算节点覆盖率达75%的2025年&#xff0c;传统数据库面临多模态数据处理效率低下、边缘端算力利用率不足、跨域数据协同困难等核心挑战。KWDB&#xff08;KaiwuDB Community Edition&#xff09;通过…...

计算机系统概论

1. 计算机系统的基本组成 计算机系统由 硬件系统 和 软件系统 两大部分协同工作&#xff1a; 硬件系统&#xff1a; 基于冯诺依曼体系结构&#xff08;存储程序原理&#xff09;&#xff0c;包含五大核心部件&#xff1a; 运算器&#xff08;ALU&#xff09;&#xff1a;执行算…...

Android Cmake构建的项目,需不需要配置指定ndk及版本

在 CMake 构建的 Android 项目中&#xff0c;是否需要显式配置 NDK 及其版本&#xff0c;取决于项目的具体需求和环境。以下是详细分析和建议&#xff1a; 1. 是否需要显式配置 NDK 及版本&#xff1f; 情况 1&#xff1a;Android Studio 自动管理 NDK&#xff08;推荐&#x…...

国内AI大模型卷到什么程度了?

目录 1.开源大模型更有前景吗&#xff1f; 2.参数越大真的越牛逼吗&#xff1f; 3.榜单排名有意义吗&#xff1f; 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ 大模型开源更有前景&#xff1f; 参数越大真的越牛逼吗&#xff1f; 榜单排…...

【HDFS入门】Hadoop 2.0+ HDFS核心架构深度解析:高可用设计揭秘

目录 1 HDFS核心架构概述 2 高可用设计背景 3HDFS核心组件 3.1 Active与Standby NameNode 3.2 JournalNode 3.3 ZKFailoverController&#xff08;ZKFC&#xff09; 3.4 DataNode 4 高可用设计的工作流程 写入阶段&#xff1a; 元数据同步&#xff1a; 健康监测&…...

RabbitMQ安装

RabbitMQ安装 Ubuntu环境安装 一、安装Erlang #更新软件包 sudo apt-get update #安装erlang sudo apt-get install erlang 二、安装RabbitMQ #更新软件包 sudo apt-get update #安装rabbitmq sudo apt-get install rabbitmq-server #确认安装结果 systemctl status rabbitmq-…...

2022 CCPC Henan Provincial Collegiate Programming Contest K 复合函数

补题链接 看网上题解很少&#xff0c;来写一份&#xff0c;这题个人觉得思维难度不是特别大&#xff0c;难度主要在于代码准确度,首先将问题转化成 x x x 向 f ( x ) f(x) f(x) 连边&#xff0c;这一步转化应该是比较容易想到的&#xff0c;通过手模样例&#xff0c;会有类…...

Linux : 多线程互斥

目录 一 前言 二 线程互斥 三 Mutex互斥量 1. 定义一个锁&#xff08;造锁&#xff09; 2. 初始化锁 3. 上锁 4. 解锁 5. 摧毁锁 四 锁的使用 五 锁的宏初始化 六 锁的原理 1.如何看待锁&#xff1f; 2. 如何理解加锁和解锁的本质 七 c封装互斥锁 八 可重入…...

【数学建模】佳点集(Good Point Set)在智能优化算法中的应用与实现

佳点集(Good Point Set)在智能优化算法中的应用与实现 文章目录 佳点集(Good Point Set)在智能优化算法中的应用与实现1. 佳点集概述2. 佳点集的数学原理3. 佳点集在智能优化算法中的应用3.1 改进麻雀搜索算法(SSA)3.2 改进量子粒子群优化算法(QPSO)3.3 自适应分组差分变异狼群…...

redis linux 安装简单教程(redis 3.0.4)

redis.3.0.4.tar.gz 下载地址 链接: https://pan.baidu.com/s/19VAcrA6XS4mIesH6e5Jftg 提取码: bn2r &#xff08;1&#xff09;以安装目录&#xff1a;/home/zsl &#xff08;2&#xff09;将redis-3.0.4.tar.gz 拷贝到/home/zsl &#xff08;3&#xff09;tar xzvf redis-3.…...

探秘 Python 网络编程:构建简单聊天服务器

在计算机网络的世界里&#xff0c;网络编程是实现不同设备之间通信的关键技术。Python 凭借其简洁的语法和强大的库支持&#xff0c;在网络编程领域有着广泛的应用。无论是构建简单的聊天服务器&#xff0c;还是开发复杂的网络应用&#xff0c;Python 都能轻松胜任。 1 理论基础…...

debian转移根目录

如何在 BIOS 启动的 Debian 虚拟机中将根目录转移到 /dev/sda 设备上&#xff1f;本文将从硬盘分区&#xff0c;根目录复制&#xff0c;重新启动等几个方面介绍。 硬盘分区 1.检查磁盘&#xff1a;查看当前的磁盘和分区情况&#xff0c;确认新添加的磁盘设备名称。 parted -…...

vue3 element-plus表单验证

第一准备一个表单 form.vue <template><div><el-form><el-form-item label"姓名" prop"name"><el-input v-model"data.name" placeholder"请输入姓名"></el-input></el-form-item></e…...

Deepseek IP-Adapter与InstantID的区别

IP-Adapter与InstantID均为基于扩散模型的图像生成控制技术&#xff0c;但两者的算法设计目标、核心模块及应用场景存在显著差异。以下从技术架构、特征处理、条件控制等维度对比两者的差异&#xff1a; 1. 核心设计目标 IP-Adapter 由腾讯团队提出&#xff08;2023年8月&…...

OSI 七层模型与 TCP/IP 协议栈详解

OSI 七层模型与 TCP/IP 协议栈详解 网络协议模型是理解计算机网络和通信的基础&#xff0c;而 OSI 七层模型和 TCP/IP 协议栈是最常见的两种网络通信模型。虽然这两者有些不同&#xff0c;但它们都提供了一种分层的结构&#xff0c;帮助我们理解和设计网络通信。本文将详细介绍…...

synchronize 或者lock 锁常见的使用场景

在 Java 多线程编程中&#xff0c;synchronized 和 Lock&#xff08;如 ReentrantLock&#xff09;是两种常见的线程同步机制。以下是它们的核心区别和典型使用场景&#xff0c;结合代码示例说明&#xff1a; 一、synchronized 的常见场景 1. 简单的临界区保护 public class …...

Redis之缓存更新策略

缓存更新策略 文章目录 缓存更新策略一、策略对比二、常见的缓存更新策略三、如何选择策略四、实际应用示例五、使用 Cache-Aside TTL 的方式&#xff0c;实现缓存商铺信息详情1.引入StringRedisTemplate2.将查询商铺信息加入缓存3.更新商铺信息时移除缓存总结 六、注意事项 一…...