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

94.STM32外部中断

目录

1.什么是 NVIC?

2.NVIC寄存器 

3.中断优先级 

4.NVIC的配置 

设置中断分组​编辑

配置某一个中断的优先级

5.什么是EXTI

6.EXTI和NVIC之间的关系 

7.SYSCFG 的介绍 


1.什么是 NVIC?

        NVIC是一种中断控制器,主要用于处理 ARM Cortex-M 微控制器的中断管理。NVIC 负责处理中断优先级、中断向量表以及中断使能和禁止等任务。

  1. 中断向量表: NVIC 维护了中断向量表,其中包含了中断服务程序的入口地址。当中断发生时,CPU会根据中断号(或中断向量)在中断向量表中查找相应的中断服务程序的入口地址。

  2. 中断优先级: NVIC 允许为每个中断配置优先级。这些优先级决定了中断在系统中的响应顺序。Cortex-M架构中,中断优先级通常是基于位宽的,较低位的值表示较高的优先级。

  3. 嵌套中断: NVIC 支持嵌套中断,即在处理某个中断时,如果发生更高优先级的中断请求,系统可以中断当前中断服务程序,处理更高优先级的中断,然后返回继续处理低优先级的中断。这种特性对于实时系统和复杂任务处理非常有用。

  4. 中断使能和禁止: NVIC 允许对每个中断进行使能和禁止。这使得可以在运行时动态地配置系统中的中断。

  5. 中断状态: NVIC 提供了一些寄存器用于查询和管理中断状态,例如检查某个中断是否处于挂起状态。

  6. 中断控制寄存器: NVIC 通过一系列寄存器(如 NVIC_ISER、NVIC_ICER、NVIC_ISPR、NVIC_ICPR)提供中断的使能、禁止、挂起和清除等功能。

2.NVIC寄存器 

typedef struct
{__IOM uint32_t ISER[8U]; /* 中断使能寄存器 */uint32_t RESERVED0[24U];__IOM uint32_t ICER[8U]; /* 中断清除使能寄存器 */uint32_t RSERVED1[24U];__IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */uint32_t RESERVED2[24U];__IOM uint32_t ICPR[8U]; /* 中断解挂寄存器 */uint32_t RESERVED3[24U];__IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */uint32_t RESERVED4[56U];__IOM uint8_t IP[240U]; /* 中断优先级寄存器(8Bit 位宽) */uint32_t RESERVED5[644U];__OM uint32_t STIR; /* 中断触发中断寄存器 */
} NVIC_Type;

STM32F407 的中断在这些寄存器的控制下有序的执行的。只有了解这些中断寄存器,才能
方便的使用 STM32F407 的中断。下面重点介绍这几个寄存器:

1.ISER[8](Interrupt Set Enable Register):中断使能寄存器
2.ICER[8](Interrupt Clear Enable Registers):中断除能寄存器

3.ISPR[8](Interrupt Set Pending Registers):中断使能挂起控制寄存器,通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是⽆效的。
4.ICPR[8](Interrupt Clear Pending Registers):中断解除挂起控制寄存器

5.IABR[8](Interrupt Active Bit Registers):是⼀个中断激活标志位寄存器组。对应位所代表的中断和 ISER ⼀样,如果为 1,则表示该位所对应的中断正在被执行。这是⼀个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
6.IP [240](Interrupt Priority Registers):中断优先级控制寄存器组。由240个8bit的寄存器组成,每个可屏蔽中断占用8bit。但我们只用IP[81] - IP[0]这82个。并且,每个中断通道占用的8bit并没有全部使用,而是只用了高4位。

3.中断优先级 

        STM32 中的中断优先级可以分为:抢占式优先级和响应优先级,每个中断源都需要被指定这两种优先级。抢占式优先级和响应优先级的区别:
        抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
        响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。
        还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循
自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
        在 NVIC 中由寄存器 NVIC_IPR0-NVIC_IPR59 共 60 个寄存器控制中断优先级,每个寄存器的每 8 位又分为一组,可以分 4 组,所以就有了 240 组宽度为 8bit 的中断优先级控制寄存器,
原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是实际上 M3 /M4
/M7 芯片为了精简设计,只使用了高四位[7:4],低四位取零,这样以至于最多只有 16 级中断嵌
套,即 2^4=16。

        抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。 抢占优先级和响应优先级相同的,按中断号(中断向量表)先后执行。

4.NVIC的配置 

设置中断分组

配置某一个中断的优先级

函数名称:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

typedef struct
{uint8_t NVIC_IRQChannel;  //表示要配置的中断通道(或中断号)                  uint8_t NVIC_IRQChannelPreemptionPriority;  //表示中断的抢占优先级。uint8_t NVIC_IRQChannelSubPriority;  //表示中断的响应优先级。      FunctionalState NVIC_IRQChannelCmd; //表示中断通道的使能状态。       
} NVIC_InitTypeDef;

下面是结构体成员的解释:

  1. NVIC_IRQChannel 表示要配置的中断通道(或中断号)。对于 ARM Cortex-M 微控制器,中断通道的编号是硬件定义的,代表不同的中断源。例如,USART1 的中断通道号是 USART1_IRQn

  2. NVIC_IRQChannelPreemptionPriority 表示中断的抢占优先级。中断的抢占优先级决定了在同一时间发生多个中断时,哪个中断可以立即被处理,而哪些需要等待。这是一个 0 到 N-1(N 是抢占优先级位数)的值,值越小表示优先级越高。

  3. NVIC_IRQChannelSubPriority 表示中断的子优先级。在同一抢占优先级组内,子优先级决定了不同中断的响应顺序。这是一个 0 到 N-1(N 是子优先级位数)的值,值越小表示优先级越高。

  4. NVIC_IRQChannelCmd 表示中断通道的使能状态。可以为 ENABLEDISABLE,分别表示使能或禁止相应的中断通道。

5.什么是EXTI

   EXTI 是外部中断(External Interrupt)控制器的缩写,用于处理与外部事件(通常是硬件引脚的状态变化)相关的中断。在 STM32 微控制器中,EXTI 模块与 GPIO 模块一起使用,以便在特定事件(如边沿触发、电平触发等)发生时触发相应的中断。 

初始化函数:void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);EXTI外设的时钟默认是开启的

typedef struct
{uint32_t EXTI_Line;              EXTIMode_TypeDef EXTI_Mode;      EXTITrigger_TypeDef EXTI_Trigger; FunctionalState EXTI_LineCmd;     
}EXTI_InitTypeDef;
  1. EXTI_Line 指定要启用或禁用的外部中断线。这个参数可以是 EXTI_Lines 枚举类型中的任何组合值,表示一个或多个中断线。例如,EXTI_Line0 表示外部中断线0。
  2. EXTI_Mode 指定外部中断线的工作模式。这个参数可以是 EXTIMode_TypeDef 枚举类型的值,表示中断线的触发模式。例如,EXTI_Mode_Interrupt 表示中断模式。
  3. EXTI_Trigger 指定外部中断线的触发方式,即触发信号的边沿。这个参数可以是 EXTITrigger_TypeDef 枚举类型的值,表示中断线触发的方式,如上升沿、下降沿等。
  4. EXTI_LineCmd 指定所选外部中断线的新状态。这个参数可以是 FunctionalState 枚举类型的值,表示中断线的使能或禁止状态,可以是 ENABLEDISABLE

6.EXTI和NVIC之间的关系 

  1. EXTI 模块配置中断线: EXTI 负责配置外部中断线,将外部事件(通常是引脚状态的变化)连接到中断系统。它定义了中断线的触发条件、使能状态等。EXTI 允许你设置哪些引脚上的事件会触发中断,以及中断是由上升沿、下降沿还是上升和下降沿都触发。配置好 EXTI 后,当与之相关联的外部事件发生时,EXTI 会产生中断请求。

  2. NVIC 确定中断优先级: 一旦 EXTI 产生中断请求,中断请求会传递给 NVICNVIC 负责管理所有中断的优先级。在STM32中,中断的优先级是按组管理的,NVIC 允许配置每个中断的优先级。这就是为什么在使用外部中断时,需要通过 NVIC 设置中断的优先级。

  3. 中断处理函数:NVIC 配置好中断优先级后,当外部中断被触发时,NVIC 会根据中断优先级的设定决定是否打断当前正在执行的程序。如果中断被接受,NVIC 会跳转到相应的中断处理函数,该函数是由用户编写的,通常用于处理与中断相关的任务。在中断处理函数中,需要清除相应的中断标志,通常是通过 EXTI_ClearITPendingBit 来完成。

7.SYSCFG 的介绍 

   SYSCFG 是STM32微控制器中的一个系统配置寄存器,用于配置和控制一些系统级别的功能和外设。主要的作用包括配置外部中断线、使能内部的传感器和控制外设的引脚映射。

1.中断线映射: SYSCFG 允许将外部中断线映射到不同的中断通道。在使用外部中断时,需要配置 SYSCFG 以选择相应的中断通道。

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
//上述例子将 GPIOA 的引脚0与外部中断线0相关联。 

2.定时器触发映射: 对于某些定时器,SYSCFG 允许配置触发源。例如,可以将外部信号映射到定时器的触发输入。

TIM1_ETR_Config(TIM1_ETRSource_TI1, TIM1_ExtTRGPSC_DIV1, TIM1_ExtTRGPolarity_NonInverted, 0x00);
//上述例子配置了TIM1定时器的触发源。

3.内部传感器使能: SYSCFG 允许使能内部的温度传感器和电压检测器。

SYSCFG_VBATMonitoringCmd(ENABLE);
//上述例子使能了电池电压检测器。

4.BOOT模式配置: SYSCFG 允许配置启动时的引脚状态,以确定系统启动时的模式。

SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
//上述例子将内部SRAM映射到系统的起始地址。

 第一步:时钟的使能

  • 1)使能GPIO时钟
  • 2)使能SYSCFG时钟
  • ** EXTI和 NVIC的时钟默认是打开的

第二步:配置GPIO
第三步:配置SYSCFG

  • 配置函数:SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
  • 功能:选择中断引脚

第四步:初始化EXTI

  • 初始化函数:EXTI_Init();

第五步:配置NVIC

  • 1) 设置优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//整个⼯程只设置⼀次
  • 2) 初始化:NVIC_Init();

第六步:编写中断函数

 

#include "stm32f4xx.h"                  // Device headervoid EXTI3_IRQHandler(void){//判断是否有中断if(EXTI_GetITStatus(EXTI_Line3)==SET){GPIO_SetBits(GPIOF,GPIO_Pin_9);GPIO_SetBits(GPIOF,GPIO_Pin_10);EXTI_ClearITPendingBit(EXTI_Line3);}
}
void EXTI4_IRQHandler(void){//判断是否有中断if(EXTI_GetITStatus(EXTI_Line4)==SET){GPIO_ResetBits(GPIOF,GPIO_Pin_9);GPIO_ResetBits(GPIOF,GPIO_Pin_10);EXTI_ClearITPendingBit(EXTI_Line4);}
}int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);GPIO_InitTypeDef GPIO_InitTypeDefStruct;GPIO_InitTypeDef GPIO_InitTypeDefStruct1;//初始化按键GPIO_InitTypeDefStruct.GPIO_Mode = GPIO_Mode_IN;//GPIO_InitTypeDefStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitTypeDefStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3;GPIO_InitTypeDefStruct.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitTypeDefStruct.GPIO_Speed = GPIO_High_Speed;GPIO_Init(GPIOE,&GPIO_InitTypeDefStruct);//初始化LEDGPIO_InitTypeDefStruct1.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitTypeDefStruct1.GPIO_OType = GPIO_OType_PP;GPIO_InitTypeDefStruct1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitTypeDefStruct1.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitTypeDefStruct1.GPIO_Speed = GPIO_High_Speed;GPIO_Init(GPIOF,&GPIO_InitTypeDefStruct1);//配置SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);//EXTI_InitTypeDef EXIT_STRUCT;EXIT_STRUCT.EXTI_Line=EXTI_Line4;EXIT_STRUCT.EXTI_Mode=EXTI_Mode_Interrupt;EXIT_STRUCT.EXTI_Trigger=EXTI_Trigger_Falling;EXIT_STRUCT.EXTI_LineCmd=ENABLE;EXTI_Init(&EXIT_STRUCT);EXTI_InitTypeDef EXIT_STRUCT1;EXIT_STRUCT1.EXTI_Line=EXTI_Line3;EXIT_STRUCT1.EXTI_Mode=EXTI_Mode_Interrupt;EXIT_STRUCT1.EXTI_Trigger=EXTI_Trigger_Falling;EXIT_STRUCT1.EXTI_LineCmd=ENABLE;EXTI_Init(&EXIT_STRUCT1);//设置中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef nvic_struct;nvic_struct.NVIC_IRQChannel=EXTI4_IRQn;nvic_struct.NVIC_IRQChannelPreemptionPriority=0;nvic_struct.NVIC_IRQChannelSubPriority=1;nvic_struct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&nvic_struct);NVIC_InitTypeDef nvic_struct1;nvic_struct1.NVIC_IRQChannel=EXTI3_IRQn;nvic_struct1.NVIC_IRQChannelPreemptionPriority=1;nvic_struct1.NVIC_IRQChannelSubPriority=2;nvic_struct1.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&nvic_struct1);while(1){EXTI3_IRQHandler();EXTI4_IRQHandler();}
}

 

相关文章:

94.STM32外部中断

目录 1.什么是 NVIC? 2.NVIC寄存器 3.中断优先级 4.NVIC的配置 设置中断分组​编辑 配置某一个中断的优先级 5.什么是EXTI 6.EXTI和NVIC之间的关系 7.SYSCFG 的介绍 1.什么是 NVIC? NVIC是一种中断控制器,主要用于处理 ARM Cort…...

【Linux】快速上手自动化构建工具make/makefile

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.什么是make / makefile 2…...

HarmonyOS

基本概念 1、ARKTS是由ArkUI框架提供,它是声明式UI 2、声明式UI的思想:- 关心描述UI的呈现结果,而不关心过程;- 状态驱动视图更新自定义组件的组成 关键字说明举例struct声明组件名struct ToDolist 代办组件EntryComponent装饰…...

Docker安装Oracle18c 坑已排完,放心食用

Docker安装Oracle18c 坑已排完,放心食用 0、有问题可邮件我1、拉取 oracle18c 镜像, 推荐使用 zhengqing版本的镜像2、启动容器3、等待容器启动完成, 这一步很慢很慢, 别着急4、进入容器5、修改管理员密码6、查看并设置环境变量7、设置监听模式支持以SID方式连接PDB数据库8、使…...

2023年第十二届数学建模国际赛小美赛C题雪崩防范求解分析

2023年第十二届数学建模国际赛小美赛 C题 雪崩防范 原题再现: 雪崩是极其危险的现象。现在,我们对雪崩是如何形成的已经有了很好的理解,但是我们还不能详细地预测雪崩发生的原因、时间和地点。村庄和道路可以通过各种方式防止雪崩。避免在脆…...

Nginx Openresty通过Lua+Redis 实现动态封禁IP

需求 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。对于黑名单中的 IP ,我们将拒绝提供服务。并且可以设置封禁失效时间 环境准备 linux version: centos7 / ubuntu 等 redis version: 5.0.5 nginx version: nginx…...

.Net 字符集与编解码

0 .NET 字符集编解码 .Net 内部使用的字符集是Unicode,如果需要编码为其他诸如GBK、UTF8编码,可以通过Encoding 类来实现。 using System.Text;void PrintBytes(byte[] bytes) {foreach (var b in bytes){Console.Write("{0:X} ", b);}Conso…...

Spinnaker 基于 jenkins 触发部署

jenkins job 触发部署 将 Jenkins 设置为 Spinnaker 中的持续集成 (CI) 系统可让您使用 Jenkins 触发管道、向管道添加 Jenkins 阶段或向管道添加脚本阶段。 前置要求: 已在kubernetes中部署spinnaker已准备可用的jenkins实例 启用 jenkins触发器 官方文档&…...

FLASK博客系列6——数据库之谜

我们上一篇已经实现了简易博客界面,你还记得我们的博客数据是自己手动写的吗?但实际应用中,我们是不可能这样做的。大部分程序都需要保存数据,所以不可避免要使用数据库。我们这里为了简单方便快捷,使用了超级经典的SQ…...

Clickhouse UPDATE 和 DELETE操作

历史: 在OLAP数据库中,可变数据(Mutable data)通常是不被欢迎的,Clickhouse也是如此,早期版本不支持UPDATE和DELTE操作。在Clickhouse 1.1.54388版本之后才支持UPDATE和DELETE操作,适用于Merge…...

golang channel执行原理与代码分析

使用的go版本为 go1.21.2 首先我们写一个简单的chan调度代码 package mainimport "fmt"func main() {ch : make(chan struct{})go func() {ch <- struct{}{}ch <- struct{}{}}()fmt.Println("xiaochuan", <-ch)data, ok : <-chfmt.Println(&…...

OpenCvSharp从入门到实践-(04)色彩空间

目录 1、GRAY色彩空间 2、从BGR色彩空间转换到GRAY色彩空间 2.1色彩空间转换码 2.2实例 BGR色彩空间转换到GRAY色彩空间 3、HSV色彩空间 4、从BGR色彩空间转换到HSV色彩空间 4.1色彩空间转换码 4.2实例 BGR色彩空间转换到HSV色彩空间 1、GRAY色彩空间 GRAY色彩空间通常…...

100.有序数组的平方(力扣)

代码解决一 class Solution { public:// 函数接受一个整数数组&#xff0c;返回每个元素平方值排序后的结果vector<int> sortedSquares(vector<int>& nums) {int len nums.size(); // 获取数组的长度vector<int> v; // 创建一个新的数组&#xff0c;用…...

微服务--01--简介、服务拆分原则

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 微服务微服务架构&#xff0c;是服务化思想指导下的一套最佳实践架构方案。服务化&#xff0c;就是把单体架构中的功能模块拆分为多个独立项目。 单体架构微服务架构…...

IntelliJ IDEA安装使用教程

IntelliJ IDEA是一个流行的Java 集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。它是一款全功能的IDE&#xff0c;支持多种编程语言&#xff0c;如Java、Kotlin、Groovy、Scala、Python、JavaScript、HTML、CSS等等。IntelliJ IDEA 提供了高效的代码…...

校园门禁可视化系统解决方案

随着科技的持续进步&#xff0c;数字化校园在教育领域中的地位日益上升&#xff0c;各种智能门禁、安防摄像头等已遍布校园各个地方&#xff0c;为师生提供安全便捷的通行体验。然而数据收集分散、缺乏管理、分析困难等问题也逐渐出现&#xff0c;在这个数字化环境中&#xff0…...

rest_framework_django学习笔记一(序列化器)

rest_framework_django学习笔记一(序列化器) 一、引入Django Rest Framework 1、安装 pip install djangorestframework2、引入 INSTALLED_APPS [...rest_framework, ]3、原始RESTful接口写法 models.py from django.db import models 测试数据 仅供参考 INSERT INTO de…...

面试题:什么是负载均衡?常见的负载均衡策略有哪些?

文章目录 一、负载均衡二、负载均衡模型分类三、CDN负载均衡四、LVS负载均衡4.1 LVS 支持的三种模式4.1.1 DR 模式4.1.2 TUN 模式4.1.3 NAT 模式 4.2 LVS 基于 Netfilter 的框架实现 五、负载均衡策略是什么六、常用负载均衡策略图解6.1 轮询6.2 加权轮询6.3 最少连接数6.4 最快…...

精通Git(第2版)读书笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言第 1章 入门 11.1 关于版本控制 11.1.1 本地版本控制系统 1 第 2章 Git基础 132.1 获取Git仓库 132.1.1 在现有中初始化Git仓库 132.1.2 克隆现有仓库 14 2.2 在…...

XUbuntu22.04之OBS30.0设置录制音频降噪(一百九十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

保姆级教程:在无网络无显卡的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…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...