STM32的中断介绍

2023-10-29

目录

一、STM32中断应用概览

(1)简介

(2)中断编程的顺序:

1.使能中断请求:

2.中断优先级分组:

3.配置NVIC寄存器,初始化NVIC_InitTypeDef;

4.编写中断服务函数

二、EXTI—外部中断/事件控制器

(1)简介

(2)EXTI结构图

(3)初始化结构体成员

(4)程序设计:

1.初始化要连接到EXTI的GPIO。

2.初始化EXTI用于产生中断/事件

3.初始化NVIC,用于处理中断

4.编写中断服务函数

5.main函数

一、STM32中断应用概览

(1)简介

STM32 中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里面去讲都不合适,这里单独抽出一章来做一个总结性的介绍。

中断:把正常正在运行的程序打断,运行中断服务函数,运行完之后再回到主程序,与51大体相仿。

外部中断,体现在外设水平,系统异常,体现在内核水平。下面,中断就是异常,异常就是中断。

 

 以上向量表中,灰色标住的是体现在内核水平的(异常),其余的是外设水平的(外部中断)。

中断由NVIC这个外设来控制。

NVIC:嵌套向量中断控制器,属于内核外设,管理着包括部分内核和片上所有外设的中断相关的功能。 两个重要的库文件:core_cm3.h(定义所有内核上面的寄存器,NVIC寄存器就在这里面)和misc.h(相关的函数)。

对于中断而言,最重要的是优先级,由NVIC->IPRx(中断优先级寄存器)设定。打开内核寄存器的手册,

 这个表里面的0-80对应着向量表里面外部中断的位置0-59,每一位都有8位位宽,真正起作用的只有4位。

函数:

NVIC_SetPriority (IRQn_Type IRQn, uint32_t priority)

// core_cm3.h 1586行

两个形参:中断号优先级。中断号对应手册向量表的位置编号。

配置的时候先判断中断号是否大于0,小于0是内核的中断;大于0是外部中断。如果是外部中断,让优先级左移4位。如果是小于0,就配置另一个寄存器,SCB->SHP。

(2)中断编程的顺序:

1-使能中断请求

2-配置中断优先级分组

3-配置NVIC寄存器,初始化NVIC_InitTypeDef;

4-编写中断服务函数

1.使能中断请求:

这个与具体外设相关。以串口为例,发送数据完成之后,产生一个中断。我们去具体寄存器寻找,在控制寄存器 1(USART_CR1)里面有一位如下图,将这一位置即可。

2.中断优先级分组:

内核和外设的寄存器的优先级哪个更高取决于优先级分组,这个则是由寄存器SCB->AIRCR:PRIGROUP[10:8] 来配置的。

函数:

NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)  

 // misc.c  96行

优先级分组1:一个位表示主优先级,剩下三个位表示子优先级。

判断优先级:分组>主优先级>子优先级.如果都相同,则看硬件中断编号(中断向量表)。

3.配置NVIC寄存器,初始化NVIC_InitTypeDef;

初始化的成员在 //misc.h  50行

typedef struct
{
  uint8_t NVIC_IRQChannel;                    //指定中断源          

  uint8_t NVIC_IRQChannelPreemptionPriority;  //设置抢占优先级(主优先级),
                                              //中断优先级分组不同,抢占优先级的位数不同。
                                              //如果分组为1,主优先级位数为1,
                                              //那么主优先级只能为0或1

  uint8_t NVIC_IRQChannelSubPriority;         //设置子优先级如果前面分组为1,主优先级为1,
                                              //子优先级就为3,2的3次方为8
                                              //(即0-78个数随便写),让他等于0即可。

  FunctionalState NVIC_IRQChannelCmd;         //使能或者失能
   
} NVIC_InitTypeDef;

注意:

无论是抢占优先级(主优先级)还是响应优先级(子优先级),优先级数值越小,就代表优先级越高。

优先级较高的中断可以打断优先级较低的中断。

抢占优先级相同且响应优先级相同的中断,假如同时发生,会按照硬件内部固定的优先级执行。

中断优先级的分组对内核和外设同样适用。当比较的时候,只需要把内核外设的中断优先级的四个位按照外设的中断优先级来分组来解析即可,即人为的分出抢占优先级和子优先级。

4.编写中断服务函数

中断服务函数名一定要与中断向量表里面的名称一样。工程很大的话,就把所有的中断放在一个文件下,一般把中断服务函数放在stm32f10x_it.c中。

二、EXTI—外部中断/事件控制器

(1)简介

EXTI管理了控制器的20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

外部:芯片里的GPIO。可以对外输出0或1,输入的时候也可以检测输入的是0还是1.当出现0和1之间变化的时候,就会产生一个中断,也可以产生一个事件。

(2)EXTI结构图

红色是中断,绿色是事件。

 输入线:EXTI 0-15是连接到GPIO的(每一个GPIO端口都有16个引脚),当我们使用EXTI0的时候,控制的是所有端口的第0个引脚。具体是哪个端口,在AFIO_EXTICR1、2、3、4这4个寄存器的EXTIx[3:0]位控制。(x属于0-15)

边沿检测电路:检测上升沿还是下降沿,由上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)控制。

或门:收到边沿检测电路传出的信号和软件中断事件寄存器(EXTI_SWIER)控制。软件中断事件寄存器返回1之后,就不受边沿检测电路控制。

在经过或门之后,分为两路:当中断屏蔽寄存器和请求挂起寄存器相关位都置1的时候就会产生中断,交给NVIC,再交给内核相应。如果事件屏蔽寄存器相关位置1,就会把这个1信号给脉冲发生器,产生脉冲(脉冲就是高电平)。脉冲:ITM定时器开始计数、触发ADC的采集。【作为触发信号】

(3)初始化结构体成员

EXTI_InitTypeDef

1-EXTI_Line:用于产生中断/事件线(框图里的输入线)

2-EXTI_Mode:EXTI模式(中断/事件)(中断屏蔽寄存器/事件屏蔽寄存器)

3-EXTI_Trigger:触发(上升沿/下降沿/上下)

4-EXTI_LineCmd:使能或者失能(IMR/EMR)

(4)程序设计:

通过两个按键控制,PA0上升沿(按下)触发,PC13下降沿(弹开)触发。产生一次中断,LED反转一次。

思路设计:

先配置外设(按键等)用到的外部中断(EXTI)

  功能:初始化外设(按键等)要连接到 EXTI 的 GPIO。

        配置 EXTI 结构体,初始化 EXTI,产生中断信号。

再配置NVIC中断控制器

  功能:配置中断优先级分组,再初始化 NVIC 结构体,然后初始化 NVIC 去处理中断。

1.初始化要连接到EXTI的GPIO。

1.观察外设(GPIO)端口结构体的成员:端口、速度、输出/入方式,我们把常用到的端口、宏定义(与硬件相关的)用我们熟悉的/好理解的名字在bsp_led.h文件里面重新define宏定义一下。一般情况下,GPIO端口的重新宏定义包括APB2时钟、具体哪个GPIOX(ABCD)端口、GPIOX的管脚pin。

2.在bsp_led.c文件里面把GPIO初始化好,详细步骤参见上面初始化I/O口的步骤:打开GPIO的时钟;配置外设初始化结构体;调用外设初始化函数,把配置好的结构体成员写到寄存器里面。

	GPIO_InitTypeDef GPIO_InitStruct;//外设的初始化结构体变量
	EXTI_InitTypeDef EXTI_InitStruct;//外设的初始化结构体变量
 	NVIC_Config();
    /*第一步:初始化要连接到 EXTI 的 GPIO*/
	/*1:打开外设的时钟(RCC寄存器控制)*/
	RCC_APB2PeriphClockCmd(KEY1_EXTI_GPIO_CLK |KEY2_EXTI_GPIO_CLK,ENABLE);
	
	/*2:配置外设初始化结构体*/
	GPIO_InitStruct.GPIO_Pin = KEY1_EXTI_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin = KEY2_EXTI_GPIO_PIN;
	/*3:调用外设(GPIO)初始化函数,把配置好的结构体成员写到寄存器里面*/
	GPIO_Init(KEY1_EXTI_GPIO_PORT,&GPIO_InitStruct);//初始化端口
	GPIO_Init(KEY2_EXTI_GPIO_PORT,&GPIO_InitStruct);//初始化端口

2.初始化EXTI用于产生中断/事件

   和第一步一样,先观察该外设(EXTI)的初始化结构体成员:

typedef struct
{
  uint32_t EXTI_Line;               //哪一条输入线(总共20条)   

  EXTIMode_TypeDef EXTI_Mode;       //这条线的模式(中断/事件)

  EXTITrigger_TypeDef EXTI_Trigger; //触发选择(上升/下降/同时)

  FunctionalState EXTI_LineCmd;     //使能

}EXTI_InitTypeDef;

把需要宏定义的变量定义好:

#define KEY1_EXTI_GPIO_PORTSOURCE  GPIO_PortSourceGPIOA//中断输入线属于哪个端口
#define KEY2_EXTI_GPIO_PORTSOURCE  GPIO_PortSourceGPIOC

#define KEY1_EXTI_GPIO_PINSOURCE   GPIO_PinSource0//中断输入线属于哪个引脚
#define KEY2_EXTI_GPIO_PINSOURCE   GPIO_PinSource13

#define KEY1_EXTI_LINE             EXTI_Line0//选择哪条输入线
#define KEY2_EXTI_LINE             EXTI_Line13

根据前面讲解的功能框图,打开AFIO的时钟;确定中断输入线用到哪个端口、哪个引脚(函数作用为选择用作EXTI线的GPIO引脚);配置初始化结构体;调用 EXTI 初始化函数,把配置好的结构体成员写到寄存器里面。至此中断信号已经产生。

到这就可以发现,这些配置寄存器的方法都大体相同。

    /*第二步:初始化EXTI外设*/	
	/*1:打开外设的时钟(RCC寄存器控制)*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	/*2.确定中断输入线用到哪个端口、哪个引脚*/
	GPIO_EXTILineConfig(KEY1_EXTI_GPIO_PORTSOURCE, KEY1_EXTI_GPIO_PINSOURCE);
	/*3.配置初始化结构体*/
	EXTI_InitStruct.EXTI_Line = KEY1_EXTI_LINE;//选择哪条输入线
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//这条线的模式(中断/事件)
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//触发选择(上升/下降/同时)
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能
	/*4.调用 EXTI 初始化函数,把配置好的结构体成员写到寄存器里面*/
	EXTI_Init(&EXTI_InitStruct);
	
	/*2.确定中断输入线用到哪个端口、哪个引脚*/
	GPIO_EXTILineConfig(KEY2_EXTI_GPIO_PORTSOURCE, KEY2_EXTI_GPIO_PINSOURCE);
	/*3.配置初始化结构体*/
	EXTI_InitStruct.EXTI_Line = KEY2_EXTI_LINE;//选择哪条输入线
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//这条线的模式(中断/事件)
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//触发选择(上升/下降/同时)
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能
	/*4.调用 EXTI 初始化函数,把配置好的结构体成员写到寄存器里面*/
	EXTI_Init(&EXTI_InitStruct);
	//至此,中断信号已经产生	

3.初始化NVIC,用于处理中断

   先配置中断优先级分组,再初始化NVIC的初始化结构体,然后调用初始化NVIC外设函数,把配置好的结构体成员写到寄存器里面。

static void NVIC_Config(void)//配置NVIC中断控制器  静态的函数,表示只能在这个文件中使用
{
	NVIC_InitTypeDef NVIC_InitTStruct;//初始化结构体的变量
	/*第一步:配置中断优先级分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	/*第二步:初始化 NVIC 的初始化结构体*/
	NVIC_InitTStruct.NVIC_IRQChannel = KEY1_EXTI_IRQN;
	NVIC_InitTStruct.NVIC_IRQChannelPreemptionPriority = 1;//前面配置的中断优先级分组为1,主优先级只有一个位来表示
	NVIC_InitTStruct.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitTStruct.NVIC_IRQChannelCmd = ENABLE;
	/*第三步:调用初始化NVIC外设函数,把配置好的结构体成员写到寄存器里面*/
	NVIC_Init(&NVIC_InitTStruct);
	
	/*第二步:初始化 NVIC 的初始化结构体*/
	NVIC_InitTStruct.NVIC_IRQChannel = KEY2_EXTI_IRQN;
	NVIC_InitTStruct.NVIC_IRQChannelPreemptionPriority = 1;//前面配置的中断优先级分组为1,主优先级只有一个位来表示
	NVIC_InitTStruct.NVIC_IRQChannelSubPriority = 1;//这样key1的中断优先级就大于key2的
	NVIC_InitTStruct.NVIC_IRQChannelCmd = ENABLE;
	/*第三步:调用初始化NVIC外设函数,把配置好的结构体成员写到寄存器里面*/
	NVIC_Init(&NVIC_InitTStruct);
}

4.编写中断服务函数

  首先,有一个检测是否产生中断的函数,如果产生了中断,就……

void  KEY1_EXTI_IRQHandler(void)
{
	if(EXTI_GetITStatus(KEY1_EXTI_LINE) != RESET )//如果产生了中断
	{
		LED1_TOGGLE;//LED1 亮灭反转
	}
	EXTI_ClearITPendingBit(KEY1_EXTI_LINE);//清除相关的中断标志位
} 

void  KEY2_EXTI_IRQHandler(void)
{
	if(EXTI_GetITStatus(KEY2_EXTI_LINE) != RESET )//如果产生了中断
	{
		LED2_TOGGLE;//LED1 亮灭反转
	}
	EXTI_ClearITPendingBit(KEY2_EXTI_LINE);//清除相关的中断标志位
} 

5.main函数

等待外部中断的到来,然后去中断服务函数里面执行程序。

int main(void)
{
	/*在程序来到main函数这里的时候,系统时钟已经配置成72M*/
	
	LED_GPIO_Config();//初始化函数
	
	/*等待外部中断的到来,然后去中断服务函数里面执行程序*/
	EXTI_KEY_Config();
	while(1)
	{
		
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32的中断介绍 的相关文章

  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 如何获取结构体中任意成员的位位置

    如何获取结构体中任意成员的位位置 在示例中 gt typedef struct BitExamStruct unsigned int v1 3 unsigned int v2 4 unsigned int v3 5 unsigned int
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • A64 Neon SIMD - 256 位比较

    我想将两个小端 256 位值与 A64 Neon 指令 asm 进行有效比较 平等 为了平等 我已经有了解决方案 bool eq256 const UInt256 lhs const UInt256 rhs bool result 首先 将
  • 错误:-march= 开关的值错误

    我写了一个Makefile 但无法让它工作 我有一个选项应该选择编译到哪个处理器 然而 当我跑步时make从命令行它说 tandex tandex P 6860FX emulators nintendo sdks 3DS SDK HomeB
  • 尝试了解 ARM 二进制映像中的加载内存地址 (LMA) 和二进制文件偏移量

    我在一家ARM 皮质 M4 STM32F4xxxx 我试图了解二进制文件 elf and bin 在内存中构建并闪存 特别是关于内存位置 具体来说 我不明白的是LMA从实际的二进制文件偏移量进行 翻译 让我用一个例子来解释一下 我有一个 e
  • 更新 MMU 转换表的正确方法是什么

    我在我的 s3c2440 板上启用了 MMU 3G 4G 内存 故障属性 当我没有读 写 3G 4G 内存时一切都很好 所以为了测试页面错误向量 我写入了 0xFF 3G地址 正如我所料 我从FSR中得到了正确的值 所以我在 do page

随机推荐

  • Vue 打包优化之 生产环境删除 console 日志

    使用 vue cli 3 0 vue cli 脚手架构建的项目 一般在本地开发过程中 会有不少 console 调试信息 如果不处理这些日志信息 默认情况下 即使是构建生产环境的包 这些 console 打印也不会被移除 这显然是不够严谨的
  • 蓝桥杯-时间模拟

    蓝桥杯 时间模拟 引言 时间模拟 是蓝桥杯最常见的题型 我愿意把他称作小白和入门画的界限 接下来就让我来带大家入门把 一 模板 include
  • 操作系统学习提升篇——进程同步

    进程的线程共享进程资源 进程共享计算机资源 因此进程和线程一样都需要信息同步 共享内存 在某种程度上 多进程是共同使用物理内存的 由于操作系统的进程管理 进程间的内存空间是独立的 进程默认是不能访问进程空间之外的内存空间的 一个进程不能访问
  • 在java项目中如何使用Lucene搜索引擎(入门篇)

    什么是lucene 就是一个简单的工具包 java语言特有的 做全文检索用的 为什么不用数据库的模糊查询 两者都什么区别 1 模糊查询只适用于结构化数据 如数据库中存储的数据 非结构化数据就是文档 图片 音频等等 2 模糊查询速度慢 3 不
  • tcp/udp socket 网络通信中超时时间的设置

    1 connect函数的超时时间设置只对TCP有效 UDP由于是无连接的connect都会返回success 有两种方法 第一种方法 默认的socket是阻塞模式 我们只需要设置其为非阻塞模式 然后调用select去查询其状态 代码如下 s
  • 【实时更新】LaTeX公式编辑(希腊字母/分数/上下标/加粗/关系符/点乘/无穷大)

    一 基本用法 1 行内公式加 2 行间公式加 二 常用代码 1 常用小写希腊字母 希腊字母 代码 alpha alpha
  • vscode 终端集成bash

    windows 版本的 vs code 终端默认是没有集成bash的 虽然也能在vscode 终端可以提交git 但是没有高亮 没有提示 很不方便 这时候就需要我们将bash集成到vs code的终端 就可以愉快的使用git的分支高亮 提示
  • 为什么需要脉冲成形

    数字信号在传输的过程中难免会受到干扰 从而出现了波形失真 为了解决电报传输问题 提出了数字波形在无噪声线性信道传输时的无失真条件 称为奈奎斯特准则 其中奈奎斯特第一准则便是抽样点无失真准则 是关于接收机不产生码间串扰的问题 对于基带传输系统
  • win7官方原版iso镜像_教你从微软官网下载 Windows 10 原版 ISO 镜像

    到微软官网只能下载到Windows升级助手 或者Media Creation Tool 但这个工具制作U盘启动真是有点慢 不如直接下载Windows 10 的ISO镜像 再制作U盘工具 而且可以收藏 从第三方的渠道的确可以下载到Win10的
  • Subquery and Wrapping query

    Subquery Progressive query Into Wrapping query 1 Using fluent syntax string names Tom Dick Harry Mary Jay IEnumerable
  • odoo15 owl 组件实验

    视图有两种形式 一种是利用odoo MVC框架的QWeb模板引擎进行渲染 另一种是独立于odoo的模板引擎 利用前端框架搭建视图与用户交互 并调用odoo的控制器与odoo交互 odoo15提供了一套全新的前端框架owl 最主要的是owl的
  • 利用 AES 对 log4j 日志文件加密

    总览 本文简要介绍了 AES 算法加密的方式 以及如何利用 AES 对 log4j 输出的日志进行加密 背景 在互联网时代下 JAVA 大多用来做后端开发 由于后端的程序大多都部署在自己的服务器上 客户接触不到程序的日志文件 因此 多数情况
  • nacos无法正常下线问题记录

    问题描述 公司搭建了nacos集群 但是在微服务下线时会无法正常下线 点击下线提示 caused errCode 500 errMsg do metadata operation failed caused com alibaba naco
  • 基于vue2和element-ui的项目框架模板加强版

    前言 我的上篇博客讲了如何基于vue2和element ui搭建一个基础的项目框架模板 有兴趣的可以看下 文章有点长 这篇博客就谈谈可以在基础框架模板上增添哪些功能 ie兼容 ie兼容之前是让我很头痛的一件事 但经过我的反复摸索 百度 哈哈
  • Unity新手基础知识系列—序

    前提提要 本系列主要内容是根据 Unity中文文档来总结的 其实本人也是现在正在学习Unity相关基础 可能有一些理解不到位或者理解错误的地方 望大家指正 为什么写这个系列 1 为了记录自己学习的内容 方便以后自己再查阅 2 巩固知识体系
  • 力扣:只出现一次的数字

    给定一个非空整数数组 除了某个元素只出现一次以外 其余每个元素均出现两次 找出那个只出现了一次的元素 class Solution public int singleNumber int nums int result 0 for int
  • c语言字符串替换函数StrReplace(char strRes[],char from[], char to[])可直接使用

    将如下函数添加到文件中 可直接调用 StrReplace char strRes char from char to strRes 原始字符串 rom 需要替换的字符 串只替换第一次出现的位置 to 需要替换成什么字符串 成功返回 1 失败
  • 【牛客·剑指offer】Python JZ4二维数组查找、JZ3 数组中的重复数字、JZ5 替换空格、JZ6 从尾到头打印链表

    一 JZ4二维数组查找 描述 在一个二维数组array中 每个一维数组的长度相同 每一行都按照从左到右递增的顺序排序 每一列都按照从上到下递增的顺序排序 请完成一个函数 输入这样的一个二维数组和一个整数 判断数组中是否含有该整数 1 2 8
  • 【Unity】模仿GUILayout.SelectionGird绘制一组互斥的按钮

  • STM32的中断介绍

    目录 一 STM32中断应用概览 1 简介 2 中断编程的顺序 1 使能中断请求 2 中断优先级分组 3 配置NVIC寄存器 初始化NVIC InitTypeDef 4 编写中断服务函数 二 EXTI 外部中断 事件控制器 1 简介 2 E