历史上的今天
返回首页

历史上的今天

今天是:2024年12月23日(星期一)

正在发生

2021年12月23日 | STM32 外部中断/事件控制器EXTI

2021-12-23 来源:eefocus

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


如下图所示,为EXTI的功能框图。EXTI有两个功能,一个是产生中断,一个是产生事件,下面我们将对这两个功能进行讲解。

1.中断产生

如上图所示,红色虚线指示的是一个产生中断的线路,最终流入到NVIC中断控制器内。


编号1是输入线,可以指定到任意的GPIO,也可以是一些外设事件,输入线一般是存在电平变化的信号。


编号2是边缘检测电路,用来检测输入线的信号是否存在指定的电平变化,如上升沿、下降沿或任意两者都可,由EXTI_RTSR 和 EXTI_FTSR两个寄存器设置检测哪些电平变化过程。


编号3是一个或门,输入信号来自边沿检测电路,另外一个信号来自软件中断事件寄存器(EXTI_SWIER)。我们可以从软件或硬件产生中断/事件。


编号4是一个与门,编号3电路产生信号且中断屏蔽寄存器(EXTI_IMR)开启后,出书信号到NVIC中


2.事件产生

编号7是脉冲发生器电路,线路6产生信号1时本线路产生一个脉冲信号,该脉冲信号可以给其他外设电路使用,比如定时器TIM、ADC等等。


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


中断事件线

EXTI有20个中断/事件线,每个GPIO都可以被设置成输入线

image.png?imageView2/2/w/550

image.png?imageView2/2/w/550

EXTI初始化

HAL库函数的EXTI初始化非常简单,配置好IO口的模式,然后配置中断源、中断优先级、使能中断


1) HAL_NVIC_SetPriority:该函数负责 EXTI 中断/事件线选择,可选 EXTI0 至 EXTI25,配置优先级。


2) HAL_NVIC_EnableIRQ:该函数负责控制使能中断。


编程要点


1) 初始化用来产生中断的 GPIO;


#define KEY1_INT_GPIO_PORT                GPIOA

#define KEY1_INT_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE();

#define KEY1_INT_GPIO_PIN                 GPIO_PIN_0

#define KEY1_INT_EXTI_IRQ                 EXTI0_IRQn

#define KEY1_IRQHandler                   EXTI0_IRQHandler


2) 初始化 EXTI,配置 NVIC;


 /**

  * @brief  配置 PA0 为线中断口,并设置中断优先级

  * @param  无

  * @retval 无

  */

void EXTI_Key_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure; 

 

    /*开启按键GPIO口的时钟*/

    KEY1_INT_GPIO_CLK_ENABLE();

    KEY2_INT_GPIO_CLK_ENABLE();

 

    /* 选择按键1的引脚 */ 

    GPIO_InitStructure.Pin = KEY1_INT_GPIO_PIN;

    /* 设置引脚为输入模式 */ 

    GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;    

    /* 设置引脚不上拉也不下拉 */

    GPIO_InitStructure.Pull = GPIO_NOPULL;

    /* 使用上面的结构体初始化按键 */

    HAL_GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure); 

 

    /* 配置 EXTI 中断源 到key1 引脚、配置中断优先级*/

    HAL_NVIC_SetPriority(KEY1_INT_EXTI_IRQ, 0, 0);

    /* 使能中断 */

    HAL_NVIC_EnableIRQ(KEY1_INT_EXTI_IRQ);

}


3) 编写中断服务函数;


void KEY1_IRQHandler(void)

{

  //确保是否产生了EXTI Line中断

if(__HAL_GPIO_EXTI_GET_IT(KEY1_INT_GPIO_PIN) != RESET) 

{

// LED1 取反

LED1_TOGGLE;

    //清除中断标志位

__HAL_GPIO_EXTI_CLEAR_IT(KEY1_INT_GPIO_PIN);     

}  

}


推荐阅读

史海拾趣

芯朋微电子(chipown)公司的发展小趣事

随着技术的不断进步和市场需求的增长,芯朋微电子逐步将产品线拓展至标准电源和工业驱动领域。2013年,公司推出工控功率芯片产品,这些芯片广泛应用于电机、基站、智能电表等行业领域,进一步扩大了公司的市场份额。

Goldentech Discrete Semiconductor Inc公司的发展小趣事

进入21世纪后,随着全球电子市场的竞争加剧,Goldentech意识到单靠技术创新已不足以维持其市场地位。因此,公司开始积极寻求与行业领先企业的战略合作。通过与一家知名芯片设计公司的深度合作,Goldentech成功将其高性能离散半导体器件集成到对方的芯片设计中,从而实现了产品的广泛应用。这一合作不仅扩大了Goldentech的市场份额,还提升了其品牌知名度和行业影响力。

Corex Intervest Inc公司的发展小趣事

Corex Intervest Inc公司在电子行业的发展历程中,始终保持着稳健的步伐和进取的精神。公司不断适应市场变化和技术更新,不断调整战略方向和发展重点。在未来,公司将继续加大研发投入,拓展新的应用领域和市场空间,为电子行业的发展贡献更多的力量。

这五个故事展示了Corex Intervest Inc公司在电子行业中的发展历程和取得的成就。从创立初期的艰难起步到技术创新、市场拓展、战略合作和持续发展的不断推进,Corex Intervest Inc公司始终保持着积极进取的精神和不断创新的态度,在电子行业中取得了显著的成绩。

EMI Filter Company公司的发展小趣事

TDK公司,作为全球知名的电子元器件制造商,早在上世纪80年代就开始涉足EMI滤波器领域。当时,随着电子设备的日益普及,电磁干扰问题逐渐凸显。TDK看准市场需求,投入大量资源进行EMI滤波器的研发。初期,他们面临着技术难题和市场接受度的挑战。然而,通过不断的技术创新和产品迭代,TDK的EMI滤波器逐渐在市场上站稳了脚跟。他们的产品在计算机、通信设备等领域得到了广泛应用,有效解决了电磁干扰问题,提升了设备的稳定性和可靠性。

Eby Electro Inc公司的发展小趣事

Eby Electro Inc公司的创始人李明,是一位对电子技术充满热情的工程师。在20世纪90年代初,他看到了电子行业的巨大潜力和未来发展趋势,于是决定创立自己的公司。起初,公司只有几名员工,主要业务是设计和制造电子零部件。李明凭借其过硬的技术能力和对市场的敏锐洞察,带领公司逐步打开了市场。他坚持质量第一的原则,赢得了客户的信任。随着业务的拓展,Eby Electro Inc逐渐在电子行业中崭露头角。

ZTE高新兴(Gosuncn)公司的发展小趣事

Eby Electro Inc公司的创始人李明,是一位对电子技术充满热情的工程师。在20世纪90年代初,他看到了电子行业的巨大潜力和未来发展趋势,于是决定创立自己的公司。起初,公司只有几名员工,主要业务是设计和制造电子零部件。李明凭借其过硬的技术能力和对市场的敏锐洞察,带领公司逐步打开了市场。他坚持质量第一的原则,赢得了客户的信任。随着业务的拓展,Eby Electro Inc逐渐在电子行业中崭露头角。

问答坊 | AI 解惑

王越院士畅谈2009年NEC电子杯出题理念

本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 在5月22日新闻发布会上,王越院士表示“今年我们开始强调两个方面的应用。第一个就是做出来的产品的性能价格比应该是比较好的。不能为完成一个比较简单的任务,用一个非常复杂,非常昂贵的小系统合和 ...…

查看全部问答>

求助椭圆滤波器

最近在看DDS,好多资料都采用的是椭圆滤波器,我也想做一个来试试,貌似椭圆滤波器的要求很高,请问做过的大虾们我应该怎样做一个性能好的滤波器呢?采用别的简单的滤波器可以实现么?…

查看全部问答>

如何判断仪表返回的数据有多少位?

通过串口发送指令,不知道返回的数据有多少位?难道末位有特殊的结束符吗?…

查看全部问答>

请教 编写uart在2410板上运行出现的错误

下面是原程序: #include #include #include #include #include #include #include #define UART_ULCON1     (*(volatile unsigned *)0x50004000) //UART 1 Line control #define UART_UCON1  &nb ...…

查看全部问答>

如何判断串口数据发送完毕

平台:s3c2440 + wince5.0 在串口驱动文件pdds3c2440_ser.cpp中 void    CPdd2440Uart::XmitInterruptHandler(PUCHAR pTxBuffer, ULONG *pBuffLen) {     ......     for (DWORD dwByteWrite=0; dwByteWriteWrite ...…

查看全部问答>

送分!

坐沙发者即送分!…

查看全部问答>

LPC1100大家族

LPC1100家族不断庞大,期待未来更多的型号。 …

查看全部问答>

开关电源适配器12V 2A是个什么意思?

我的理解是,电源输出电压恒定为12V,输出电流视负载大小而定,从0到2A,不知道有没有问题? 如果是这样理解,那么能带的最大负载是12V/2A=6Ω,小于6Ω的负载是否会产生过流保护?如果没有过流保护电路,是否烧电源? 开关电源的过压保 ...…

查看全部问答>

求救:字附型驱动write函数传入的char×型数据有问题

//驱动中write函数 对物理地址WR_ADDR写 0x1234abcd ssize_t regs_op_write( struct file *filp, char *buf,                 size_t count, loff_t *f_pos) {         char *tmp; ...…

查看全部问答>

怎样消除接触电阻的影响

谁能告诉我如果使用低值精密电阻采样,怎么才能消除接触电阻的影响?感谢!…

查看全部问答>