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的中断介绍 的相关文章

  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • 使用 GCC 编译器为代码的特定部分保留寄存器

    是否可以为 C 代码的特定部分保留寄存器 ffixed reg 选项或声明全局寄存器变量不是我正在寻找的答案 我想保留特定范围 比如说特定函数 的寄存器值 使用局部寄存器变量是不可能的 因为它不能保证在整个范围内保留寄存器的值 我正在寻找类
  • 将结构体偏移属性赋予汇编器

    如何将 C 结构体的偏移量发送到汇编代码 例如 在我的 C 代码中 typedef struct unsigned int a unsigned int b CMyStruct 我向 ASM 函数发送一个 CMyStruct 结构的指针 假
  • ARM 汇编分支到寄存器或内存内部的地址

    我想知道在 ARM 汇编中我可以使用哪条指令分支到存储在某个内存地址中的地址或标签 例如 我们可以使用B LABEL来跳转到LABEL 但现在目的地只能在运行时知道 并且它存储在某个已知的内存位置 是否有类似 B 地址 的东西 Thanks
  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • RAM 存储二进制数和汇编语言的冒泡排序

    我必须使用 ARM v7 执行一个例程 在 RAM 内存中存储 10 个二进制数 然后使用冒泡排序对这些数字从高到低进行排序 我应该如何开始 func bubbleSortAscendingU32 ldr r3 r0 4 mov r1 9
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t

随机推荐

  • 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