PY32F003F18之输入捕获

输入捕获是定时器的功能之一,配合外部引脚,捕获脉宽时间或采集周期。

CPU中的定时器最基本的功能就是计数功能,其次是输入捕获(IC),再次就是比较输出(OC),还有就是使用引脚对外部时钟进行计数,触发信号捕捉等。

1、输入捕获功能图:

2、测试程序

#include "TIM1_EdgeAligned_InputCapture.h"
#include "LED.h"/*
将PA3复用为TIM1_CH1,用作捕获信号输入引脚,
PA4为TIM3中断时输出的信号,将这两个脚短接,使用示波器跟踪PA0的信号,就可以测试。
*/void TIM1_COUNTERMODE_UP_IC1_Init(uint16_t arr,uint16_t psc);
void TIM3_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc);void HAL_TIM_IC_MspInit1(TIM_HandleTypeDef *htim)
{GPIO_InitTypeDef   GPIO_InitStructure;if(htim->Instance == TIM1)//初始化TIM1{__HAL_RCC_TIM1_CLK_ENABLE();  //使能TIM1时钟__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟GPIO_InitStructure.Pin = GPIO_PIN_3;       //选择第3脚,PA3是为TIM1_CH1GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; //复用功能推挽模式GPIO_InitStructure.Pull = GPIO_PULLUP;     //引脚上拉被激活GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //引脚速度为最高速GPIO_InitStructure.Alternate = GPIO_AF13_TIM1;//选择AF13,将PA3引脚复用为TIM1_CH1HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器//将PA3初始化为TIM1_CH1功能,用作IC11输入捕获引脚HAL_NVIC_SetPriority(TIM1_CC_IRQn,1, 0); //设置"捕获/比较"的中断优先级为1HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);        //开启"捕获/比较"总中断}if(htim->Instance == TIM3)//初始化TIM3{}
}//函数功能:TIM1中基本计数功能,并使能了更新中断,每次重装ARR值时会产生一次更新中断
//arr:自动重装值。
//psc:时钟预分频数
//TIM1_COUNTERMODE_UP_IC1_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;
//TIM1_COUNTERMODE_UP_IC1_Init(20000,80);//若使用HSI,当arr=20000,psc=80时,则为200ms,误差为10us;
void TIM1_COUNTERMODE_UP_IC1_Init(uint16_t arr,uint16_t psc)
{GPIO_InitTypeDef   GPIO_InitStructure;TIM_HandleTypeDef  TIM1_HandleStructure;TIM_IC_InitTypeDef TIM1_IC_InitStructure;//HAL_TIM_IC_MspInit开始/__HAL_RCC_TIM1_CLK_ENABLE();  //使能TIM1时钟__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟GPIO_InitStructure.Pin = GPIO_PIN_3;       //选择第3脚,PA3是为TIM1_CH1GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; //复用功能推挽模式GPIO_InitStructure.Pull = GPIO_PULLUP;     //引脚上拉被激活GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //引脚速度为最高速GPIO_InitStructure.Alternate = GPIO_AF13_TIM1;//选择AF13,将PA3引脚复用为TIM1_CH1HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器//将PA3初始化为TIM1_CH1功能,用作IC11输入捕获引脚HAL_NVIC_SetPriority(TIM1_CC_IRQn,1, 0); //设置"捕获/比较"的中断优先级为1HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);        //开启"捕获/比较"总中断
//HAL_TIM_IC_MspInit结束/TIM1_HandleStructure.Instance = TIM1;   //选择TIM1TIM1_HandleStructure.Init.Period            = arr-1;//设置在下一个更新事件产生时,装入"自动重载入寄存器TIMx_ARR"的值//将(arr-1)写入"自动重载入寄存器TIMx_ARR",设置自动重装载值TIM1_HandleStructure.Init.Prescaler         = psc-1;//设置用来作为TIMx时钟频率除数的预分频值//将(psc-1)写入"预装载寄存器TIMx_PSC",的PSC[15:0],设置预分频值//计数器的时钟频率CK_CNT=fCK_PSC/(PSC[15:0]+1)TIM1_HandleStructure.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;//时钟不分频,则tDTS=tCK_INT//若使用HSE,计算公式:arr*psc/24000000/1,当arr=20000,psc=240时,则为200ms,误差为10us;//若使用HSI,计算公式:arr*psc/8000000/1,当arr=20000,psc=80时,则为200ms,误差为100us;TIM1_HandleStructure.Init.CounterMode       = TIM_COUNTERMODE_UP;//向上计数TIM1_HandleStructure.Init.RepetitionCounter = 1 - 1;//不重复计数//将(1-1)写入"重复计数寄存器TIMx_RCR"中的REP[7:0],设置"重复计数器值"TIM1_HandleStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;//"自动重装载寄存器"没有缓冲//不允许将"TIMx自动重新加载寄存器TIMx_ARR"的值被装入缓冲区;HAL_TIM_Base_Init(&TIM1_HandleStructure);    //TIM1初始化//选择计数器模式:向上计数//设置时钟分频因子:时钟不分频,则tDTS=tCK_INT//设置自动重装载:"自动重装载寄存器"没有缓冲//设置自动重装载值:TIM_Base_InitStructure.Period//设置预分频值:TIM_Base_InitStructure.Prescaler//设置"重复计数器值":TIM_Base_InitStructure.RepetitionCounter//启动更新事件:将TIMx_EGR中的UG位置1,由软件产生更新事件TIM1_IC_InitStructure.ICPolarity  = TIM_ICPOLARITY_RISING;   //上升沿捕获TIM1_IC_InitStructure.ICSelection = TIM_ICSELECTION_DIRECTTI;//CC1通道配置为输入TIM1_IC_InitStructure.ICPrescaler = TIM_ICPSC_DIV1;          //输入不分频TIM1_IC_InitStructure.ICFilter    = 0;                       //输入无滤波HAL_TIM_IC_ConfigChannel(&TIM1_HandleStructure, &TIM1_IC_InitStructure, TIM_CHANNEL_1);//配置通道1输入捕获HAL_TIM_IC_Start_IT(&TIM1_HandleStructure, TIM_CHANNEL_1);//使能输入捕获1中断,使能输入捕获1通道
}//函数功能:TIM3中基本计数功能,并使能了更新中断,每次重装ARR值时会产生一次更新中断
//arr:自动重装值。
//psc:时钟预分频数
//TIM3_COUNTERMODE_UP_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;
//TIM3_COUNTERMODE_UP_Init(20000,80);//若使用HSI,当arr=20000,psc=80时,则为200ms,误差为10us;
void TIM3_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc)
{TIM_HandleTypeDef  TIM3_HandleStructure;//HAL_TIM_Base_MspInit开始/__HAL_RCC_TIM3_CLK_ENABLE();           //使能TIM3时钟HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); //设置中断优先级HAL_NVIC_EnableIRQ(TIM3_IRQn);         //使能TIM3中断
//HAL_TIM_Base_MspInit开始/TIM3_HandleStructure.Instance = TIM3;   //选择TIM3TIM3_HandleStructure.Init.Period            = arr-1;//设置在下一个更新事件产生时,装入"自动重载入寄存器TIMx_ARR"的值//将(arr-1)写入"自动重载入寄存器TIMx_ARR",设置自动重装载值TIM3_HandleStructure.Init.Prescaler         = psc-1;//设置用来作为TIMx时钟频率除数的预分频值//将(psc-1)写入"预装载寄存器TIMx_PSC",的PSC[15:0],设置预分频值//计数器的时钟频率CK_CNT=fCK_PSC/(PSC[15:0]+1)TIM3_HandleStructure.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;//时钟不分频,则tDTS=tCK_INT//若使用HSE,计算公式:arr*psc/24000000/1,当arr=20000,psc=240时,则为200ms,误差为10us;//若使用HSI,计算公式:arr*psc/8000000/1,当arr=20000,psc=80时,则为200ms,误差为100us;TIM3_HandleStructure.Init.CounterMode       = TIM_COUNTERMODE_UP;//向上计数TIM3_HandleStructure.Init.RepetitionCounter = 1 - 1;//不重复计数//将(1-1)写入"重复计数寄存器TIMx_RCR"中的REP[7:0],设置"重复计数器值"TIM3_HandleStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;//"自动重装载寄存器"没有缓冲//不允许将"TIMx自动重新加载寄存器TIMx_ARR"的值被装入缓冲区;HAL_TIM_Base_Init(&TIM3_HandleStructure);    //TIM3初始化//选择计数器模式:向上计数//设置时钟分频因子:时钟不分频,则tDTS=tCK_INT//设置自动重装载:"自动重装载寄存器"没有缓冲//设置自动重装载值:TIM_Base_InitStructure.Period//设置预分频值:TIM_Base_InitStructure.Prescaler//设置"重复计数器值":TIM_Base_InitStructure.RepetitionCounter//启动更新事件:将TIMx_EGR中的UG位置1,由软件产生更新事件HAL_TIM_Base_Start_IT(&TIM3_HandleStructure);//允许计数器产生"更新中断";//如果计数器不是工作在触发模式中,则开始计数
}//函数功能:TIM1输入捕获中断服务程序
//IC1为上升沿捕获,所以捕获周期是TIM3周期的2倍
void TIM1_CC_IRQHandler(void)
{
HAL_TIM_PeriodElapsedCallback开始/if (_HAL_TIM_GET_FLAG(TIM1,TIM_FLAG_CC1) != RESET){//根据TIM_FLAG_CC1,读"TIMx状态寄存器(TIMx_SR)"中输入捕获中断标志位_HAL_TIM_CLEAR_IT(TIM1, TIM_IT_CC1);//TIM_IT_CC1,令CC1IF=0,清除输入捕获中断标志位TIM1_LED_Toggle();}
HAL_TIM_PeriodElapsedCallback结束/
}//函数功能:TIM3中断服务程序
void TIM3_IRQHandler(void)
{
HAL_TIM_PeriodElapsedCallback开始/if (_HAL_TIM_GET_FLAG(TIM3,TIM_FLAG_UPDATE) != RESET){//根据TIM_FLAG_UPDATE,读"TIMx状态寄存器(TIMx_SR)"中更新中断标志位_HAL_TIM_CLEAR_IT(TIM3, TIM_IT_UPDATE);//TIM_IT_UPDATE,令UIF=0,清除定时器更新中断标志位TIM3_LED_Toggle();}
HAL_TIM_PeriodElapsedCallback结束/
}

#ifndef __TIM1_EdgeAligned_InputCapture_H
#define __TIM1_EdgeAligned_InputCapture_H#include "py32f0xx_hal.h"#define _HAL_TIM_GET_FLAG(__INSTANCE__, __FLAG__)          (((__INSTANCE__)->SR &(__FLAG__)) == (__FLAG__))
//根据__FLAG__,读"TIMx状态寄存器(TIMx_SR)"中相应的中断标志位
//TIM_FLAG_UPDATE,若UIF=1,建立"更新事件"
//TIM_FLAG_CC1,若CC1IF=1,如果通道CC1配置为输出模式,则建立"CC1输出事件";
//TIM_FLAG_CC1,若CC1IF=1,如果通道CC1配置为输入模式,则建立"CC1捕获事件"
//TIM_FLAG_CC2,若CC2IF=1,如果通道CC2配置为输出模式,则建立"CC2输出事件";
//TIM_FLAG_CC2,若CC2IF=1,如果通道CC2配置为输入模式,则建立"CC2捕获事件"
//TIM_FLAG_CC3,若CC3IF=1,如果通道CC3配置为输出模式,则建立"CC3输出事件";
//TIM_FLAG_CC3,若CC3IF=1,如果通道CC3配置为输入模式,则建立"CC3捕获事件"
//TIM_FLAG_CC4,若CC4IF=1,如果通道CC4配置为输出模式,则建立"CC4输出事件";
//TIM_FLAG_CC4,若CC4IF=1,如果通道CC4配置为输入模式,则建立"CC4捕获事件";
//TIM_FLAG_COM,若COMIF=1,则建立"COM事件"
//TIM_FLAG_TRIGGER,若TIF=1,则建立"触发事件"
//TIM_FLAG_BREAK,若BIF=1,则建立"刹车事件"
//TIM_FLAG_CC1OF,若CC1OF=1,则表示"计数器x的值被捕获到TIMx_CCR1寄存器"
//TIM_FLAG_CC2OF,若CC2OF=1,则表示"计数器x的值被捕获到TIMx_CCR2寄存器"
//TIM_FLAG_CC3OF,若CC3OF=1,则表示"计数器x的值被捕获到TIMx_CCR3寄存器"
//TIM_FLAG_CC4OF,若CC4OF=1,则表示"计数器x的值被捕获到TIMx_CCR4寄存器"#define _HAL_TIM_CLEAR_IT(__INSTANCE__, __INTERRUPT__)      ((__INSTANCE__)->SR = ~(__INTERRUPT__))
//根据__INTERRUPT__,将"TIMx状态寄存器(TIMx_SR)"中相应的中断标志位置0
//TIM_IT_UPDATE,令UIF=0,清除定时器更新中断标志位
//TIM_IT_CC1,令CC1IF=0,清除捕获/比较1中断标志位
//TIM_IT_CC2,令CC2IF=0,清除捕获/比较2中断标志位
//TIM_IT_CC3,令CC3IF=0,清除捕获/比较3中断标志位
//TIM_IT_CC4,令CC4IF=0,清除捕获/比较4中断标志位
//TIM_IT_COM,令COMIF=0,清除COM事件中断标志位
//TIM_IT_TRIGGER,令TIF=0,清除触发中断标志位
//TIM_IT_BREAK,令BIF=0,清除刹车中断标志位extern void TIM1_COUNTERMODE_UP_IC1_Init(uint16_t arr,uint16_t psc);
extern void TIM3_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc);
#endif /* __TIM1_EdgeAligned_InputCapture_H */
#include "py32f0xx_hal.h"
#include "SystemClock.h"
#include "delay.h"
#include "LED.h"
#include "TIM1_EdgeAligned_InputCapture.h"int main(void)
{HSE_Config();
//	HAL_Init();//systick初始化delay_init();HAL_Delay(1000);TIM1_LED_Init();TIM3_LED_Init();TIM1_COUNTERMODE_UP_IC1_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;TIM3_COUNTERMODE_UP_Init(20000,240);//若使用HSE,当arr=20000,psc=240时,则为200ms,误差为10us;while (1){delay_ms(100);
//		TIM1_LED_Toggle();
//		TIM3_LED_Toggle();}
}
#include "LED.h"void TIM1_LED_Init(void);
void TIM3_LED_Init(void);//函数功能:TIM1_LED灯引脚初始化,并配置为关灯
void TIM1_LED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟//初始化PA0GPIO_InitStructure.Pin = GPIO_PIN_0;                  //选择第0脚GPIO_InitStructure.Pull = GPIO_PULLUP;                //引脚上拉被激活GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //配置GPIO速度为极高GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;        //设置引脚工作模式为推挽输出方式HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//根据GPIO_InitStructure结构变量指定的参数初始化GPIOA的外设寄存器TIM1_LED_Off();
}//函数功能:TIM3_LED灯引脚初始化,并配置为关灯
void TIM3_LED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟//初始化PB5GPIO_InitStructure.Pin = GPIO_PIN_4;                  //选择第4脚GPIO_InitStructure.Pull = GPIO_PULLUP;                //引脚上拉被激活GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //配置GPIO速度为极高GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;        //设置引脚工作模式为推挽输出方式HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//根据GPIO_InitStructure结构变量指定的参数初始化GPIOA的外设寄存器TIM3_LED_Off();
}

将PA3复用为TIM1_CH1,用作捕获信号输入引脚,PA4为TIM3中断时输出的信号,将这两个脚短接,使用示波器跟踪PA0的信号,就可以测试。

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

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

相关文章

阿里云 linux 的nginx 配置uni-app的H5前端项目vue,后端接口阿里云。

背景 vue项目调用接口是阿里云的,H5网站也要部署到阿里云,2个不同的服务器,需要做nginx部署与api代理。 端口配置 首先当然是买个阿里云服务器,这里是配置是linux系统,配置访问的域名 ,再接着&#xff1…

iOS系统暗黑模式

系统暗黑模式: 暗黑模式颜色适配: 方式1: Assets配置:在Assets中配置好颜色后,可以通过colorNamed: 放大获取到动态颜色。 方式2:代码配置,通过代码colorWithDynamicProvider: 可以看出来生成…

【Obsidian】中编辑模式和阅读模式光标乱跳问题以及编辑模式中段落聚集的问题解决

前言 最近用Obsidian 软件写md笔记,但是当我分别使用编辑模式和阅读模式时出现了光标乱跳的问题。比如我在编辑模式,光标停留在第500行,但是切换成编辑模式就变成了1000行。而且光标根本没停在原来的位置。这样重新定位非常麻烦。 两种阅读…

我眼中的大数据: 我们未来该往何处

满打满算,工作接近三年的时间了,入行大数据也三年了。从开始时惊艳于大数据处理的高效,到现在时常迷茫未来数据的出路在哪,恍恍惚惚跨过了互联网的高峰。今天突然觉得,该总结下过去,思考下未来。我尽可能少…

自动化控制系统的设计重点是什么?

要实现对选择性激光烧结系统预热温度的控制,需要找到合理的控制对象模型,但选择性激光烧结设备的预热温度场是一个复杂的非线性系统,很难找到合理的控制对象模型来实现预热温度场的温度控制。模糊控制不需要具体的控制模型,预热温…

3ds max文件打包?max插件CG Magic一键打包整起!

3ds max文件如何打包?这个问题,小编听到不少网友的提问! 今天CG Magic小编来和大家聊聊,文件更高效的操作,如何打包处理呢? 3DMAX这款软件的受众群体是比较高的,在工作方便的同时,…

系统架构设计高级技能 · 构件与中间件技术

点击进入系列文章目录 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 系统架构设计高级技能 构件与中间件技术 一、构件的定义二、构件系统架构特性三…

电脑大文件删除了能恢复吗 电脑大文件删除了怎么恢复

在日常办公中,电脑是必不可少的办公工具,电脑能够帮助我们储存大量的大文件,但是有时候可能会因为一些误操作或者电脑故障等情况,导致一些电脑大文件的丢失,所以今天就和大家分享一下,电脑大文件删除了能恢…

jmeter采集ELK平台海量业务日志( 采用Scroll)

由于性能测试需要,需采集某业务系统海量日志(百万以上)来使用。但Elasticsearch的结果分页size单次最大为10000(运维同事为保证ES安全)。为了能够快速采集ELK平台业务日志,可以使用以下2种方式采集&#xf…

Ubuntu下高效Vim的搭建(离线版)

软件界面 可以看到界面下方有一些常用提示信息:文件路径、format、文件类型、光标所在的坐标(x,y)、进度条(百分比)、日期时间 会提示已定义的变量名词(快速补全) 搭建方法 下载资源文件 把Vim 和 .vimrc 拷贝到家目录下,并执行tar -xvf Vim 即可。 …

社区团购商城小程序v18.1开源独立版+前端

新增后台清理缓存功能 修复定位权限 修复无法删除手机端管理员 11月新登录接口修复! 修复商家付款到零钱, 修复会员登陆不显示头像, 修复无法修改会员开添加绑定

【微信小程序】网络请求

环境&#xff1a;微信小程序开发工具 测试api&#xff08;随机获取猫咪靓照&#xff09;:https://api.thecatapi.com/v1/images/search?limit2 示例&#xff1a; 完整代码 request.wxml <button bind:tap"requestBtn" type"primary">网络请求&l…

Otter改造 增加springboot模块和HTTP调用功能

环境搭建 & 打包 环境搭建&#xff1a; 进入 $otter_home/lib 目录执行&#xff1a;bash install.sh 打包&#xff1a; 进入$otter_home目录执行&#xff1a;mvn clean install -Dmaven.test.skip -Denvrelease发布包位置&#xff1a;$otter_home/target 项目背景 阿里…

【小沐学CAD】嵌入式UI开发工具:GL Studio

文章目录 1、简介2、软件功能3、应用行业3.1 航空3.2 汽车3.3 防御3.4 工业3.5 电力与能源3.6 医疗3.7 空间3.8 科技 结语 1、简介 https://disti.com/gl-studio/ DiSTI 是 HMI 软件、虚拟驾驶舱、仪表、信息娱乐、集群显示器和嵌入式 UI 解决方案的领先提供商。 而它的GL Stu…

React如何实现国际化?

目录 一、Redux准备工作 commonTypes.js commonActions.js commonReducer.js rootReducer.js 二、然后定义SelectLang组件 index.js index.less 三、创建语言包 welcomeLocale.js index.js 四、使用 react的入口文件 App.js welcome.js 附 关于如何实现国际…

OpenCV项目实战(2)— 如何用OpenCV实现弹球动画

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。OpenCV能够在画布上绘制静态的图形&#xff0c;例如&#xff0c;线段、矩形、正方形、圆形、多边形、文字等。那么&#xff0c;能不能让这些静态的图形移动起来&#xff1f;如果能&#xff0c;又该如何编写代码呢&#xff…

论文总结《A Closer Look at Few-shot Classification Again》

原文链接 A Closer Look at Few-shot Classification Again 摘要 这篇文章主要探讨了在少样本图像分类问题中&#xff0c;training algorithm 和 adaptation algorithm的相关性问题。给出了training algorithm和adaptation algorithm是完全不想关的&#xff0c;这意味着我们…

Day46:项目-购物车案例

购物车案例 准备工作 首页默认加载&#xff0c;其余页面懒加载 调用defineStore方法构建store 入口main做对应配置&#xff0c;找指南&#xff0c;快速开始&#xff0c;把elementplus引入进来 import { createApp } from "vue"; import { createPinia } from &qu…

典型数据结构-栈/队列/链表、哈希查找、二叉树(BT)、线索二叉树、二叉排序树(BST树)、平衡二叉树(AVL树)、红黑树(RB树)

目录 典型数据结构列举 栈/队列/链表 树 二叉树 线索二叉树 二叉排序树 平衡二叉树&#xff08;AVL树&#xff09; 红黑树 其它树种和应用介绍 典型数据结构列举 栈/队列/链表 描述略。 一些基本的简单实现参考/数据结构简单实现/文件夹里面。 线性表详解&#xff…

Spring Boot 动态加载jar文件

Spring Boot 动态加载jar文件 接口实现&#xff1a; package org.bc.device;public interface IDeviceHandler {String start();String stop(); }实现类&#xff1a; package org.bc.device; public class MqttDevice implements IDeviceHandler{ Override public String s…