TIM输入捕获笔记 (计算编码电机的频率和占空比)

1. 输入捕获简介

  • IC (Input Capture) 输入捕获输入
  • 捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
  • 每个高级定时器和通用定时器都拥有4个输入捕获通道
  • 可配置为PWMI模式,同时测量频率和占空比可配合主从触发模式,实现硬件全自动测量

(STM32C8T6)

在这里插入图片描述

当前CNT的值将被锁存到CCR的意思是:把当前CNT的值读出来,写入到CCR中去

在这里插入图片描述

在这里插入图片描述

(定时器的结构图)

2. 频率测量

在这里插入图片描述

频率降低的方波波形图(如上图),越往左边频率越高,越往右边频率越低。这里的型号都是只有高低电平的数字信号STM32测量频率时,只能测量数字信号在这里插入图片描述

如果要测量正弦波信号,还需要搭建一个信号预处理电路。最简单的就是用运放搭建一个比较器。把正弦波转换为数字信号,再输入给STM32。
如果测量的信号电压非常高,电路还需要考虑隔离问题,隔离高压端和低压端,保证电路安全。比如隔离放大器、电压互感器等元件。

测频法

直接按照频率定义来进行测量的方法,就叫测频法。

例如想要测量下图黑色线段标记的频率,首先自定一个闸门时间T(通常设置为1S),在1S时间内对信号上升沿计次,从0开始计次,每来一个上升沿(周期),计次+1。

每来一个上升沿其实就是来了一个周期信号。所以在1S时间内,来了多少个周期,那么它的频率就是多少Hz。

(频率的定义:1S内出现了多少个重复周期)
在这里插入图片描述

测周法

测周法的基本原理就是,周期的倒数就是频率。

捕获信号的两个上升沿,然后测量这两个上升沿之间持续的时间(如下图)。

但实际上我们并没有一个精确到无穷大的秒表来测量时间。测量时间的方法,实际上也是定时器计数。我们使用一个已知的标准频率fc的计次时钟,来驱动计数器。从一个上升沿开始计数,计数器从0开始,一直计到下一个上升沿停止。 计一个数的时间是1/fc,计N个数,时间就是N/fc

在这里插入图片描述

N/fc就是周期,再取个倒数,就得到了公式,fk=fe/N。

在这里插入图片描述

问:测频法和测周法都是两种重要的测量频率的方法。那么这两种方法有什么区别?实际情况使用哪种方法更好?
答:
1.测频法适合测量高频信号,测周法适合测量低频信号。
2. 测频法测量结果更新慢一些,数值相对稳定;测周法更新快,数据跳变也非常快。

高频使用测频法,低频使用测周法。那么多高算高,多低算低呢?

这就涉及到中界频率的概念了。

中界频率

中界频率时测频法和测周法误差相等的频率点。

测频法计次和测周法计次,这个计次数量N越大越好,相对误差越小。

在这些方法中,计次可能存在正负1误差

在这里插入图片描述

3. 输入捕获通道

在这里插入图片描述

4. 主从触发模式

(注意:主从触发模式,这个名字是作者自己取的,手册中并没有这个名字。)

在这里插入图片描述

5. 输入捕获基本结构

在这里插入图片描述

输入捕获初始化步骤:

第一步:RCC开启时钟,GPIO和TIM的时钟打开;
第二步:GPIO初始化,GPIO配置成输入模式;
第三步:配置时基单元,让CNT计数器在内部时钟的驱动下自增运行;
第四步:配置输入捕获单元,滤波器、极性、直连通or交叉连通、分频器等等参数配置;
第五步:选择从模式的触发源,触发源选择为TI1FP1 ;
第六步:选择触发之后执行的操作,执行Reset操作;

最后,调用TIM_Cmd 函数,开启定时器。这样所有的电路就能配合起来,按照我们的要求工作了。

在这里插入图片描述

  // 配置TIM1 CH2
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; // PD2 通道2
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;// 上升沿触发
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择直连通道
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 不分频
  TIM_ICInitStructure.TIM_ICFilter = 0xF; // 滤波器
  TIM_ICInit(TIM1,&TIM_ICInitStructure); // 单通道
//  TIM_PWMIConfig(TIM1, &TIM_ICInitStructure); // 配置两个通道同时捕获

TIM_PWMIConfig(TIM1, &TIM_ICInitStructure); // 使用这个函数, 自动将另外一个通道参数配置成相反的配置。

高电平的计数值存在 CCR1, 整个周期的计数值存在CCR2里面。

因此,占空比:

DutyCycle = (IC1Value * 100) / IC2Value; // 乘以100表示,将范围扩大到0~100

uint16_t IC2Value = 0; // 计数值
uint16_t IC1Value = 0; // 计数值

uint16_t DutyCycle = 0;// 占空比
uint32_t Frequency = 0;// 频率

/* USER CODE BEGIN 1 */
void TIM1_CC_IRQHandler(void)
{
  // 清除捕获比较中断标志位
  TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);

  /* 获取输入捕获值 */
  IC2Value = TIM_GetCapture2(TIM1); // TIM1 的 通道2 PD2

  if (IC2Value != 0)
  {
    /* 占空比计算 */ 
		// TIM1 的 通道1 PD1
		IC1Value = TIM_GetCapture1(TIM1);
    DutyCycle = (IC1Value * 100) / IC2Value; // 乘以100表示,将范围扩大到0~100 

    /* 频率计算 */
    Frequency = SystemCoreClock / IC2Value;
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}


资料下载

工程下载:TIM-高级定时器-PWM输入捕获(20230827)

参考资料

  • [1] 【B站@江协科技】STM32入门教程-2023持续更新中 [6-5] TIM输入捕获
  • [2] STM32入门笔记(02):定时器之定时器中断、输入捕获和PWM输出(SPL库函数版)

输入捕获

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


PWM信号 周期和占空比的计算

/* ----------------   PWM信号 周期和占空比的计算--------------- */
// ARR :自动重装载寄存器的值
// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信号的周期 T = (ARR+1) * (1/CLK_cnt) = (ARR+1)*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)

航顺HK32F030M 输入捕获

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


高级定时器TIM1 的 CH1 和 CH2 通道输入捕获N20编码电机(6V300rpm)脉冲数,占空比、频率计算。

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


hk32f030m_it.c

	/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    hk32f030m_it.c
  * @brief   Interrupt Service Routines.
  ******************************************************************************

  */
#include "hk32f030m.h" 
/* USER CODE END Header */



/******************************************************************************/
/*           Cortex-M0 Processor Interruption and Exception Handlers          */ 
/******************************************************************************/
/**
  * @brief This function handles Non maskable interrupt.
  */
void NMI_Handler(void)
{
  /* USER CODE BEGIN NonMaskableInt_IRQn 0 */

  /* USER CODE END NonMaskableInt_IRQn 0 */
  /* USER CODE BEGIN NonMaskableInt_IRQn 1 */

  /* USER CODE END NonMaskableInt_IRQn 1 */
}

/**
  * @brief This function handles Hard fault interrupt.
  */
void HardFault_Handler(void)
{
  /* USER CODE BEGIN HardFault_IRQn 0 */

  /* USER CODE END HardFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_HardFault_IRQn 0 */
    /* USER CODE END W1_HardFault_IRQn 0 */
  }
}

/**
  * @brief This function handles System service call via SWI instruction.
  */
void SVC_Handler(void)
{
  /* USER CODE BEGIN SVC_IRQn 0 */

  /* USER CODE END SVC_IRQn 0 */
  /* USER CODE BEGIN SVC_IRQn 1 */

  /* USER CODE END SVC_IRQn 1 */
}

/**
  * @brief This function handles Pendable request for system service.
  */
void PendSV_Handler(void)
{
  /* USER CODE BEGIN PendSV_IRQn 0 */

  /* USER CODE END PendSV_IRQn 0 */
  /* USER CODE BEGIN PendSV_IRQn 1 */

  /* USER CODE END PendSV_IRQn 1 */
}

/**
  * @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}


uint16_t IC2Value = 0; // 计数值
uint16_t IC1Value = 0; // 计数值

uint16_t DutyCycle = 0;// 占空比
uint32_t Frequency = 0;// 频率

/* USER CODE BEGIN 1 */
void TIM1_CC_IRQHandler(void)
{
  // 清除捕获比较中断标志位
  TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);

  /* 获取输入捕获值 */
  IC2Value = TIM_GetCapture2(TIM1); // TIM1 的 通道2 PD2

  if (IC2Value != 0)
  {
    /* 占空比计算 */ 
		// TIM1 的 通道1 PD1
		IC1Value = TIM_GetCapture1(TIM1);
    DutyCycle = (IC1Value * 100) / IC2Value; // 乘以100表示,将范围扩大到0~100 

    /* 频率计算 */
    Frequency = SystemCoreClock / IC2Value;
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}



//uint16_t ReadValue1 = 0, ReadValue2 = 0;
//uint16_t CaptureNumber = 0; // 捕获成功/失败 标识位
//uint32_t Capture = 0; // 捕获
//uint32_t TIM1Freq = 0;//频率
 定时器1 中断你服务函数
//void TIM1_CC_IRQHandler(void)
//{ 
//  if(TIM_GetITStatus(TIM1, TIM_IT_CC2) == SET) 
//  {
//    // Clear TIM1 Capture compare interrupt pending bit 
//		// 清除捕获比较中断标志位
//    TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);  
//		
//    if(CaptureNumber == 0)
//    {
//      /* Get the Input Capture value */
//      ReadValue1 = TIM_GetCapture2(TIM1);
//      CaptureNumber = 1;
//    }
//    else if(CaptureNumber == 1)
//    {
//      /* Get the Input Capture value */
//      ReadValue2 = TIM_GetCapture2(TIM1); 
//      
//      /* Capture computation */
//      if (ReadValue2 > ReadValue1)
//      {
//        Capture = (ReadValue2 - ReadValue1); 
//      }
//      else if (ReadValue2 < ReadValue1)
//      {
//        Capture = ((0xFFFF - ReadValue1) + ReadValue2); 
//      }
//      else
//      {
//        Capture = 0;
//      }
//      /* Frequency computation */ 
//      TIM1Freq = (uint32_t) SystemCoreClock / Capture;//频率计算
//      CaptureNumber = 0;
//    }
//  }
//}
/* USER CODE END 1 */
/************************ (C) COPYRIGHT HKMicroChip *****END OF FILE****/

main.c

/**
  ******************************************************************************
  * @file    main.c
  * @author  Alexander
  * @version V1.0
  * @date    2022-xx-xx
  * @brief   高级定时器-PWM输入捕获
  ******************************************************************************
  * @attention
  *
  * 实验平台:HK32F030M开发板 
  * 论坛    :https://bbs.21ic.com/iclist-1010-1.html
  *
  ******************************************************************************
  */ 
#include "hk32f030m.h" 
#include "bsp_led.h"
#include "bsp_AdvanceTim.h"

volatile uint32_t time = 0;  // ms 计时变量

#define SOFT_DELAY  Delay(0x0FFFFF);

void Delay(__IO uint32_t nCount);


/**
  * @brief  主函数
  * @param  无  
  * @retval 无
  */
 
int main(void)
{
  SOFT_DELAY   // 由于BKIN复用在PB5引脚,而PB上电默认功能为SWD的SWCLK功能,为了防止下次烧录无法烧录,特此在这里加入一段延时
  
  /* 高级定时器初始化 */
  ADVANCE_TIM_Init();
  
while (1)
	{
    
	}
}

void Delay(__IO uint32_t nCount)	 //简单的延时函数
{
	for(; nCount != 0; nCount--);
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(char* file , uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */	
       /* Infinite loop */
	
	while (1)
  {		
  }
}
#endif /* USE_FULL_ASSERT */

bsp_AdvanceTim.c

#include "bsp_AdvanceTim.h" 

static void ADVANCE_TIM_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;
	
  // 输出比较通道GPIO初始化
  RCC_AHBPeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);
  
  // 配置GPIO的复用功能
  GPIO_PinAFConfig(ADVANCE_TIM_CH2_PORT, ADVANCE_TIM_CH2_PinSource, ADVANCE_TIM_CH2_GPIO_AF);
  
  GPIO_InitStructure.GPIO_Pin = ADVANCE_TIM_CH2_PIN; // PD2 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Schmit = GPIO_Schmit_Disable;
  // 初始化IO配置
  GPIO_Init(ADVANCE_TIM_CH2_PORT, &GPIO_InitStructure);
  
}



/******************************************************************************/
/* hk32f030m Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_hk32f030m.s).                    */
/******************************************************************************/

static void ADVANCE_TIM_Mode_Config(void)
{
  TIM_ICInitTypeDef TIM_ICInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  
	
  // 开启定时器时钟,即内部时钟CK_INT=32M
	ADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK,ENABLE);
  
  // 配置TIM1 CH2
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; // PD2
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;// 上升沿触发
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择直连通道
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 不分频
  TIM_ICInitStructure.TIM_ICFilter = 0xF; // 滤波器
//	TIM_ICInit(TIM1,&TIM_ICInitStructure);
  TIM_PWMIConfig(TIM1, &TIM_ICInitStructure); // 使用这个函数,配置两个通道同时捕获同一个引脚

  // 使能TIM1捕获比较中断
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0; //中断优先级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  
  // 选择TIM1触发源输入触发:TI2FP2
  TIM_SelectInputTrigger(TIM1,TIM_TS_TI2FP2);// 
  // 配置从模式复位计数器
  TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);
  
  // 使能主从模式
//  TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
  
  // 使能TIM1
  TIM_Cmd(TIM1, ENABLE);
  
  // 使能TIM1捕获比较2中断
  TIM_ITConfig(TIM1, TIM_IT_CC2, ENABLE);
}

void ADVANCE_TIM_Init(void)
{
	ADVANCE_TIM_GPIO_Config();
	ADVANCE_TIM_Mode_Config();		
}

/*********************************************END OF FILE**********************/

bsp_AdvanceTim.h

#ifndef __BSP_ADVANCETIME_H
#define __BSP_ADVANCETIME_H


#include "hk32f030m.h"

/************高级定时器TIM参数定义,只限TIM1和TIM8************/
// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
// 这里我们使用高级控制定时器TIM1

#define            ADVANCE_TIM                   TIM1
#define            ADVANCE_TIM_APBxClock_FUN     RCC_APB2PeriphClockCmd
#define            ADVANCE_TIM_CLK               RCC_APB2Periph_TIM1
// PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
#define            ADVANCE_TIM_PERIOD            (8-1)
#define            ADVANCE_TIM_PSC               (32-1)
#define            ADVANCE_TIM_PULSE             4

#define            ADVANCE_TIM_IRQ               TIM1_UP_TRG_COM_IRQn
#define            ADVANCE_TIM_IRQHandler        TIM1_UP_TRG_COM_IRQHandler

// TIM1 CH1 输入捕获通道 PD1 
#define            ADVANCE_TIM_CH1_GPIO_CLK      RCC_AHBPeriph_GPIOD
#define            ADVANCE_TIM_CH1_PORT          GPIOD
#define            ADVANCE_TIM_CH1_PIN           GPIO_Pin_1
#define            ADVANCE_TIM_CH1_PinSource     GPIO_PinSource1
#define            ADVANCE_TIM_CH1_GPIO_AF       GPIO_AF_3    

// TIM1 CH2 输入捕获通道  PD2 
#define            ADVANCE_TIM_CH2_GPIO_CLK      RCC_AHBPeriph_GPIOD
#define            ADVANCE_TIM_CH2_PORT          GPIOD
#define            ADVANCE_TIM_CH2_PIN           GPIO_Pin_2
#define            ADVANCE_TIM_CH2_PinSource     GPIO_PinSource2
#define            ADVANCE_TIM_CH2_GPIO_AF       GPIO_AF_3 



/**************************函数声明********************************/

void ADVANCE_TIM_Init(void);


#endif	/* __BSP_ADVANCETIME_H */



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[管理与领导-53]:IT基层管理者 - 8项核心技能 - 8 - 持续改进

前言&#xff1a; 管理者存在的价值就是制定目标&#xff0c;即目标管理、通过团队&#xff08;他人&#xff09;拿到结果。 要想通过他人拿到结果&#xff1a; &#xff08;1&#xff09;目标&#xff1a;制定符合SMART原则的符合业务需求的目标&#xff0c;团队跳一跳就可以…

AUTOSAR规范与ECU软件开发(实践篇)6.7 服务软件组件与应用层软件组件端口连接

在生成了BSW模块的代码后, 切换到ISOLAR-A系统级设计界面,会发现产生一些基础软件模块的服务软件组件: BswM、 ComM、 Det和EcuM等, 如图6.60所示。 图6.60 生成了BSW后的服务软件组件 此时, 如果涉及服务软件组件与应用层软件组件的交互, 就需要为应用层软件组…

数据结构--树4.1

目录 一、树的定义 二、结点的分类 三、结点间的关系 四、结点的层次 五、树的存储结构 一、树的定义 树&#xff08;Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集。当n0时称为空树&#xff0c;在任意一个非空树中&#xff1a; ——有且仅有一个特定的…

2023年高教社杯 国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

Apache StreamPark系列教程第一篇——安装和体验

一、StreamPark介绍 实时即未来,在实时处理流域 Apache Spark 和 Apache Flink 是一个伟大的进步,尤其是Apache Flink被普遍认为是下一代大数据流计算引擎, 我们在使用 Flink & Spark 时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 我们将一些好的经验…

02.sqlite3学习——嵌入式数据库的基本要求和SQLite3的安装

目录 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模型 ubuntu 22.04下的SQLite安装 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模…

【awd系列】Bugku S3 AWD排位赛-9 pwn类型

文章目录 二进制下载检查分析运行二进制ida分析解题思路exp 二进制下载 下载地址&#xff1a;传送门 检查分析 [rootningan 3rd]# file pwn pwn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for …

Vue中ElementUI结合transform使用时,发现弹框定位不准确问题

在近期开发中&#xff0c;需要将1920*1080放到更大像素大屏上演示&#xff0c;所以需要使用到transform来对页面进行缩放&#xff0c;但是此时发现弹框定位出错问题&#xff0c;无法准备定位到实际位置。 查看element-ui官方文档无果后&#xff0c;打算更换新的框架进行开发&am…

【业务功能篇85】微服务-springcloud-Nginx-反向代理-网关

Nginx域名 1.hosts文件 在c:/window/system32/drivers/etc/hosts文件&#xff0c;我们在这个文件中添加 192.168.56.100 msb.mall.com注意如果是没有操作权限&#xff0c;那么点击该文件右击属性&#xff0c;去掉只读属性即可 通过这个域名访问到Nginx服务 2.Nginx的方向代…

[牛客复盘] 牛客周赛 Round 9 20230827

[牛客复盘] 牛客周赛 Round 9 20230827 总结小美的外卖订单编号1. 题目描述2. 思路分析3. 代码实现 小美的加法1. 题目描述2. 思路分析3. 代码实现 小美的01串翻转1. 题目描述2. 思路分析3. 代码实现 小美的数组操作1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 又是…

Batbot电力云平台在智能配电室中的应用

智能配电室管理系统是物联网应用中的底层应用场景&#xff0c;无论是新基建下的智能升级&#xff0c;还是双碳目标下的能源管理&#xff0c;都离不开智能配电运维对传统配电室的智慧改造。Batbot智慧电力&#xff08;运维&#xff09;云平台通过对配电室关键电力设备部署传感器…

【Redis】Redis是什么、能干什么、主要功能和工作原理的详细讲解

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务

前言 之前虽然单独讲过Security Client和Resource Server的对接&#xff0c;但是都是基于Spring webmvc的&#xff0c;Gateway这种非阻塞式的网关是基于webflux的&#xff0c;对于集成Security相关内容略有不同&#xff0c;且涉及到代理其它微服务&#xff0c;所以会稍微比较麻…

Shiro认证框架

目录 概述 认证授权及鉴权 Shiro框架的核心组件 基本流程 spring bootshiromybatisPlus...实现用户登录 step1:准备工作 (1)坐标 (2)连接数据库 (3)JavaBean (4)dao数据访问层 (5)密码工具类 DigestsUtil (6)配置类 step2&#xff1a;认证功能 step3:授权鉴权 概述…

Arcgis colorRmap

arcgis中colorRmap对应的名称&#xff1a; 信息来源&#xff1a;https://developers.arcgis.com/documentation/common-data-types/raster-function-objects.htm 在arcpy中使用方法&#xff1a; import arcpy cr arcpy.mp.ColorRamp("Yellow to Red")python中 ma…

基于安卓的考研助手系统app 微信小程序

&#xff0c;设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。HBuilder技术作为当前最流行的操作平台&#xff0c;自然也存在着大量的应用服务需求。 本课题研究的是基于HBuilder技术平台的安卓的考研助手APP&#xff0c;开发这款安卓的考研助手APP主要是为了…

下一代存储解决方案:湖仓一体

文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构&#xff0c;它可以同时满足大数据存储和传统数据仓库的需求。具体来说&#xff0c;湖仓一体可以实现以下几个方面的功能&#xff1a; 数据集成&#xff1a; 湖仓一体可以集成多个数据源&#xff0c;包括结构…

TCP学习笔记

最近面试&#xff0c;问TCP被问住了&#xff0c;感觉背八股背了印象不深刻&#xff0c;还是总结一些比较好。 如果有写错的&#xff0c;欢迎批评指正。 参考&#xff1a;https://www.xiaolincoding.com/network/3_tcp/tcp_interview.html#tcp-%E5%9F%BA%E6%9C%AC%E8%AE%A4%E8…

qt在线包下载安装出错 无法检索远程树

我的问题好像是在安装Qt5.15.2出现的。 我的情况是由于网络问题问题&#xff0c;设置开启了本机的代理之后&#xff0c;就可以正常下载了。

Java小游戏

一、需求 二、思路一 HP当然是怪物的一个属性成员&#xff0c;而武器是角色的一个属性成员&#xff0c;类型可以使字符串&#xff0c;用于描述目前角色所装备的武器。角色类有一个攻击方法&#xff0c;以被攻击怪物为参数&#xff0c;当实施一次攻击时&#xff0c;攻击方法被调…
最新文章