历史上的今天
返回首页

历史上的今天

今天是:2024年10月20日(星期日)

正在发生

2021年10月20日 | stm32专题七:EXTI(二) 外部中断

2021-10-20 来源:eefocus

EXTI外部中断的配置过程:


开启GPIO时钟,初始化要连接的GPIO端口为浮空输入(参考手册);

开启AFIO时钟;

设置IO口与中断线的映射关系,调用函数GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

初始化EXTI,设置触发条件等;

初始化NVIC(注意,有几个中断就要写几次中断源);

编写中断服务函数;

常见的中断服务函数写法:


void EXTI3_IRQHandler(void)

{

    if(EXTI_GetITStatus(EXTI_Line3)!=RESET) //判断某个线上的中断是否发生

    {

        // 中断逻辑…     

    } 

     EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE 上的中断标志位

}

在野火开发板中,PA0和PC13为按键,这里配置为外部中断,代码如下


bsp_exti.c


#include "bsp_exti.h"

 

static void EXTI_NVIC_Config(void)

{

    NVIC_InitTypeDef NVIC_InitStruct;

 

    // 先设置中断优先级分组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStruct);

// 开启了两个中断,所以要再设置中断源

    NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;

NVIC_Init(&NVIC_InitStruct);

}

 

 

void EXTI_Key_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

EXTI_InitTypeDef EXTI_InitStruct;

/* 配置中断优先级 */

EXTI_NVIC_Config();

 

    /* 初始化GPIO */

    // 初始化KEY1

    RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE);

    GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN;

    // 根据手册,应配置为浮空输入

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStruct);

// 初始化KEY2

    RCC_APB2PeriphClockCmd(KEY2_INT_GPIO_CLK, ENABLE);

    GPIO_InitStruct.GPIO_Pin = KEY2_INT_GPIO_PIN;

    // 根据手册,应配置为浮空输入

    GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStruct);

/* 初始化EXTI */

// 开启AFIO时钟,因为EXTI由AFIO控制

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

// 选择GPIO输入线为PA0,对应着AFIO_EXTICR

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

// 这里的EXTI输入线只是为了把相应的位写入EXTI相关寄存器

EXTI_InitStruct.EXTI_Line = EXTI_Line0;

EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_InitStruct.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStruct);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);

EXTI_InitStruct.EXTI_Line = EXTI_Line13;

EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_InitStruct.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStruct);

}

bsp_exti.h


#ifndef __BSP_EXTI_H

#define __BSP_EXTI_H

 

#include "stm32f10x.h"

 

#define KEY1_INT_GPIO_PIN GPIO_Pin_0

#define KEY1_INT_GPIO_PORT      GPIOA

#define KEY1_INT_GPIO_CLK       RCC_APB2Periph_GPIOA

 

#define KEY2_INT_GPIO_PIN GPIO_Pin_13

#define KEY2_INT_GPIO_PORT      GPIOC

#define KEY2_INT_GPIO_CLK       RCC_APB2Periph_GPIOC

 

static void EXTI_NVIC_Config(void);

void EXTI_Key_Config(void);

 

#endif /* __BSP_EXTI_H */

接下来看中断服务函数stm32f10x_it.c


void EXTI0_IRQHandler(void)

{

// 判断是否发生中断

// 与函数FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);功能相同

if (EXTI_GetITStatus(EXTI_Line0) != RESET)

{

LED_R_TOGGLE;

}

// 清除标志位,往EXTI_PR寄存器写1,与函数void EXTI_ClearFlag(uint32_t EXTI_Line)功能相同

// 之所有一个功能有两个一样的函数,是为了兼容旧的固件库

EXTI_ClearITPendingBit(EXTI_Line0);

}

 

 

void EXTI15_10_IRQHandler(void)

{

// 判断是否发生中断

// 与函数FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);功能相同

if (EXTI_GetITStatus(EXTI_Line13) != RESET)

{

LED_B_TOGGLE;

}

// 清除标志位,往EXTI_PR寄存器写1,与函数void EXTI_ClearFlag(uint32_t EXTI_Line)功能相同

// 之所有一个功能有两个一样的函数,是为了兼容旧的固件库

EXTI_ClearITPendingBit(EXTI_Line13);

}

有个问题,就是如果PA0 PB0 PC0都连接到EXTI0输入线上,怎么判断某次中断具体来自于哪一个呢?解决的办法就是,在中断服务函数中,读IO口的引脚电平,也就是IDR输入数据寄存器,通过比较几个GPIO端口的IDR来判断,具体如下


{

// 判断是否发生中断

if (EXTI_GetITStatus(EXTI_Line0) != RESET)

{

        // 中断来自于PA0,同理

        if (GPIOA->IDR & GPIO_Pin_0 == GPIO_Pin_0)

        {

        LED_R_TOGGLE;

        }

}

// 清除标志位,往EXTI_PR寄存器写1

EXTI_ClearITPendingBit(EXTI_Line0);

}

最后在主函数中调用


main.c


#include "stm32f10x.h"

#include "bsp_led.h"

#include "bsp_exti.h"

 

void delay(uint32_t count);

 

int main(void)

{

LED_GPIO_Config();

EXTI_Key_Config();

 

while (1)

{

 

}

}

 

void delay(uint32_t count)

{

for (; count != 0; count--);

}

推荐阅读

史海拾趣

Arima Lasers Corp公司的发展小趣事

Arima Lasers Corp深知人才是企业发展的核心驱动力。因此,公司高度重视人才培养和团队建设。通过制定完善的培训计划和激励机制,公司吸引了一批批优秀的研发人才和管理人才。这些人才为公司的发展注入了源源不断的动力,推动了公司在技术、市场和管理等各个方面的全面提升。

Edcon Components Netherlands Cv公司的发展小趣事

品质一直是Edcon Components Netherlands Cv的生命线。公司始终坚持以客户为中心,注重产品质量和服务的提升。通过引进先进的生产设备和检测设备,加强生产过程中的品质控制,确保每一件产品都符合高标准的质量要求。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。这些举措使得Edcon在客户中树立了良好的品牌形象。

Cicoil公司的发展小趣事

随着计算机技术的飞速发展,处理器成为了电子设备的核心部件。Cicoil公司看到了这一趋势,开始与处理器制造商展开合作。他们为处理器提供高质量的连接电缆,确保处理器能够稳定、高效地运行。这一合作使得Cicoil公司的电缆产品进一步深入到计算机领域,也为其带来了更多的商业机会。

CINCH公司的发展小趣事

随着业务的不断发展,CINCH公司开始寻求市场拓展和战略合作的机会。公司积极与国内外知名企业建立合作关系,共同开发新产品、拓展新市场。同时,CINCH公司还加强了对新兴市场的关注,通过参加国际展会、举办技术研讨会等方式,提升品牌知名度和影响力。这些举措有效地推动了公司的市场拓展和业务发展。

爱浦电子(AIPULNION)公司的发展小趣事

随着公司业务的不断扩展,爱浦电子于XXXX年成立了广州优联电气科技有限公司作为其分支机构。这一举措不仅进一步扩大了公司的业务范围和市场影响力,还为公司提供了更多的发展机遇和合作伙伴。广州优联电气科技有限公司在爱浦电子的业务开拓、经营及配套服务方面发挥了重要作用,推动了公司整体业务的快速发展。

这五个故事只是爱浦电子发展起来的一部分缩影,它们展现了公司在技术创新、市场拓展、服务升级、创新引领以及分支机构成立等方面的努力和成就。正是这些不懈的努力和持续的进步,使得爱浦电子在电子行业中脱颖而出,成为一家备受瞩目的高新技术企业。

Avalon Photonics公司的发展小趣事

随着公司的发展,Avalon Photonics开始寻求国际合作,以进一步拓展市场。公司与欧洲一家知名的科研机构建立了战略合作关系,共同研发新一代的光子学设备。这一合作不仅带来了技术上的互补,也为Avalon打开了欧洲市场的大门。通过国际合作,Avalon的产品逐渐在国际市场上获得认可,公司规模也逐步扩大。

问答坊 | AI 解惑

Preparing for orcad layout

Preparing for orcad layout…

查看全部问答>

向大师求教关于WDK中build时的警告

最近用WDK7600编译驱动时发现会出现一个Warning.但并不产生.wrn文件,Prefast里也没有任何警告.查了半天发现build时不带任何参数,即在没有编译任何文件的情况下也出现1个Warning.请问哪位大师知道是怎么会事?这到底是个什么鬼Warning? …

查看全部问答>

为何在驱动中定义char rspBuf[102400]就会出错啊?

error lnk1120:unresolved external symbol _chkstk referenced in fuction XXX 注释掉char rspBuf[102400]就没有错误了。…

查看全部问答>

跪求intel 82573 ge网卡驱动

跪求intel 82573 ge网卡驱动,我有linux的驱动,现求vxworks驱动,联系qq,445878446,可以交换。…

查看全部问答>

为什么U盘的文件传输速度远大于文件删除速度?

在Window XP下对U盘中一个相同的文件进行两组操作 1、将该文件拷贝到硬盘下 2、在U盘中删除该文件 Windows的提示时间是:操作1对应时间是55s,而操作2对应时间是8min。虽然Windows的提示时间不是很准确,但是明显感觉2操作的时间远长于1操作 请 ...…

查看全部问答>

申请Stellaris®LM3S8962 Ethernet+CAN评估板

申请Stellaris®LM3S8962 Ethernet+CAN评估板…

查看全部问答>

怎么用STM32的DAC输出比较稳定的电压啊,怎么实现电压可调,最好提供程序,

哎,看了好久资料了,不懂为什么,老是跟预计的结果不一样, 求高手帮忙…

查看全部问答>

2012 ARM嵌入式开发应用研讨会 PDF 下载

2012 ARM嵌入式开发应用研讨会,PDF 资料,上午是对 ARM 生态环境系统的一个介绍,下午有 Freescale ,NXP,ST,Fujitsu Cortex-Mx 单片机的介绍。 …

查看全部问答>

中国物联网产业发展要耐得住寂寞 切忌过分乐观孤注一掷

中国物联网产业发展要耐得住寂寞 切忌过分乐观孤注一掷 核心提示: 从目前物联网产业发展来看,物联网产业的推动主要还是国有大中型企业。其产业发展的核心还是致力于智慧城市建设相关领域,主体还是以三大运营商为核心,而智慧城市建设的核心,大 ...…

查看全部问答>