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

02:STM32--EXTI外部中断

目录

一:中断

1:简历

2:AFIO

 3:EXTI

​编辑

 4:NVIC基本结构

5:使用步骤

二:中断的应用

A:对外式红外传感计数器

1:连接图​编辑

 2:函数介绍

3:硬件介绍

 4:计数代码

B;旋转编码计数器

1:连接图

 2:硬件介绍

3:旋转编码器代码:


一:中断

1:简历

        中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

        中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源

        中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回

        STM32中断: 68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级 (EXTI可以产生中断的,众多外设之一)

2:AFIO

使用这个函数GPIO_EXTILineConfig配置那个引脚为中断引脚: 调用这个函数,就可以配置AFIO的数据选择器,来选择我们想要的中断引脚

        AFIO主要用于引脚复用功能的选择和重定义

        在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

 3:EXTI

EXTI_Init:

        调用这个函数,就可以根据这个结构体里的参数配置EXTI外设, 使用方法和GPIO Init也是一样;         

        选择那个IO口为中断IO口(和前面的AFIO引脚配置保持一致), 

        选择那个方式触发中断(中断模式,事件模式)

        选择触发中断的方式 (上升沿触发,下降沿触发,上升沿和下降沿触发)

 EXTI简介:
        EXTI(Extern Interrupt)外部中断

        EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

        支持的触发方式:上升沿/下降沿/双边沿/软件触发

        支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断     (PA1、PB1、PC1这样的,PAO和PBO这样的相同的Pin只能选1个作为中断引脚)  PA6和PA7、PA9和PB15、PBO和PB1这样的都可以

原因:AFOI会在APIOA,APIO,APIOC中选择一个GPIO的16个引脚连接到后面的EXTI

        通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

触发响应方式:中断响应/事件响应

 

基本结构:

EXTI框图

 4:NVIC基本结构

嵌套中断向量控制器: 用来统一分配断优先级和管理中断的

A:使用NVIC_PriorityGroupConfig函数先分组;分组完成后抢占优先级和响应优先级的号不能超过表中的范围

B:使用NVIC_Init初始化  (1:选择通道,选择抢占优先级和响应优先级)

 NVIC优先级分组:

         NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级(更加紧急)和低4-n位的响应优先级(紧急)抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队   (中断号:EXTI简历中的优先级)

        抢占优先级>响应优先级

        优先级的数是值越小,优先级越高,0就是最高优先级

5:使用步骤

1:第一步,配置RCC,把我们这里涉及的外设的时钟都打开(GPIO,AFIO)

2:第二步,配置GPIO,选择我们的端口为输入模式

3:第三步,配置AFIO,选择我们用的这一路GPIO,连接到后面的EXT

4:第四步,配置EXTI,选择边沿触发方式比如上升沿、下降沿或者双边沿, 还有选择触发响应方式,可以选择中断响应和事件响应

5:第五步,配置NVIC,给我们这个中断选择一个合适的优先级

最后,通过NVIC,外部中断信号就能进入CPU了

1:EXIT和NVIC的时钟一直是打开状态不需要开启

二:中断的应用

A:对外式红外传感计数器

1:连接图

 2:函数介绍

配置AFIO在文件中stm32f10x_gpio.h

void GPIO_AFIODeInit(void);

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

GPIO_AFIODeInit: 用来复位AFIO外设, 调用这个函数AFIO外设的配置就会全部清除

GPIO_PinLockConfig: 参数指定位那个引脚, 那这个引脚的配置就会被锁定,防止意外更改

GPIO_EventOutputConfig 和GPIO_EventOutputCmd :  配置AFIO的事件输出功能的

GPIO_PinRemapConfig: 引脚重新映射,  第一个参数可以选择你要重映射的方式,第二个参数是新的状态

GPIO_EXTILineConfig: 调用这个函数,就可以配置AFIO的数据选择器,来选择我们想要的中断引脚

GPIO_ETH_MediaInterfaceConfig:关于以太网的

配置EXTI在stm32f10x exti.h文件中

void EXTI_DeInit(void);
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

EXTI_DeInit: EXTI的配置都清除,恢复成上电默认的状态

EXTI_Init:调用这个函数,就可以根据这个结构体里的参数配置EXTI外设, 使用方法和GPIO Init也是一样

EXTI_StructInit:  可以把参数传递的结构体变量赋一个默认值

EXTI_GenerateSWInterrupt:软件触发外部中断

在主函数中你想查看标志位和清除标志位使用下面的函数

EXTI_GetFlagStatus:可以获取指定的标志位是否被置1了

EXTI_ClearFlag: 可以对置1的标志位进行清除

在中断函数里,如果你想查看标志位和清除标志位使用下面的函数

EXTI_GetITStatus: 获取中断标志位是否被置1了(检测外部中断的状态)

EXTI_ClearITPendingBit: 清除中断挂起标志位

配置NMIC在misc.h文件中的函数

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);

NVIC_PriorityGroupConfig:用来中断分组的,参数是中断分组的方式

NVIC_Init: 根据结构体里面指定的参数初始化NMIC

NVIC_SetVectorTable: 设置中断向量表

NVIC_SystemLPConfig :系统低功耗配置

3:硬件介绍

 4:计数代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"uint16_t CountSensor_count;
void CountSensor_Init(void){//1:配置RCC,把我们这里涉及的外设的时钟都打开(GPIO,AFIO)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//2:配置GPIO,选择我们的端口为输入模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//3:配置AFIO,选择我们用的这一路GPIO,连接到后面的EXTGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//4: 第四步,配置EXTI,选择边沿触发方式比如上升沿、下降沿或者双边沿, 还有选择触发响应方式,可以选择中断响应和事件响应EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line14;//14IO口作为中断EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发EXTI_Init(&EXTI_InitStructure);//5:配置NVIC,给我们这个中断选择一个合适的优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//到NVIC的通道NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级NVIC_Init(&NVIC_InitStructure);
}uint16_t CountSensor_Get(void)
{return CountSensor_count;
}//STM32的中断函数名字不能变,在启动文件里面查看
void EXTI15_10_IRQHandler(void){ //在中断函数里,查看中断标志位是否被置1了,看是不是PB14口引发的中断(通道10~15都可以进去)if (EXTI_GetITStatus(EXTI_Line14)==SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*///读取PB14IO口是否为低电频if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0){CountSensor_count++;}
//清除中断挂起标志位EXTI_ClearITPendingBit(EXTI_Line14);}
}int main(void)
{    
//OLED屏幕代码省略OLED_Init();CountSensor_Init();OLED_ShowString(1, 1, "Count:");while (1){OLED_ShowNum(1, 7, CountSensor_Get(), 5);}
}

B;旋转编码计数器

1:连接图

 2:硬件介绍

 

 我们使用判断正反转的条件:

        正转-----B相下降沿和A相低由平时同时满足时;

        反转----在A相下降沿和B相低电频同时满足时;

本次使用了两个中断注意:

PB0和PB1设置为中断:

A:配置AFIO时:需要配置两个引脚

B:配置EXTI时:X.EXTI_Line需要配置两个 (X.EXTI_Line = EXTI_Line0 | EXTI_Line1)

C:配置NVIC时: 一次分组,2次初始化

中断函数分析:
当A为中断IO口时: A为下降沿触发中断,B1和B0同时为低电频时满足正转

当B为中断IO口时: A为下降沿触发中断,B0和B1同时为低电频时满足反转

(中断函数处理全局变量时,可以改变全局变量的值)

3:旋转编码器代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"int16_t Encoder_Count;void Encoder_Init(void)
{//1:配置RCC,把我们这里涉及的外设的时钟都打开(GPIO,AFIO)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//2:配置GPIO,选择我们的端口为输入模式  注意打开了2个中断GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//3:配置AFIO,选择我们用的这一路GPIO,连接到后面的EXTGPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);//4: 第四步,配置EXTI,选择边沿触发方式比如上升沿、下降沿或者双边沿, 还有选择触发响应方式,可以选择中断响应和事件响应EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发EXTI_Init(&EXTI_InitStructure);//5:配置NMIC,给我们这个中断选择一个合适的优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; 到NVIC的通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;  到NVIC的通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&NVIC_InitStructure);
}//返回每次调用这个Get函数之后,返回Count的变化值
//每次调用这个函数都会加1或者减1int16_t Encoder_Get(void)
{int16_t Temp;Temp = Encoder_Count;/*返回的temp是局部变量,在栈区,也就是该函数一旦执行完,就会被系统释放,当再次循环调用到该函数时,get里的temp就需要被重新赋值,temp被赋值0,无论主函数如何循环都是变成了NUM+=0*//*如果返回函数不清零的话,数字就变成等差数列求和,清零的话就疯狂加或者减一*/Encoder_Count = 0;return Temp; 
}//void EXTI0_IRQHandler(void)
//{检测外部中断状态,如果状态为SET,会返回真(true),否则返回假(false)。
//	if (EXTI_GetITStatus(EXTI_Line0) == SET)
//	{
//		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
//		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)
//		{//中断函数的处理可以改变全局变量的值
//			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
//			{
//				Encoder_Count --;
//			}
//		}
//		EXTI_ClearITPendingBit(EXTI_Line0);
//	}
//}
void EXTI0_IRQHandler(void)
{检测外部中断状态,如果状态为SET,会返回真(true),否则返回假(false)。if (EXTI_GetITStatus(EXTI_Line0) == SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){//中断函数的处理可以改变全局变量的值Encoder_Count --;}EXTI_ClearITPendingBit(EXTI_Line0);}
}
//void EXTI1_IRQHandler(void)
//	{	//检测外部中断状态,如果状态为SET,会返回真(true),否则返回假(false)。
//	if (EXTI_GetITStatus(EXTI_Line1) == SET)
//	{
//		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
//		
//		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) //PB1为低电频
//		{
//			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)  //PB0为低电频
//			{//中断函数的处理可以改变全局变量的值
//				Encoder_Count ++;
//			}
//		}
//		//清除中断挂起标志位
//		EXTI_ClearITPendingBit(EXTI_Line1);
//	}
//}
void EXTI1_IRQHandler(void){	//检测外部中断状态,如果状态为SET,会返回真(true),否则返回假(false)。if (EXTI_GetITStatus(EXTI_Line1) == SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)  //PB0为低电频{//中断函数的处理可以改变全局变量的值Encoder_Count ++;}//清除中断挂起标志位EXTI_ClearITPendingBit(EXTI_Line1);}
}
int16_t Num;int main(void)
{OLED_Init();Encoder_Init();OLED_ShowString(1, 1, "Num:");while (1){Num += Encoder_Get();OLED_ShowSignedNum(1, 5, Num, 5);}
}

相关文章:

02:STM32--EXTI外部中断

目录 一:中断 1:简历 2:AFIO 3:EXTI ​编辑 4:NVIC基本结构 5:使用步骤 二:中断的应用 A:对外式红外传感计数器 1:连接图​编辑 2:函数介绍 3:硬件介绍 4:计数代码 B;旋转编码计数器 1:连接图 2:硬件介绍 3:旋转编码器代码: 一:中断 1:简历 中断:在主程…...

CLickhouse核心特性

目录 CLickhouse核心特性 1 完备的DBMS功能 2 列式存储与数据压缩 3 向量化执行引擎 4 关系模型与SQL查询 5 多样化的表引擎 6 多线程与分布式 7 多主架构 8 在线查询 9 数据分片与分布式查询 Clickhouse适用场景 Clickhouse不适用场景 Clickhouse名称含义 CLickh…...

如何运用小程序技术闭环运营链路?

如何通过线上小程序获取用户线索,提高企业抗风险能力,建立有效的营销数字化系统一直是困扰每一个小程序开发者与运营者的问题。 当我们选择使用小程序设计自己的运营流程时,从「推广」到「转化」,再到最终的「留存」都是运营过程…...

使用chatGPT-4 畅聊量子物理学(二)

Omer 量子力学的主导哲学或模型或解释是什么? ChatGPT 量子力学是一门描述微观世界中粒子行为的物理学理论,但它的解释和哲学观点在学术界存在多种不同的观点和争议。以下是几种主要的哲学观点或解释: 哥本哈根解释:这是最为广泛…...

读《Flask Web开发实战》(狼书)笔记 | 第1、2章

前言 2023-8-11 以前对网站开发萌生了想法,又有些急于求成,在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣,存在许多模糊或不太理解的地方,只会照葫芦画瓢。 而当自己想开发一个什么网站的时&…...

Tomcat+Http+Servlet

文章目录 1.HTTP1.1 请求和响应HTTP请求:请求行请求头请求体HTTP响应:响应行(状态行)响应头响应体 2. Apache Tomcat2.1 基本使用2.2 IDEA中创建 Maven Web项目2.3 IDEA中使用Tomcat 3. Servlet3.1 Servlet快速入门3.2 Servlet执行…...

Leaflet入门,Leaflet如何实现vue双向绑定数据添加到图片标记物到地图上,动态根据vue数据更新到地图上以及鼠标经过标记物显示提示框

前言 本章使用Leaflet的vue2-leaflet或者vue-leaflet插件方式实现vue数据绑定地图数据,实现地图标记物与vue数据的双向联动更新,以及鼠标经过标记物显示提示框功能。 实现效果演示 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定…...

C++设计模式结构型之代理模式

一、概述 代理模式是一种结构型模式,在很多不同的场合具有广泛的分类和应用。其主要实现的思想是在客户端和真正要访问的对象之间引入一个 代理对象(间接层),于是,以往客户端对真正对象的访问现在变成了通过代理对…...

使用PHP实现实时聊天功能的匿名聊天与加密传输

使用PHP实现实时聊天功能的匿名聊天与加密传输 随着互联网的发展,人与人之间的交流方式也发生了天翻地覆的变化。其中,实时聊天功能成为了一种越来越受欢迎的交流方式。对于很多网站来说,提供匿名聊天功能能够吸引更多的用户参与&#xff0c…...

Maven 基础之依赖管理、范围、传递、冲突

文章目录 关于依赖管理坐标和 mvnrepository 网站pom.xml 中"引"包 依赖范围依赖传递依赖冲突 关于依赖管理 坐标和 mvnrepository 网站 在 maven 中通过『坐标』概念来确定一个唯一确定的 jar 包。坐标的组成部分有&#xff1a; 元素说明<groupId>定义当前…...

Python jupyter lab 设置

在下载好jupyter lab 后&#xff0c;需要对其进行设置&#xff0c;尤其是远程服务器的时候&#xff0c;因为根本就是没有屏幕&#xff0c;也没有浏览器。 新建设置文件 jupyter lab --generate-config设置文件内部参数 vim ~/.jupyter/jupyter_lab_config.py进去一通改&#…...

水库大坝安全监测系统实施方案

一、方案概述 水库大坝作为特殊的建筑&#xff0c;其安全性质与房屋等建筑物完全不同&#xff0c;并且建造在地质构造复杂、岩土特性不均匀的地基上&#xff0c;目前对于大坝监测多采用人工巡查的方法&#xff0c;存在一定的系统误差&#xff0c;其工作性态和安全状况随时都在变…...

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会)

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会) Glove子词嵌入上游、下游任务监督学习、无监督学习BERTGlove 子词嵌入 上游、下游任务 监督学习、无监督学习 BERT...

Debian10:安装PHPVirtualBox

PHPVirtualBox 是一个用 PHP 编写&#xff0c;用于管理 VirtualBox 的 Web 前端&#xff08;由AJAX实现&#xff09;。 参考文章&#xff1a;VirtualBoxPHPVirtualBox部署_骡子先生的博客-CSDN博客php virualbox,浏览器远程控制VBox 虚拟机phpVirtualBox_weixin_39815879的博客…...

RANSAC算法

RANSAC简介 RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。 “外点”一般指的的数据中的噪声&#xff0c;比如说匹配中的误匹配和估计曲线中的离群点。所以&#xff0c;RANSAC也是一种“外点”检…...

考研408 | 【计算机网络】 传输层

导图 传输层的功能 传输层的两个协议 传输层的寻址与端口 UDP协议 UDP的主要特点 UDP首部格式&#xff1a; UDP校验&#xff1a; TCP协议 TCP协议的特点 TCP报文段首部格式 TCP连接管理 TCP的连接建立 SYN洪泛攻击 TCP的连接释放 TCP可靠传输 序号&#xff1a; 确认&#xff1…...

Redis_缓存3_缓存异常(数据不一致、雪崩、击穿、穿透)

14.6缓存异常 四个方面 缓存中数据和数据库不一致缓存雪崩缓存击穿缓存穿透 14.6.1数据不一致&#xff1a; 一致性包括两种情况 缓存中有数据&#xff0c;需要和数据库值相同缓存中没有数据&#xff0c;数据库中的数据是最新值 如果不符合以上两种情况&#xff0c;则出现…...

谁能讲清楚Spark之与MapReduce的对比

我们已经知道Spark是如何设计和实现数据处理流程的,这里我们 再深入思考一下,为什么Spark能够替代MapReduce成为主流的大数据处理框架呢?对比MapReduce,Spark究竟有哪些优势? 一 优势 1 通用性: 基于函数式编程思想,MapReduce将数据类型抽象为,k,v格式,并将数据处理…...

Android自定义侧滑Item

源码地址&#xff1a;https://github.com/LanSeLianMa/CustomizeView/tree/master/cehuaitem 使用方式一&#xff1a;XML布局中直接使用 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com…...

c++11 标准模板(STL)(std::basic_stringbuf)(三)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allocator<CharT> > class basic_stringbuf : public std::basic_streambuf<CharT, Traits> std::basic_stringbuf…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...