TIM定时中断
TIM定时中断
文章目录
- TIM定时中断
- 1.TIM定时器
- 1.1定时器的定义
- 1.1.1基本定时器
- 1.1.2通用定时器
- 1.1.3高级定时器
- 2.计数器有预装时序
- 3.定时器结构及涉及的函数解析
- 3.1定时中断基本结构
- 3.2实现步骤
- 3.3TIM本小节的库函数解释说明
- 3.4计数器计数频率和计数器溢出频率
- 4.定时器定时中断
- 4.1接线图
- 4.2代码编写
- 4.2.1主函数main.c
- 4.2.2定时中断函数定义Timer.c
- 4.2.3定时中断函数定义Timer.h
- 5.定时器外部时钟
- 5.1接线图
- 5.2代码实现
- 5.2.1主函数main.c
- 5.2.2定时器函数定义Timer.c
- 5.2.3定时器函数声明Timer.h
1.TIM定时器
1.1定时器的定义
TIM(Timer)定时器
定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
16位计数器,预分频器,自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
计数器:用来执行计数定时的一个寄存器,每来一个时钟,计数器加1,
分频器:可以对计数器的时钟进行分频,让这个计数更加灵活
自动重装寄存器:就是计数的目标值,就是想要计多少个时钟申请中断
类型 | 编号 | 总线 | 功能 |
---|---|---|---|
高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4
操作之前查一下是否包含需要的外设
1.1.1基本定时器
主模式触发DAC的功能:它能让内部的硬件在不受程序控制下实现自动运行,在某些情景下会极大地减轻CPU的负担
1.1.2通用定时器
1.1.3高级定时器
2.计数器有预装时序
高电平工作,影子寄存器才是真实作用的寄存器
3.定时器结构及涉及的函数解析
3.1定时中断基本结构
3.2实现步骤
第一步 RCC开启时钟,定时器的基准时钟和整个外设的工作时钟就都会同时打开了
第二步 选择时基单元的时钟源,对于定时中断,我们就选择内部时钟源
第三步 配置时基单元,包括预分频器、自动重装器、计数模式等等
第四步 配置输出中断控制、允许更新中断输出到NVIC
第五步 配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
第六步 运行控制
整个模块配置完成后,还需要使能一下计数器,否则计数器是不会运行的,当定时器使能后,计数器就会开始计数了,当计数器更新时,触发中断,最后再写一个定时器的中断函数。
3.3TIM本小节的库函数解释说明
void TIM_DeInit(TIM_TypeDef* TIMx);
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*
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_DeInit(TIM_TypeDef* TIMx);恢复缺省配置
- void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);时基单元初始化,用来配置图中的时基单元的,第一个TIMx选择某个定时器,第二个是结构体,里面包含了配置时基单元的一些参数
- void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);这个函数可以把结构体变量赋一个默认值
- void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);运行控制,用来使能计数器的,第一个参数TIMx选择定时器,第二个NewState新的状态,使能或失能,使能可运行,失能不可运行
- void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);中断输出控制,使能更新中断,第一个TIMx,选择定时器,第二个TIM_IT,选择要配置哪个中断输出,第三个NewState,新的状态,使能还是失能
时钟源选择函数
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
- void TIM_InternalClockConfig(TIM_TypeDef* TIMx);选择内部时钟
- void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);选择ITRx其他定时器的时钟,参数为TIMx选择要配置的定时器和InputTriggerSource,选择要接入哪个其他的定时器
- void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);选择TIx捕获通道的时钟,第一个参数是要配置的定时器,第二个TIxExternalClkSource,选择具体的某个引脚,最后两个参数ICPolarity和ICFilter,输入的极性和滤波器
- void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);选择ETR通过外部时钟模式1输入的时钟,参数ExTRGOrescaler,外部触发预分频器,Polarity和Filter,极性和滤波器
- void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);在不触发输入功能时,上下两个函数可以互换
- 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);
- void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);单独写预分配值的,Prescaler,写入的预分频值,写入的值在更新事件发生后才有效
- 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);
3.4计数器计数频率和计数器溢出频率
CK_CNT_OV:表示计数器的溢出频率,即计数器从 0 开始计数,当计数值达到自动重装载值(ARR)时,计数器溢出并重新开始计数的频率。
CK_CNT:是计数器的时钟频率,也就是计数器每秒钟接收的时钟脉冲数量,它决定了计数器的计数速度。
ARR(Auto Reload Register):自动重装载值,当计数器的值达到 ARR 时,会触发计数器的溢出事件。计数器将被重置为 0 或根据定时器的工作模式进行相应操作,并且可以触发更新事件,如产生中断或更新输出信号。
CK_PSC:是预分频器的输入时钟频率,通常是系统时钟或外部时钟源的频率,它是进入预分频器的时钟频率。
PSC(Prescaler):预分频器的值,用于对输入时钟 CK_PSC 进行分频操作。
计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1)
4.定时器定时中断
4.1接线图
4.2代码编写
4.2.1主函数main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "OLED.h"
//#include "OLED_Font.h"
#include "Timer.h"uint16_t NUM;int main(void){OLED_Init();Timer_Init();OLED_ShowString(1,1,"Num:");while(1){NUM = Get_Num();OLED_ShowNum(1,5,NUM,5);}
}
4.2.2定时中断函数定义Timer.c
#include "stm32f10x.h" // Device header//extern uint16_t num;
uint16_t num;//初始化定时器
void Timer_Init(void){//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//选择时钟源TIM_InternalClockConfig(TIM2);//配置时基单元TIM_TimeBaseInitTypeDef TIM_Structure;TIM_Structure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_Structure.TIM_CounterMode = TIM_CounterMode_Up;TIM_Structure.TIM_Period = 10000 - 1;TIM_Structure.TIM_Prescaler = 7200 - 1;TIM_Structure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TIM_Structure);//中断输出配置TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动清除更新中断标志位,避免刚跟新完就进中断的问题TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_Structure;NVIC_Structure.NVIC_IRQChannel = TIM2_IRQn;NVIC_Structure.NVIC_IRQChannelCmd = ENABLE;NVIC_Structure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_Structure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_Structure);//启动定时器//产生跟新时就会触发中断TIM_Cmd(TIM2,ENABLE);}uint16_t Get_Num(void){return num;
}//配置中断函数
void TIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){num++;//清除标志位TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
4.2.3定时中断函数定义Timer.h
#ifndef __TIMER_H
#define __TIMER_Hvoid Timer_Init(void);
uint16_t Get_Num(void);
#endif
5.定时器外部时钟
5.1接线图
5.2代码实现
5.2.1主函数main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "OLED.h"
//#include "OLED_Font.h"
#include "Timer.h"uint16_t NUM;
uint16_t CNT;int main(void){OLED_Init();Timer_Init();OLED_ShowString(1,1,"Num:");OLED_ShowString(2,1,"Cnt:");while(1){CNT = Timer_GetCount();NUM = Get_Num();OLED_ShowNum(1,5,NUM,5);OLED_ShowNum(2,5,CNT,5);}
}
5.2.2定时器函数定义Timer.c
#include "stm32f10x.h" // Device header//extern uint16_t num;
uint16_t num;//初始化定时器
void Timer_Init(void){//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef Init_Structure;Init_Structure.GPIO_Mode = GPIO_Mode_IPU;Init_Structure.GPIO_Pin = GPIO_Pin_0;Init_Structure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&Init_Structure);//选择时钟源TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);//配置时基单元TIM_TimeBaseInitTypeDef TIM_Structure;TIM_Structure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_Structure.TIM_CounterMode = TIM_CounterMode_Up;//自动重装值TIM_Structure.TIM_Period = 10 - 1;//预分频TIM_Structure.TIM_Prescaler = 1 -1;TIM_Structure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TIM_Structure);//中断输出配置TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动清除更新中断标志位,避免刚跟新完就进中断的问题TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_Structure;NVIC_Structure.NVIC_IRQChannel = TIM2_IRQn;NVIC_Structure.NVIC_IRQChannelCmd = ENABLE;NVIC_Structure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_Structure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_Structure);//启动定时器//产生跟新时就会触发中断TIM_Cmd(TIM2,ENABLE);}uint16_t Get_Num(void){return num;
}//CNT计数器的值
uint16_t Timer_GetCount(void){return TIM_GetCounter(TIM2);
}//配置中断函数
void TIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){num++;//清除标志位TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
5.2.3定时器函数声明Timer.h
#ifndef __TIMER_H
#define __TIMER_Hvoid Timer_Init(void);
uint16_t Get_Num(void);
uint16_t Timer_GetCount(void);
#endif
相关文章:
TIM定时中断
TIM定时中断 文章目录 TIM定时中断1.TIM定时器1.1定时器的定义1.1.1基本定时器1.1.2通用定时器1.1.3高级定时器 2.计数器有预装时序3.定时器结构及涉及的函数解析3.1定时中断基本结构3.2实现步骤3.3TIM本小节的库函数解释说明3.4计数器计数频率和计数器溢出频率 4.定时器定时中…...
Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步
在 Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步(Master-Slave Replication) 的过程略有不同,因为两者的 MySQL 版本和环境存在差异。以下是详细步骤,帮助你完成跨平台的主从…...
中职网络建设与运维ansible服务
ansible服务 填写hosts指定主机范围和控制节点后创建一个脚本,可以利用简化脚本 1. 在linux1上安装系统自带的ansible-core,作为ansible控制节点,linux2-linux7作为ansible的受控节点 Linux1 Linux1-7 Yum install ansible-core -y Vi /etc/ansible/hosts 添加…...
jmeter事务控制器-勾选Generate Parent Sample
1、打开jmeter工具,添加线程组,添加逻辑控制器-事务控制器 2、在事务控制器,勾选Generate parent sample:生成父样本;说明勾选后,事务控制器会作为父节点,其下面的请求作为子节点 3、执行&#…...
win32汇编环境,窗口程序中对多行编辑框的操作
;运行效果 ;win32汇编环境,窗口程序中对多行编辑框的操作 ;比如生成多行编辑框,显示文本、获取文本、设置滚动条、捕获超出文本长度消息等。 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>&g…...
Java反射、静态代理、动态代理
往期推荐 Java io模型-CSDN博客 如何设计一个能根据任务优先级来执行的线程池-CSDN博客 Web实时消息推送的几种方案_setmessageinnerhtml is not defined-CSDN博客 yum、dnf、apt包管理工具-CSDN博客 概述 反射机制是在运行状态中,对于任意一个类,都能够…...
在Android 15的设备上关闭edge-to-edge功能
Android 15在开发上有很多更新,当APP的targetSdk设置为35,且设备系统为Android 15时,APP会自动启动edge-to-edge功能。虽然可视面积变大了,但界面布局也会受影响。 如果要强制关闭edge-to-edge功能。可以在style.xml中将windowOp…...
GIS大模型:交通领域方面的应用
文章目录 1. 实时交通流量预测:2. 动态信号灯控制:3. 交通流模式识别:4. 交通事故预警:5. 路径推荐与导航优化:6. 长期交通规划:7. 事件影响分析:8. 智能停车管理: 大模型在交通流量…...
Vi 和 Vim 文本编辑器使用指南
目录 基本模式 查找与替换 Vi(Visual)和 Vim(Vi Improved)是两款在 Unix/Linux 系统中广泛使用的文本编辑器。Vim 是 Vi 的改进版本,继承了 Vi 的核心功能,并增加了许多新特性,如语法高亮、多…...
redis acl
redis acl redis 安全访问控制 官网 本文基于redis 6.2.17 版本进行测试验证 使用方式 redis 使用 acl 的配置有2种方式:使用 redis.conf 文件配置,和在 redis.conf 文件中配置 aclfile path 指定外部 aclfile 文件路径 使用 redis.conf 文件配置 …...
Linux Centos 安装Jenkins到服务
一、前言 假设你已经下载了jenkins.war 安装了对应的jdk,下面我们来安装jenkins,以服务的形式安装。 二、安装 1)将jenkins.war拷贝到合适的位置,我的位置 /u01/jenkins/ ,位置你自己选。 2)创建系统用户…...
WINFORM - DevExpress -> gridcontrol ---->控件(ColumnEdit控件)
ImageComboBoxEdit--带图片的下拉菜单 DevExpress:带图片的下拉菜单ImageComboBoxEdit_weixin_34313182的博客-CSDN博客 ImageEdit--图片按钮 DevExpress控件中的gridcontrol表格控件,如何在属性中设置某一列显示为图片(图片按钮ÿ…...
工作中redis常用的5种场景
在日常开发工作中,Redis作为一款高性能的内存数据库,凭借其强大的功能特性和卓越的性能表现,已经成为了许多项目中不可或缺的组件。本文将详细介绍Redis在实际工作中最常见的5种应用场景,并附上具体的代码实现。 1. 缓存热点数据…...
得物App利用技术赋能,打造潮流消费“新玩法”
如今,技术的力量正在以前所未有的方式重塑着我们的消费体验。从线上购物到虚拟现实,技术的角色越来越重要,它不仅是推动商业发展的引擎,更是满足年轻消费者多元化、个性化需求的关键。得物App作为一个年轻人喜爱的潮流消费平台&am…...
tomcat状态一直是Exited (1)
docker run -di -p 80:8080 --nametomcat001 你的仓库地址/tomcat:9执行此命令后tomcat一直是Exited(1)状态 解决办法: 用以下命令创建运行 docker run -it --name tomcat001 -p 80:8080 -d 你的仓库地址/tomcat:9 /bin/bash最终结果 tomcat成功启动...
015: 深度学习之正向传播和反向传播
本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一节介绍了训练和推理的概念,这一节接着训练和推理的概念讲一下,神经网络的正向传播和反向传播。 正反向传播 其实单看正向传播和反向传播这两个…...
ubuntu下安装编译cmake,grpc与protobuf
文章目录 install cmakeinstall grpcinstall protobuf注 install cmake sudo apt-get install -y g make libssl-devcd third_party/cmake-3.17.2./configuresudo make && make installcmake --version install grpc $ sudo apt-get install -y build-essential auto…...
如何在Mac上使用Brew更新Cursor应用程序
在这篇博文中,我们将介绍如何在Mac上更新Cursor应用程序,以及一些相关的使用技巧和功能。 什么是Cursor? Cursor是一款强大的工具,旨在帮助用户更好地编写、编辑和讨论代码。它结合了AI技术,使得编程过程更加高效和便…...
玩转大语言模型——使用graphRAG+Ollama构建知识图谱
系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 文章目录 系列文章目录前言下载和安装用下载项目的方式下载并安装用pip方式下载并安装 生成知识图谱初始化文件夹修改模型配置修改知识库生成配置创…...
LevelDB 源码阅读:如何优雅地合并写入和删除操作
LevelDB 支持写入单个键值对和批量写入多个键值对,这两种操作的处理流程本质上是相同的,都会被封装进一个 WriteBatch 对象中,这样就可以提高写操作的效率。 在 LevelDB 中,WriteBatch 是通过一个简单的数据结构实现的࿰…...
Vue.js 组件的生命周期钩子
Vue.js 组件的生命周期钩子 在 Vue.js 中,组件的生命周期是指组件从创建到销毁的整个过程。在这个过程中,Vue 提供了多个 生命周期钩子,让我们可以在不同的阶段执行特定的逻辑。掌握这些钩子非常重要,它们能帮助我们灵活控制组件…...
VD:生成a2l文件
目录 前言Simulink合并地址 ASAP2 editor 前言 我之前的方法都是通过Simulink模型生成代码的过程中顺便就把a2l文件生成出来了,这时的a2l文件还没有地址,所以紧接着会去通过elf文件更新地址,一直以为这是固定的流程和方法,今天无…...
【C++ 类和对象 进阶篇】—— 逻辑森林的灵动精灵,舞动类与对象的奇幻圆舞曲
欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创…...
【Hive】海量数据存储利器之Hive库原理初探
文章目录 一、背景二、数据仓库2.1 数据仓库概念2.2 数据仓库分层架构2.2.1 数仓分层思想和标准2.2.2 阿里巴巴数仓3层架构2.2.3 ETL和ELT2.2.4 为什么要分层 2.3 数据仓库特征2.3.1 面向主题性2.3.2 集成性2.3.3 非易失性2.3.4 时变性 三、hive库3.1 hive概述3.2 hive架构3.2.…...
前端web
学习笔记: 基本属性 color: 设置文本的颜色。代码:color: red;background-color: 设置元素的背景颜色。background-color: blue;font-size: 设置文本的大小font-size: 16px;font-family: 设置文本的字体font-family: Arial, sans-serif;text-align: 设…...
如何通过 Nginx 实现 CouchDB 集群的负载均衡并监控请求分发
在现代分布式系统中,负载均衡是确保高可用性和性能的关键组件。CouchDB 是一个强大的分布式数据库,而 Nginx 是一个高性能的反向代理和负载均衡器。本文将详细介绍如何通过 Nginx 实现 CouchDB 集群的负载均衡,并监控请求被分发到哪一台 Couc…...
基于代理的RAG实现-Agentic RAG
基于代理的RAG实现-Agentic RAG Agentic RAG 体系结构中,不再被动地响应查询请求,而是主动地分析初步检索到的信息,并基于对任务复杂性的评估,战略性地选择最为合适的工具和方法进行进一步的数据检索和处理。这种多步骤推理和决策…...
ZIP怎么加密?
想要禁止他人随意解压zip压缩包,我们可以加密zip文件,那么zip设置密码的方法有哪些?今天分享三个加密方法 工具:WinRAR,这里需要注意,WinRAR默认压缩格式是.rar,所以我们想要加密zip文件&#…...
森林网络部署,工业4G路由器实现林区组网远程监控
在广袤无垠的林区,每一片树叶的摇曳、每一丝空气的流动,都关乎着生态的平衡与安宁。林区监控正以强大的力量,为这片绿色家园筑起一道坚固的防线。 工业 4G 路由器作为林区监控组网的守护者,凭借着卓越的通讯性能,突破…...
汽车网络信息安全-ISO/SAE 21434解析(上)
目录 概述 第四章-概述 1. 研究对象和范围 2. 风险管理 第五章-组织级网络安全管理 1. 网络安全治理(cybersecurity governance) 2. 网络安全文化(cybersecurity culture) 3. 信息共享(Information Sharing) 4. 管理体系…...
一个方法被多个线程同时调用,确保同样参数的调用只能有一个线程执行,不同参数的调用则可以多个线程同时执行
我们知道通过lock一个固定静态object给代码段加同步锁,可以让多个线程的同时调用以同步执行,因此可以利用字典来给不同参数分配不同的静态对象,方法中不同的参数调用锁住各自不同的静态对象即可实现不同参数不加锁,相同参数才加锁…...
军用通信设备通用规范GJB367A-2001试验
军用通信设备通用规范GJB367A-2001通常适用于地面、舰载和机载设备的型式试验验收标准,地面设备分为便携式设备、固定式设备和车载式设备。 GJB367A-2001军用通信设备通用规范规定了军用通信设备或系统的通用要求和检验验收规则以及试验方法。 GJB367A-2001军用通…...
AWS云计算概览(自用留存)
目录 一、云概念概览 (1)云服务模型 (2)云计算6大优势 (3)web服务 (4)AWS云采用框架(AWS CAF) 二、云经济学 & 账单 (1)定…...
AWS云平台上生成式AI通过项目文档内容分析获知项目风险
要在AWS云平台上设计和实施高性能系统,同时使用生成式人工智能识别项目风险来分析项目文档内容。 利用生成式AI分析项目文档并协助风险管理可以显著提高识别和解决AWS上托管的复杂项目中的风险的速度、准确性和效率。通过将AI的功能与传统的项目管理最佳实践相结合&…...
搜广推日常实习面经一
写在前面:除了校招的面经,实习的面经我也会更新,毕竟俺后续可能还要找一段实习。从八股来看,实习的八股更加的八股一点。和校招的面经有点不一样,所以还是可以学习了解一下。总之一句话:面向工作学习&#…...
分布式CAP理论介绍
分布式CAP理论是分布式系统设计中的一个核心概念,由加州大学伯克利分校的Eric Brewer教授在2000年的ACM研讨会上首次提出,随后在2002年由Seth Gilbert和Nancy Lynch从理论上证明。以下是对分布式CAP理论的详细剖析: 文章目录 一、CAP理论的基本概念二、CAP理论的取舍策略三、…...
网格参数化,Mesh parameterization processing
目录 前言1.Barycentric mappingMapping 步骤实例 2.Laplace mapping3.Laplace improvement4.Coding 前言 多边形网格的类型多种多样。本文所实现的网格多边形参数化是指三角多边形。 不同的表示被用来编码三维物体的几何形状。选择一种表示方式取决于在上游的获取过程和下游的…...
路由环路的产生原因与解决方法(1)
路由环路 路由环路就是数据包不断在这个网络传输,始终到达不了目的地,导致掉线或者网络瘫痪。 TTL (生存时间):数据包每经过一个路由器的转发,其数值减1,当一个数据包的TTL值为0是,路…...
编程工具箱(免费,离线可用)
https://www.yuque.com/huanmin-4bkaa/ii1hx1?# 《工具箱》 常用的大部分工具都有, 比如mysql可视化 redis可视化, json编辑器, 加解密等(免费,离线可用) 后续也会慢慢的集成...
从Arrays源码学习定义工具类
背景 在日常编码中,一个比较好的实践是:我们把一些业务无关的、可复用的一些通用逻辑,封装成工具类、甚至jar包。这样一方面方便通用代码抽取、代码复用,同时也隔离经常变动的业务代码和不变的通用代码。那如何定义好一个工具类呢…...
Unity中实现倒计时结束后干一些事情
问题描述:如果我们想实现在一个倒计时结束后可以执行某个方法,比如挑战成功或者挑战失败,或者其他什么的比如生成boss之类的功能,而且你又不想每次都把代码复制一遍,那么就可以用下面这种方法。 结构 实现步骤 创建一…...
FPGA随记——时钟时序一些基本知识
原文链接:跨时钟域设计-CSDN博客 前言 CDC(clock domain crossing)检查(跨时钟域的检查)是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系,这样Setup/Hold不满足而产生了亚稳态是无法避免…...
【微服务】SpringBoot 通用异常处理方案使用详解
目录 一、前言 二、SpringBoot 异常介绍 2.1 SpringBoot 中异常定义 2.1.1 SpringBoot 异常处理机制的重要性 2.2 常用的异常分类 2.3 常用的异常处理解决方案 三、springboot 异常处理操作实践 3.1 springboot自适应错误处理机制 3.1.1 使用默认错误页面 3.1.2 自定义…...
初识MyBatis(详细)
目录 回顾 前提回忆下web应用程序的三层架构: 编辑 一.什么是MyBatis? 二.Mybatis操作数据库的步骤: 2.1准备工作 2.2配置Mybatis(数据库连接信息) 2.3写持久层代码 2.4测试 三.Mybatis配置文件 3.1打印日志 3.2参数传递…...
elementui表单验证,数据层级过深验证失效
先看示例代码,代码为模拟动态获取表单数据,然后动态添加rules验证规则,示例表单内输入框绑定form内第四层: <template><el-form :model"form" :rules"rules" ref"ruleForm" label-width&…...
HTTPS与HTTP:区别及安全性对比
目录 一、基础概念 二、安全性对比 1. 加密传输 2. 身份验证 3. 数据完整性 4. 端口 5. 浏览器展示方式 三、使用场景与性能 1. 使用场景 2. 性能开销 四、成本与维护 五、搜索引擎优化(SEO) 六、案例分析 七、隐私保护与中间人攻击 八、…...
中国石油大学(华东)自动评教工具(涵盖爬虫的基础知识,适合练手)
我开发了一个用于自动评教的工具,大家可以试着用用,下面是链接。 https://github.com/restrain11/auto_teachingEvaluate 可以点个星吗,感谢!🫡 以下是我在开发过程中学到的知识 以及 碰到的部分问题 目录 动态爬虫和静…...
蓝桥杯备考:二叉树详解
二叉树的概念和相关术语 二叉树的定义:每个结点度至多为2的树,叫二叉树 二叉树的子树有左右之分不可以随意颠倒顺序,也就是说二叉树是有序树 二叉树根结点左子树右子树 满二叉树:就是把每一层的结点都铺满 满二叉树的性质…...
大模型微调介绍-Prompt-Tuning
提示微调入门 NLP四范式 第一范式 基于「传统机器学习模型」的范式,如TF-IDF特征朴素贝叶斯等机器算法. 第二范式 基于「深度学习模型」的范式,如word2vec特征LSTM等深度学习算法,相比于第一范式,模型准确有所提高,…...
《机器学习》——PCA降维
文章目录 PCA降维简介什么是主成分分析? 主成分的选择与维度确定降维的数学过程PCA降维求解步骤降维后的效果和应用场景中的优势PCA模型API参数Attributes属性PCA对象的方法 PCA降维实例导入所需库导入数据集对数据进行处理创建PCA模型并训练查看训练结果对降维数据…...