一、前言

在之前针对STM32的GPIO相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读信号引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取检测操作,除了轮询的方式访问输入引脚,还可以通过另外一种叫做外部中断的方式来对引脚的输入信号进行检测,本篇首先介绍下EXTI的结构,接着介绍外部中断的相关概念,对STM32的IO外部中断EXTI有个初步的了解,在此基础上重点围绕IO外部中断EXTI的使用展开分析。

图1 外部中断设计


二、EXTI结构

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

在图2可以看到很多在信号线上打一个斜杠并标注“20”字样,这个表示在控制器内部类似的信号线路有 20 个,这与 EXTI 总共有 20 个中断/事件线是吻合的。所以我们只要明白其中一个的原理,那其他 19 个线路原理也就知道了。

图2 EXTI结构

EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不同。

中断和事件的区别:

事件:某一信号出现,比如上升沿或者下降沿。不一定触发中断。

中断:某一的事件发生,并产生中断,然后跳到相应的中断服务函数中进行相应的处理。

首先我们来看图中红色虚线指示的电路流程。它是一个产生中断的线路,最终信号流入到 NVIC 控制器内。

编号 1 是输入线,EXTI 控制器有 19 个中断/事件输入线,这些输入线可以通过寄存器设置为任意一个 GPIO,也可以是一些外设的事件,这部分内容我们将在后面专门讲解。输入线一般是存在电平变化的信号。

编号 2 是一个边沿检测电路,它会根据上升沿触发选择寄存(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)对应位的设置来控制信号触发。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号 1 给编号 3 电路,否则输出无效信号0。而 EXTI_RTSR 和 EXTI_FTSR 两个寄存器可以控制器需要检测哪些类型的电平跳变过程,可以是只有上升沿触发、只有下降沿触发或者上升沿和下降沿都触发。

编号 3 电路实际就是一个或门电路,它一个输入来自编号 2 电路,另外一个输入来自软件中断事件寄存器(EXTI_SWIER)。EXTI_SWIER允许我们通过程序控制就可以启动中断/事件线,这在某些地方非常有用。我们知道或门的作用就是有 1 就为 1,所以这两个输入随便一个有有效信号 1就可以输出 1 给编号 4和编号 6电路。

编号 4 电路是一个与门电路,它一个输入是编号 3 电路,另外一个输入来自中断屏蔽寄存器(EXTI_IMR)。与门电路要求输入都为 1 才输出 1,导致的结果是如果EXTI_IMR 设置为 0 时,那不管编号 3 电路的输出信号是 1 还是 0,最终编号 4 电路输出的信号都为 0;如果EXTI_IMR设置为1时,最终编号4电路输出的信号才由编号3电路的输出信号决定,这样我们可以简单的控制 EXTI_IMR 来实现是否产生中断的目的。编号 4 电路输出的信号会被保存到挂起寄存器(EXTI_PR)内,如果确定编号 4 电路输出为 1 就会把 EXTI_PR 对应位置1。

编号 5 是将 EXTI_PR 寄存器内容输出到 NVIC 内,从而实现系统中断事件控制。

接下来我们来看看绿色虚线指示的电路流程。它是一个产生事件的线路,最终输出一个脉冲信号。产生事件线路是在编号3电路之后与中断线路有所不同,之前电路都是共用的。

编号6电路是一个与门,它一个输入来自编号 3 电路,另外一个输入来自事件屏蔽寄存器(EXTI_EMR)。如果 EXTI_EMR设置为 0时,那不管编号 3电路的输出信号是 1还是 0,最终编号 6 电路输出的信号都为 0;如果EXTI_EMR 设置为 1 时,最终编号 6 电路输出的信号才由编号 3 电路的输出信号决定,这样我们可以简单的控制 EXTI_EMR 来实现是否产生事件的目的。

编号 7 是一个脉冲发生器电路,当它的输入端,即编号 6 电路的输出端,是一个有效信号 1 时就会产生一个脉冲;如果输入端是无效信号就不会输出脉冲。

编号 8 是一个脉冲信号,就是产生事件的线路最终的产物,这个脉冲信号可以给其他外设电路使用,比如定时器 TIM、模拟数字转换器 ADC等等,这样的脉冲信号一般用来触发 TIM 或者 ADC开始转换。

产生中断线路目的是把输入信号输入到 NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。

另外,EXTI是在 APB2总线上的,在编程时候需要注意到这点。


三、IO外部中断概念

外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。

图3 外部中断概念内容

1、外部中断映射

外部中断/事件控制器EXTI包含多达 23 个用于产生事件/中断请求的边沿检测器。每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发)。每根输入线还可单独屏蔽。

以STM32F407为例,支持多达 23 个软件事件/中断请求,这些事件/中断请求通过EXTI线输入到EXTI控制器中去,其中各EXTI线连接如下:

EXTI_Line0~15:连接外部 GPIO 口的输入中断。

EXTI_Line16:连接到 PVD 输出

EXTI_Line17:连接到 RTC 闹钟事件

EXTI_Line18:连接到 USB OTG FS 唤醒事件

EXTI_Line19:连接到以太网唤醒事件

EXTI_Line20:连接到 USB OTG HS(在 FS 中配置)唤醒事件

EXTI_Line21:连接到 RTC 入侵和时间戳事件

EXTI_Line22:连接到 RTC 唤醒事件

我们在这里重点讨论的是GPIO口的输入中断,因此EXTI_Line16~EXTI_Line22不是本文讨论的重点。STM32的每个GPIO引脚都可以作为外部中断输入,STM32的GPIO口引脚多达几十个甚至上百个,因此既然每个GPIO引脚都可以作为外部中断输入,而EXTI_Line0~15只有16个,因此IO引脚和外部中断线的对应关系如下:

图4 外部中断/事件 GPIO 映射

从图4中可以看出,由于STM32每个GPIO端口都有16个pin引脚,因此EXTI_Line0~15对应的是引脚pin0~pin15。例如EXTI_Line0对应GPIOA0~GPIOI0,因此类推EXTI_Line1对应GPIOA1~GPIOI1,因此每个EXTI_Line可以对应最多9个pin引脚,具体映射到那个pin引脚上,需要进行相应的配置。

2、外部中断寄存器

(1)、中断屏蔽寄存器EXTI_IMR

图5为断屏蔽寄存器定义,本寄存器用于打开和关闭外部中断的请求,0~22位有效,对应之前提到的23个外部中断请求,对应的位写0时,关闭外部中断请求;对应位写1时,打开外部中断请求。

图5 中断屏蔽寄存器定义

(2)、事件屏蔽寄存器EXTI_EMR

图6为事件屏蔽寄存器定义,本寄存器用于打开和关闭外部事件的请求,0~22位有效,对应之前提到的23个外部事件请求,对应的位写0时,关闭外部事件请求;对应位写1时,打开外部事件请求。事件只是一个触发信号,它作为中断的触发源,可以触发中断,也可以不触发中断,打开对应EXTI_IMR的中断屏蔽位,那么事件可以触发对应的中断。只有触发了中断后,程序才会跳转到对应的中断处理程序中去。

图6 事件屏蔽寄存器定义

(3)、上升沿触发选择寄存器EXTI_RTSR

图7为上升沿触发选择寄存器定义,本寄存器用于设置外部中断的触发事件是信号的上升沿,0~22位有效,对应之前提到的23个外部事件请求,对应的位写0时,关闭外部事件信号上升沿请求,不可以触发信号上升沿中断;对应位写1时,打开外部信号上升沿请求,可以触发信号上升沿中断。

图7 上升沿触发选择寄存器定义

(4)、下降沿触发选择寄存器EXTI_FTSR

图8为下降沿触发选择寄存器定义,本寄存器用于设置外部中断的触发事件是信号的下降沿,0~22位有效,对应之前提到的23个外部事件请求,对应的位写0时,关闭外部事件信号下降沿请求,不可以触发信号下降沿中断;对应位写1时,打开外部信号下降沿请求,可以触发信号下降沿中断。

图8 下降沿触发选择寄存器定义

(5)、软件中断事件寄存器EXTI_SWIER

图9为软件中断事件寄存器定义,本寄存器可以用软件程序的方式来触发事件中断的产生,用来模拟外部实际事件中断的产生,0~22位有效,对应之前提到的23个外部事件请求,对应位写1时,用于模拟外部事件的产生,对应位写0时,用于复位事件状态,下次可以再写1产生事件。因此,这个寄存器是用软件程序模拟外部实际事件的产生从而触发中断,当然前提是打开了IMR和EMR。

图9 软件中断事件寄存器定义

(6)、挂起寄存器EXTI_PR

图10为挂起寄存器寄存器定义,本寄存器可以标志是否产生了外部中断事件请求,同时可以通过向对应位写1来清除中断事件,0~22位有效,对应之前提到的23个外部事件请求,读到对应位为1时,表示发生了外部事件中断;读到对应位为1时,表示没有发生外部事件中断。因此一旦触发中断条件就对应位被置为1,不过要在中断服务函数里面向对应位写1清除中断,不然就导致会一直进入中断。

图10 挂起寄存器定义

3、外部中断API函数

本节所介绍的STM32的EXTI函数接口是STM32标准库的函数接口,在详细介绍各个API函数接口功能之前,我们需要对函数接口中使用到的关键的参数进行分析。

1 EXTI_InitTypeDef* EXTI_InitStruct

这个参数是EXTI函数端口需要初始化的功能参数的结构体指针,下面我们看看这个结构体的定义。

1 typedef struct
2 {
3 uint32_t EXTI_Line; //外部中断事件连接线
4 EXTIMode_TypeDef EXTI_Mode; //外部中断事件模式
5 EXTITrigger_TypeDef EXTI_Trigger; //边沿事件触发方式
6 FunctionalState EXTI_LineCmd; //外部中断事件连接线开关
7 }EXTI_InitTypeDef;

(a)、外部中断事件连接线:可选范围为EXTI_Line0~EXTI_Line15。

(b)、外部中断事件模式:用于选择发生EXTI的模式,可选的模式如下。

1 typedef enum
2 {
3 EXTI_Mode_Interrupt = 0x00, //中断模式
4 EXTI_Mode_Event = 0x04 //事件模式
5 }EXTIMode_TypeDef;

(c)、边沿事件触发方式:用于选择外部IO输入时信号边沿触发事件的方式。

1 typedef enum
2 {
3 EXTI_Trigger_Rising = 0x08, //信号上升沿触发
4 EXTI_Trigger_Falling = 0x0C, //信号下降沿触发
5 EXTI_Trigger_Rising_Falling = 0x10 //信号双边沿触发
6 }EXTITrigger_TypeDef;

(d)、外部中断事件连接线开关:用于打开和关闭外部中断事件连接线。

1 typedef enum
2 {
3 DISABLE = 0, //关闭外部中断事件连接线
4 ENABLE = !DISABLE //打开外部中断事件连接线
5 } FunctionalState;

下面就对具体的函数接口进行逐个的介绍。由于使用的是STM32的标准库,EXTI相关的函数及配置定义和可以调用的接口放置在官方提供的标准库文件 stm32fxx_exti.c和头文件 stm32fxx_exti.h 文件中。

(1)、void EXTI_DeInit(void);

作用:将EXTI的各个寄存器值恢复到复位值,各个寄存器复位值如下。

1 EXTI->IMR = 0x00000000;
2 EXTI->EMR = 0x00000000;
3 EXTI->RTSR = 0x00000000;
4 EXTI->FTSR = 0x00000000;
5 EXTI->PR = 0x007FFFFF;

(2)、void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

作用:对外部中断的中断线进行初始化操作。

举例:

1 EXTI_InitStructure.EXTI_Line = EXTI_Line2; //外部中断事件连接线为EXTI2
2 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式为外部中断模式
3 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //外部IO输入信号为下降沿触发
4 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打开外部中断事件连接线
5 EXTI_Init(&EXTI_InitStructure);

(3)、void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);

作用:获取EXTI的一个默认状态,可应用于某个外部中断事件上。该函数内部默认状态如下。

1 EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; //外部中断事件连接线为无
2 EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式为外部中断模式
3 EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling;//外部IO输入信号为下降沿触发
4 EXTI_InitStruct->EXTI_LineCmd = DISABLE;//关闭外部中断事件连接线

举例:EXTI_StructInit(&exti_InitStruct),使用exti_InitStruct快速获取到了外部中断事件默认状态值。

(4)、void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

作用:使用软件的方式模拟产生一个外部中断,前提是使能了EXTI_IMR和EXTI_EMR。

举例:EXTI_GenerateSWInterrupt(EXTI_Line2),通过软件方式在EXTI_Line2上产生了一个中断。

(5)、FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);

作用:检测外部事件标志位,判断外部事件是否产生。FlagStatus=RESET,事件未产生;FlagStatus=SET,事件产生。

举例:status = EXTI_GetFlagStatus(EXTI_Line2),检测EXTI_Line2上外部事件标志位。

(6)、void EXTI_ClearFlag(uint32_t EXTI_Line);

作用:清除外部事件标志位。

举例:EXTI_ClearFlag(EXTI_Line2),清除EXTI_Line2外部事件标志位。

(7)、ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

作用:检测外部中断标志位,判断外部中断是否产生。ITStatus =RESET,中断未产生;ITStatus=SET,中断产生。

举例:status = EXTI_GetITStatus(EXTI_Line2),检测EXTI_Line2上外部中断标志位。

(8)、void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

作用:清除外部中断标志位。

举例:EXTI_ClearITPendingBit(EXTI_Line2),清除EXTI_Line2外部中断标志位。


四、IO外部中断配置应用步骤

图11 IO外部中断配置使用内容

(1)、初始化相应的GPIO引脚

需要按照GPIO的普通IO输入进行引脚的初始化,同时使能对用GPIO的外设时钟。

1 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA的外设时钟
2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//设置使用引脚
3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通IO输入
4 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//根据实际应用配置输出速度
5 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//根据实际应用配置上拉或下拉电阻
6 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA1引脚

(2)、初始系统配置控制器SYSCFG

系统配置控制器SYSCFG可以用于管理GPIO外部中断线连接。需要开启SYSCFG 时钟,同时需要将外部中断事件线 EXTI_Line和GPIO的引脚pin进行关系映射。

1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能 SYSCFG 时钟
2 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);//PA1连接到中断线1

将中断线 1 与GPIOA 映射起来,那么此处很显然是 GPIOA的pin1与 EXTI_Line1中断线连接了。

(3)、初始化外部中断事件线

即调用EXTI_Init接口对中断线进行配置,设置好EXTI_Line的参数。

1 EXTI_InitStructure.EXTI_Line = EXTI_Line1; //外部中断事件连接线为EXTI1,根据实际情况设置
2 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式为外部中断模式
3 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //外部IO输入信号为下降沿触发根据实际情况设置
4 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打开外部中断事件连接线
5 EXTI_Init(&EXTI_InitStructure);

(4)、初始化NVIC

NVIC是嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。关于NVIC的知识,可以回顾明解STM32中断系统的内容进行详细的了解。

1 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能外部中断EXTI1,根据实际情况设置
2 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,根据实际情况设置
3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //响应优先级2,根据实际情况设置
4 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
5 NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化

(5)、中断服务函数编写

虽然EXTI的外部中断事件线有16个为EXTI_Line0~EXTI_Line15,但是STM32规定好的GPIO外部中断服务函数只有7个:

1 EXTI0_IRQHandler
2 EXTI1_IRQHandler
3 EXTI2_IRQHandler
4 EXTI3_IRQHandler
5 EXTI4_IRQHandler
6 EXTI9_5_IRQHandler
7 EXTI15_10_IRQHandler

  可以看出EXTI_Line0~EXTI_Line4每个中断线对应一个中断函数,中断线EXTI_Line5~EXTI_Line9共用中断函数 EXTI9_5_IRQHandler,EXTI_Line10~EXTI_Line15 共用中断函数 EXTI15_10_IRQHandler。

一个标准的GPIO外部中断服务函数模板如下:

1 void EXTI1_IRQHandle(void)
2 {
3 if(EXTI_GetITStatus(EXTI_Line1)!=RESET)//判断某个EXTI_Line上的中断是否发生
4 {
5 ................ //此处用户自行定义中断处理逻辑
6 EXTI_ClearITPendingBit(EXTI_Line3); //清除EXTI_Line上的中断标志位
7 }
8 }

需要注意的是:EXTI9_5_IRQHandler和EXTI15_10_IRQHandler这两个中断由于是多个中断线共用,因此中断服务函数中可以分别放置多个EXTI_Line的处理逻辑。


五、总结

本篇在GPIO基本API和配置使用流程基础之前,对EXTI的结构功能,普通IO输入使用成外部中断的方式进行了详细介绍。围绕外部中断概念和外部中断的配置使用分别进行了介绍分析,通过分析外部中断相关API和寄存器,了解外部中断和GPIO引脚的映射关系,功能特性等,从而能更好的应用外部中断的接口完成一系列外部中断的配置使用工作。


更多技术内容和书籍资料获取,入群技术交流敬请关注“明解嵌入式”

明解STM32—GPIO应用设计篇之IO外部中断EXTI原理及使用方法的更多相关文章

  1. 明解STM32—GPIO应用设计篇之API函数及配置使用技巧

    一.前言 本篇开始对STM32的GPIO在实际开发设计中的使用配置和技巧进行探讨,可以先去回顾下之前介绍的GPIO的相关理论基础知识包括基本结构,工作模式和寄存器原理. 了解过STM32的GPIO相关 ...

  2. 明解STM32—GPIO理论基础知识篇之基本结构

    ​ 一.前言 万物皆有源头,大家学习单片机的源头操作就是通过GPIO口点灯,GPIO作为STM32最基础的外设,也是大家最先接触的外设.当然,看似基础的GPIO,不仅仅是简单的设置好IO口,让灯亮起就 ...

  3. 明解STM32—GPIO理论基础知识篇之寄存器原理

    ​ 一.前言 在之前的STM32的GPIO理论基础知识中,分别对基本结构和工作模式进行了详细的介绍.GPIO基本结构中主要对GPIO内部的各个功能电路逐一的进行的分析:GPIO工作模式中主要介绍GPI ...

  4. 明解STM32—GPIO理论基础知识篇之八种工作模式

    一.引言 在之前围绕STM32的GPIO的基本结构进行了介绍,图1为STM32的5V容忍的GPIO口内部基本结构图,图2为GPIO的基本结构中各个模块部分的概述. 阅读GPIO基本结构的内容能够对GP ...

  5. 【STM32】NVIC嵌套中断向量控制器与外部中断

    两种优先级 抢占优先级PreemptPriority:中断服务函数正在执行时,抢占优先级高的可以打断抢占优先级低的,实现中断的嵌套,相当于51的"高优先级" 响应优先级(子优先级) ...

  6. STM32外部中断(EXTI)控制LED亮灭的代码

    led.c #include "led.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2P ...

  7. STM32 GPIO外部中断总结

    一.STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处.STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB ...

  8. 转别人的 STM32外部中断使用注意事项

    前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...

  9. STM32本学习笔记EXTI(外部中断)

    参考资料:STM32数据表.网络信息 =========================================切割线===================================== ...

  10. stm32 外部中断学习

    今天我们看看STM32的外部中断实验. STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一 ...

随机推荐

  1. C++/Qt网络通讯模块设计与实现(五)

    在C++/Qt网络通讯模块设计与实现(四)中具体分析了Qt的信号槽.线程相关的知识,即从 Qt::ConnectionType,示例源码,结果论证,归纳总结等四个方面进行了全方面讲解,深刻阐述了代码设 ...

  2. DevOps 在未来将如何演进?丨行业观察

    自2007年 DevOps 这一概念推出以来,越来越多企业开始将开发和运维团队结合在一起,以加快部署速度,提高软件开发生命周期的效率和协作.但是,诸多因素都会对 DevOps 是否成功产生影响,例如组 ...

  3. CSS in JS (JSS)

    JSS 是什么 简单来说,一句话概括CSS in JS (JSS),就是"行内样式"(inline style)和"行内脚本"(inline script). ...

  4. 超全 泛微 E9 Ecology 9开发资料大全 开源资源下载 泛微E9二次开发 泛微开发实战经验 泛微开发实战例子 泛微二次开发项目例子 泛微二次开发Demo 泛微二次开发完整例子 泛微二次开发入门

    由于工作需要,E9在泛微一推出来,以前所在的企业就第一时间上线了,经过四年多的运行,功能强大再加上在上面开发非常多的业务,一般的企业员工只需要打开泛微就可以处理完平时信息化的业务.后来又去外包公司专业 ...

  5. [J2EE:中间件]LOG4J及配置文件(log4j.properties)详解

    1 简介 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录.在apache网站:jakarta.apache.org/log4j 可以免费下 ...

  6. TS 导入导出那些事

    前言 最近用 TypeScript 写 npm 包,各种模块.命名空间.全局定义等等扰得我睡不着觉. 我便苦心研究,总结了几个比较冷门的,国内貌似基本上找不到资料的导入导出用法,顺便在其中又插入一些不 ...

  7. windows如何拉取一个文件夹下的所有文件名

    问题描述:遇到一个问题,是说一个文件夹下的文件太多了,如何去批量的拉去文件名呢,今天用CMD+DIR的方式拉取 1.文件目录也很深,就从文件导航栏进入CMD窗口 2.在当前目录中输入cmd,然后回车 ...

  8. 最好用的.NET敏捷开发框架-RDIFramework.NET V3.6版全新发布 100%源码授权

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...

  9. 使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

    在一些字典绑定中,往往为了方便展示详细数据,需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中,为了快速的处理数据的绑定操作,比较每次使 ...

  10. 大规模 Transformer 模型 8 比特矩阵乘简介 - 基于 Hugging Face Transformers、Accelerate 以及 bitsandbytes

    引言 语言模型一直在变大.截至撰写本文时,PaLM 有 5400 亿参数,OPT.GPT-3 和 BLOOM 有大约 1760 亿参数,而且我们仍在继续朝着更大的模型发展.下图总结了最近的一些语言模型 ...