STM32——TIM简介与TIM中断

news2024/9/24 13:24:12

文章目录

  • 一、TIM简介
  • 二、定时器类型
    • 基本定时器
    • 通用定时器
    • 高级定时器
  • 三、定时中断基本结构
  • 四、时序图
    • 预分频器时序
    • 计数器时序
    • 计数器无预装时序
    • 计数器有预装时序
    • RCC时钟树
  • 五、定时器定时中断
  • 六、定时器外部时钟
  • 七、定时器库函数(tim.h)

一、TIM简介

  • TIM(Timer)定时器
  • 定时器可以对输入的时钟(方波)进行计数,并在计数值达到设定值触发中断
    • 输入时钟: 内部时钟,外部时钟
    • 对输入的时钟进行计数就是计时
  • 每个定时器都具备的3个核心:
    • 16位计数器【寄存器】
    • 16位预分频器【对计数器时钟分频】
    • 16位自动重装寄存器【计数的目标值】
    • 3个核心组成时基单元
    • 在72MHz时钟下可以实现最大59.65s(65536*65536/72MHZ)的定时(中断)
      • 72MHZ/65536=最小时钟分频(最大的周期)
      • 时钟分频倒数是周期,周期表示一个方波的时长,乘以重装值(方波的个数)就是定时(中断)的时长
  • 定时器支持级联,级联一个定时器:59.65* 65536* 65536
  • 不仅具备基本的定时中断功能,定时器还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
  • 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

二、定时器类型

在这里插入图片描述
注意:STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4

基本定时器

在这里插入图片描述

  • 只能连接内部时钟(72MHZ)
  • 预分频的值+1=实际的分频系数,例如预分频的值为1则表示分频系数为2,是2分频,则输出36MHZ
  • 自动重装寄存器满了可以触发更新中断(通往NVIC)和更新事件(不会触发中断,触发其他外设电路)
  • 计数器:对预分频后的时钟(方波)进行计数
  • 主模式触发DAC:防止主程序频繁被中断,通过主模式,将定时器的更新事件映射到触发输出,定时器的更新就无须通过更新中断来实现【类似于DMA控制器,实现硬件自动化】

通用定时器

在这里插入图片描述

  • 通用定时器包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能

  • 通用定时器和高级定时器支持向上计数,向下技术,中央对齐模式

  • 编码器接口:读取正交编码器的输出波形

  • 该框图可以分为三个部分

    • 上面部分可以完成定时中断功能,内外时钟源选择和主从触发模式选择

    • 下面由输入捕获单元和输出比较电路组成

      • IC输入比较 ;CC捕获比较寄存器 ;OC输出比较
  • 外部时钟模式2:通过TIMx_ETR——触发控制器——时基单元

    • 外部时钟可以来自TIMx_ETR,如图所示PA0可以输入外部时钟给stm32,输入的方波可以经过极性选择,边沿检测,预分频器,输入滤波等将波形进行整形
      在这里插入图片描述
  • 外部时钟模式1(用作触发输入):通过TRGI——触发控制器——时基单元

    • TRGI当做外部时钟,时钟源来自多个地方
    • TRGI的输入可以是ETR(即TIMx_ETR)或ITR信号(即其他定时器)或TI1F_ED信号(输入捕获单元的CH1、CH2、CH3引脚)或TI1FP1和TI1FP2信号(CH1、CH2引脚的时钟)
      • 关于ITR信号:TRGO输出可以接到其他定时器,所以可以级联,而其他定时器的接入是设计在ITR信号部分
      • ITRX可以实现定时器级联功能在这里插入图片描述
      • 关于TI1F_ED信号:ED表示上升沿和下降沿都有效
  • 各种定时器时钟源的GPIO配置
    在这里插入图片描述

高级定时器

在这里插入图片描述

  • DTG死区生成电路:可以驱动三相无刷电机,输出一对互补的的PWM波
  • BRK完成 刹车输入功能
  • 重复计数器:每隔几个计数周期才发送一次更新事件和更新中断(即对输出的信号再进行分频,定时时间更长)

三、定时中断基本结构

在这里插入图片描述

  • RCC使能定时器,此时定时器的基准时钟和外设的工作时钟都设定好了

中断源选择:

  • 外部中断:有中断引脚选择AFIO,例如配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
  • 定时器中断:有中断输出控制,例如配置TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    • 如通用定时器框图所示,一个定时器中包含多个中断源如TGI,计数器值等于重装值,输入捕获与输出比较匹配时,参数可以选择如下

      void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
      @param  TIM_IT: specifies the TIM interrupts sources to be enabled or disabled.
      *   This parameter can be any combination of the following values:
      *     @arg TIM_IT_Update: TIM update Interrupt source
      *     @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source
      *     @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source
      *     @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source
      *     @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source
      *     @arg TIM_IT_COM: TIM Commutation Interrupt source
      *     @arg TIM_IT_Trigger: TIM Trigger Interrupt source
      *     @arg TIM_IT_Break: TIM Break Interrupt source
      

      在这里插入图片描述

四、时序图

预分频器时序

在这里插入图片描述

  • 计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)【预分频的值+1=实际的分频系数】

  • 当计数到一半改变分频值,不会从那个时刻修改,而是等本次计数周期结束后才开始【结束会产生更新事件,预分频寄存器的值才会传递到预分频缓冲器,下一个周期才会起作用】

  • CK_PSC与CK_CNT的关系
    在这里插入图片描述

  • 预分频寄存器实际上有两个,一个是供用户读写使用的预分频控制寄存器,该寄存器不会决定分配系数,另一个是缓冲寄存器(影子寄存器),真正起作用

计数器时序

在这里插入图片描述
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1)

例如:定时1s时间计算psc和arr:

  • 定时1s表示计数溢出频率是1HZ
  • 而计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)=CK_PSC / (PSC + 1) / (ARR + 1)
  • 所以只要满足(PSC + 1) / (ARR + 1) = 72000000即可
  • psc=7200-1
  • arr = 10000-1

自动重装寄存器有缓冲寄存器可以使用,使用则是有预装,不使用则是无预装,通过设置ARPE位进行设置

计数器无预装时序

在这里插入图片描述

  • 更改自动加载寄存器时为36,此时计数器计数到36会触发中断更新

计数器有预装时序

在这里插入图片描述

  • 更改自动加载寄存器时为36,由于设置了缓冲寄存器,此时由自动加载影子寄存器起作用,到F5时才重新计数
  • 引入缓冲寄存器的目的是为了让值的变化与更新事件同步,防止运行过程中造成错误

RCC时钟树

在这里插入图片描述

  • 任何一个时钟源都可以开启或关闭,任何一个外设的时钟也可以被开启或关闭,将系统功耗降到最低
  • SystemInit()就是用来配置时钟树
    • 首先启动内部8MHZ高速RC振荡器作为系统时钟
    • 然后启动外部4-16MHZ高速石英晶体振荡器,进入PLL锁相环倍频到72MHZ,选择锁相环输出为系统时钟
  • 中间的SYSCLK就是系统时钟72MHZ
    • 进入AHB预分频器,当SystemInit()设置为1的时候就是不分频,还是72MHZ
    • APB1总线配置的系数是2,分频后为36MHZ,由于下面的支路会将频率扩大2倍,所以stm32中所有的定时器的预分频还是72MHZ。
    • 关于与门控制,就是通过该函数(RCC_APB1/2PeriphClockCmd())进行控制,
  • 时钟产生电路有四个震荡源:
    • 内部8MHZ高速RC振荡器
    • 外部4-16MHZ高速石英晶体振荡器(晶振),比内部8MHZ高速RC振荡器稳定
    • 外部32.768MHZ低速晶振,给RTC提供时钟
    • 内部40KHZ低速RC振荡器,给看门狗提供时钟
  • CSS:时钟安全系统:检测外部时钟运行状态,一旦外部时钟失效就会切换到内部时钟
  • 关系图:
    在这里插入图片描述

五、定时器定时中断

Timer.c

#include "stm32f10x.h"                  // Device header

uint16_t Num;

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_InternalClockConfig(TIM2);//选择内部时钟源,如果是使用内部时钟可以不写
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频,有1分频2分频和4分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数器模式,向上、向下、中央对齐
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//重装值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//预分频值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级定时器的重复次数寄存器
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//配置时基单元
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);//在非中断函数中清除定时中断标志位
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//使能该定时器外设的中断输出控制(常见)
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//stm32f10x.h中对应型号的参数
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2, ENABLE);//运行控制,使能计数器,让其工作
}

//定时器中断函数
void TIM2_IRQHandler(void)
{
	//中断函数中查看标志位
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Num ++;
		//中断函数中清除标志位
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}
  • .h头文件的声明里面省略了extern

六、定时器外部时钟

Timer.c

#include "stm32f10x.h"                  // Device header

uint16_t Num;

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//PA0可以作为TIMx_ETR信号输入端
	
	TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);//第二个参数是预分频器,第三个参数是外部触发的极性,第一是反向,低电平或下降沿有效,第二个是不反向,高电平或上升沿有效,最后一个参数是外部触发滤波器,通过设置16进制来设定采样频率和采样个数
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;//重装值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;//预分频
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}

uint16_t Timer_GetCounter(void)
{
	return TIM_GetCounter(TIM2);//获取计数器的值
}


void TIM2_IRQHandler(void)
{
	//中断函数中查看标志位
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Num ++;
		//中断函数中清除标志位
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}


七、定时器库函数(tim.h)

void TIM_DeInit(TIM_TypeDef* TIMx);//恢复缺省配置
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//定时器时基单元配置
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能运行控制
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//使能中断输出信号
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//内部时钟模式
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//ITx其他定时器模式
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//TIx捕获通道
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//ETR外部时钟模式1
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//ETR外部时钟模式2
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//不是配置时钟,而是设置ETR引脚的预分频器,极性,滤波器扥
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);//单独设置预分频值
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);//改变计数器计数模式
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);//自动重装器是否设置预装功能
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);//给计数器写入一个值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);//给自动重装器写入一个值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);//获取当前计数器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);//获取当前预分频的值
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式篇】设计模式3类23种

创建型模式 创建型模式提供了创建对象的机制, 能够提升已有代码的灵活性和可复用性。 这里面比较重要和经常用到时单例模式、工厂模式和原型模式。 单例模式 单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问…

antd 动态增减表单项的使用

需求 首先这是基于antd的Form组件&#xff0c;需求1&#xff1a; 单选按钮组 选择设置时间 展示时间选择器需求2&#xff1a; 动态添加时间选择器(最多添加10个、时间为空校验、时间段重叠校验)需求3&#xff1a; 开关需求4&#xff1a;编辑时赋值 1. 单选钮组 <Radio.Gro…

4.6.1、路由选择协议概述

1、静态/动态路由 2、主要特点 因特网所采用的路由选择协议的主要特点 例如&#xff1a;一个较大的因特网提供商就可划分为一个自治系统 在自治系统内部和外部采用不同类别的路由选择协议&#xff0c;分别进行路由选择 3、分层次的路由选择协议 如下所示&#xff0c;将网络…

ArcGIS基础实验操作100例--实验44融合细碎多边形

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验44 融合细碎多边形 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

k8s基础

一、基本介绍 Kubernetes&#xff0c;简称K8s&#xff0c;是用8代替8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效(powerful) , Kubernetes提供了应用部署…

Linux 下 python3.9.8的安装

1. 准备安装环境 yum install gcc zlib* openssl* -y 2. linux 下 python 安装包的获取 官网下载地址: https://www.python.org/downloads/ 找到 自己想要的版本。 方式一&#xff1a;直接点击该链接下载&#xff0c;然后将安装包通过xftp 传送到远程服务器 的 /opt 路…

k8s之搭建单机集群

写在前面 本文一起看下如何在单机环境下搭建k8s集群。 基础环境准备参考这篇文章 。 1&#xff1a;k8s的前世今生 现在当我们提到容器技术时&#xff0c;首先想到的肯定是docker&#xff0c;但其实在docker之前&#xff0c;谷歌公司就已经有了类似的技术&#xff0c;我们知道…

借助免费AI艺术平台生成头像

随着 AI 的兴起&#xff0c;看到越来越多的实例通过 OpenAI 的举措变得轻松&#xff0c;使得 AI 艺术在今天早已不是什么新鲜事物&#xff0c;而且在游戏领域也开始有所应用。人工智能&#xff08;AI&#xff0c;artificial intelligence&#xff09;艺术&#xff0c;更准确地说…

数据挖掘与机器学习作业_09 贝叶斯

贝叶斯 贝叶斯公式 后验概率 先验概率 * 似然估计 from sklearn.model_selection import GridSearchCV from sklearn.naive_bayes import BernoulliNB from sklearn.naive_bayes import GaussianNB from sklearn.naive_bayes import MultinomialNB from sklearn.naive_bayes…

关于进程间的通信方式的总结

一、背景 在人类思想史上,马克思第一次对人的本质作出科学界定:人的本质是一切社会关系的总和。时间万物都存在或多或少的关系。那么人除了天生父子这样的家族关系&#xff0c;还有后天 通过 语言 &#xff0c;这样区别于其他动物的方式来进行和其他人的交流产生关系。 在计算…

PTL仓库提货解决方案

电子标签拣货系统是采用先进电子技术和通信技术开发而成的物流辅助作业系统&#xff0c;通常使用在仓储或现代化物流中心分拣环节&#xff0c;具有拣货速度快、效率高、差错率低、无纸化、标准化的作业特点&#xff0c;电子标签辅助拣货系统作为一种先进的作业手段&#xff0c;…

【小程序】如何开发属于自己的一款小程序

文章目录小程序简介概念小程序与普通网页开发的区别微信开发者工具小程序代码构成项目结构JSON 配置文件WXML 模板WXSS 样式JS 逻辑交互小程序的宿主环境宿主环境简介通信模型运行机制组件常用的视图容器类组件常用的基础内容组件其它常用组件API协同工作小程序成员管理小程序的…

数据完整性测试之【三】Redis缓存和数据库表里的记录

本文为博主原创&#xff0c;未经授权&#xff0c;严禁转载及使用。 本文链接&#xff1a;https://blog.csdn.net/zyooooxie/article/details/119377944 前面分享过 接口返回值 和 表记录 的校验 、 导出的CSV、Excel文件 和 表记录 的校验&#xff0c;最近 我们项目常常用到Re…

【大小端问题】

什么是大小端&#xff1f; 为什么存在大小端&#xff1f;如何判断计算机的大小端存储模式&#xff1f; 大小端是什么&#xff1f; 计算机在内存存储中有两中存储模式&#xff1a; 大端字节序存储模式和小端字节序存储模式。 大端存储模式&#xff0c;是指数据的低位保存在内…

API接口测试简介

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是API接口测试简介。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设备…

Hadoop高手之路8-Flume日志采集

文章目录Hadoop高手之路8-Flume日志采集一、Flume概述1. Flume简介2. Flume运行机制3. Flume日志采集系统结构图二、Flume的搭建1. 下载2. 上传3. 解压4. 配置环境变量5. 配置flume三、Flume入门使用1. 配置数据采集方案1) 查看官网2) 案例需求3) 创建新的配置文件4) 复制官网的…

公司业财一体化详解

一、传统财务会计如何手工做账1.没有财务系统&#xff08;软件&#xff09;时公司会计用手工记账&#xff0c;流程包括&#xff1a;建立总账&#xff1b;首先建立账簿&#xff0c;登记会计账簿时&#xff0c;应当将会计凭证日期、编号、业务内容摘要、金额和其他有关资料逐项计…

GAMES101作业5及框架梳理

闲言碎语 emmm&#xff0c;上一次写还是2022年4月份的事情了&#xff0c;真的有点恍如隔世&#xff0c;4月到9月主要是在准备保研的事情&#xff0c;然后10月到12月基本上是在适应实习生活&#xff08;没错&#xff0c;保完研之后因为种种原因就直接开始实习了&#xff0c;害&…

[Vue]Vue3学习笔记(尚硅谷)

文章目录&#x1f97d; 创建Vue3项目&#x1f30a; vue-cli&#x1f30a; vite&#x1f97d; 项目结构&#x1f97d; Vue3开发者工具的安装&#x1f97d; 初识setup&#x1f97d; ref 函数&#x1f97d; reactive函数&#x1f97d;Vue3.0中的响应式原理&#x1f30a; vue2.x的响…

微服务架构解决方案介绍

1、微服务架构 目前微服务是非常火的架构或者说概念&#xff0c;也是在构建大型互联网项目时采用的架构方式。 1.1 单体架构 在软件设计中&#xff0c;经常提及和使用经典的3层模型&#xff0c;即表示层、业务逻辑层和数据访问层。 表示层&#xff1a;用于直接和用户交互&a…