历史上的今天
返回首页

历史上的今天

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

正在发生

2021年10月11日 | stm32中断服务函数c语言,STM32 外部中断详解

2021-10-11 来源:eefocus

本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断


1 前言

打算写一下中断,又忍不住想说一下中断的概念,去书上翻一翻,或者自己在搜索引擎上搜一下,都可以找到一大堆,包括本文写的这个外部中断也不例外。如果要写光是中断就可以单独写一篇了,所以本文直入主题,对于STM32的外部中断进行详细的剖析。


2 STM32的外部中断

下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器;

中断屏蔽寄存器(EXTI_IMR)

事件屏蔽寄存器(EXTI_EMR)

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

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

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

挂起寄存器(EXTI_PR)

c039beb72989600043a03bc2f07e5ca1.png?imageView2/2/w/550

EXTI支持配置20个中断和事件屏蔽位;

GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15;

EXTI_Line16 连接到PVD输出 ;

EXTI_Line17连接到RTC闹钟事件;

EXTI_Line18连接到USB唤醒事件;

EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品);

GPIO的映射关系图如下所示;

8fa0bb8f4a8a845eefbe01508da1174d.png?imageView2/2/w/550

3 中断服务函数的映射关系

GPIO

IRQn

IRQHandler

GPIO_Pin0

EXTI0_IRQn

EXTI0_IRQHandler

GPIO_Pin1

EXTI1_IRQn

EXTI1_IRQHandler

GPIO_Pin2

EXTI2_IRQn

EXTI2_IRQHandler

GPIO_Pin3

EXTI3_IRQn

EXTI3_IRQHandler

GPIO_Pin4

EXTI4_IRQn

EXTI4_IRQHandler

GPIO_Pin5 — GPIO_Pin9

EXTI9_5_IRQn

EXTI9_5_IRQHandler

GPIO_Pin10 — GPIO_Pin15

EXTI15_10_IRQn

EXTI15_10_IRQHandler

4 外部中断的配置

宏定义,抽象一下接口,方便后面修改;

#define Z_GPIO_PIN GPIO_Pin_5

#define Z_GPIO_PORT GPIOE

#define Z_PortSource GPIO_PortSourceGPIOE

#define Z_PinSource GPIO_PinSource5

#define Z_Line EXTI_Line5

#define Z_IRQ EXTI9_5_IRQn

GPIO的配置;这里GPIO的输入模式可以配置为浮空输入(GPIO_Mode_IN_FLOATING),上拉输入(GPIO_Mode_IPU)或者下拉输入(GPIO_Mode_IPD),具体如下图所示;

bcde4934450220bd5b80c03c321066bd.png?imageView2/2/w/550GPIO的配置代码如下;

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_StructInit(&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = Z_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(Z_GPIO_PORT, &GPIO_InitStructure);

不要忘记外设总线时钟的配置;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |

RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |

RCC_APB2Periph_GPIOG, ENABLE);

EXTI的配置,EXTI_Trigger这里支持三种模式;

EXTI_Trigger_Rising 上升沿触发;

EXTI_Trigger_Falling 下降沿触发;

EXTI_Trigger_Rising_Falling 上升沿和下降沿都可以触发;

GPIO_EXTILineConfig(Z_PortSource, Z_PinSource);

EXTI_InitStructure.EXTI_Line = Z_Line;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

NVIC的配置

NVIC_InitStructure.NVIC_IRQChannel = Z_IRQ;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

中断服务函数

void EXTI9_5_IRQHandler(void)

{

//中断服务函数

}


5 寄存器的操作

以下摘自**《STM32参考手册》**

产生产生中断的步骤,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在**中断屏蔽寄存器(EXTI_IMR)的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置1。在挂起寄存器(EXTI_PR)的对应位写1,将清除该中断请求。


产生事件的步骤:必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在中断屏蔽寄存器(EXTI_IMR)**的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。


中断屏蔽寄存器(EXTI_IMR)

事件屏蔽寄存器(EXTI_EMR)

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

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

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

挂起寄存器(EXTI_PR)

IMR如下图所示,其他几个类似;

3b0d9d610cc7669cd2c224119dd48a36.png?imageView2/2/w/550

5.1 硬件中断选择

通过下面的过程来配置20个线路做为中断源:

配置20个中断线的屏蔽位(EXTI_IMR)

配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);

配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。


5.2 硬件事件选择

通过下面的过程,可以配置20个线路为事件源

配置20个事件线的屏蔽位(EXTI_EMR)

配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)


5.3 软件中断/事件的选择

20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:

配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)

设置软件中断寄存器的请求位(EXTI_SWIER)


6 总结

本文参考stm32手册对于外部中断的概念以及配置进行了介绍,

推荐阅读

史海拾趣

德尔创(Dersonic)公司的发展小趣事

德尔创(Dersonic)公司成立于XXXX年,由一群电子工程领域的专家共同创立。成立之初,公司面临着资金紧张、市场竞争激烈等挑战。然而,他们凭借对电子技术的深刻理解和对市场的敏锐洞察,决定专注于研发和生产高品质的电子元器件。通过不断的研发和创新,德尔创成功推出了其首款具有竞争力的产品,并在市场上获得了初步认可。

Arduino公司的发展小趣事

Arduino平台从一开始就秉持着开源和合作的理念。它的源代码、硬件设计和文档都是公开的,鼓励开发者们共同参与和贡献。这种开放的精神吸引了大量的开发者加入Arduino社区,共同推动Arduino平台的发展。同时,Arduino也与许多企业和机构建立了合作关系,共同推动电子行业的发展和创新。

ATC [American Technical Ceramics]公司的发展小趣事

在电子行业的发展历程中,技术突破一直是推动公司成长和市场扩张的关键因素。假设ATC在某一时期成功研发出了一种新型的陶瓷材料,这种材料在耐高温、抗腐蚀等方面具有显著优势,因此被广泛应用于半导体制造和电子设备领域。这一技术突破使得ATC的产品在市场上获得了极高的认可,公司也因此实现了快速的收入增长和市场占有率的提升。

Asian Best Components Co Ltd公司的发展小趣事

Asian Best Components Co Ltd在电子行业的初期,凭借一支富有创新精神的技术团队,成功研发出了一款高效能的电子元件。这款产品以其稳定性和高性价比迅速在市场上占据了一席之地。公司借此契机,不断扩大生产规模,提升产品质量,逐渐在电子元件领域建立了良好的口碑。随着技术的不断进步,Asian Best不断推陈出新,陆续开发出多款领先行业的产品,为公司的发展奠定了坚实的基础。

台湾君耀(Brightking)公司的发展小趣事

君耀(Brightking)公司于1996年在台湾新竹高科技园区创立,初期专注于防雷元器件的研发和生产。凭借对技术的深入研究和市场需求的敏锐洞察,君耀逐步在台湾的电子器件市场上占得一席之地。随着产品质量和技术含量的提升,君耀的产品开始受到国内外客户的青睐,销售网络逐渐拓展至全球。

Hi-Tron Semiconductor Corp公司的发展小趣事

为了进一步提升竞争力,君耀开始实施国际化战略。公司在日本、中国大陆等地设立生产基地,利用当地的资源和优势,提高生产效率,降低成本。同时,君耀积极参与国际认证,其产品通过UL、VDE、TUV、CSA等一系列国际认证,为进军国际市场打下了坚实的基础。

问答坊 | AI 解惑

用10个漂亮问题完美结束面试

本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 在面试结束前,大多数的主考官都会丢问题给求职者,最常见的就是:你有没有什么问题或疑问,想要提出来的?无论求职者是否有提出问题,其实,这个问题背后的真正含意,通常是主考官用来测试你对这份 ...…

查看全部问答>

找工作,选择比努力更重要

选择比努力更重要 一个人一生当中最大的幸福在于选择对两件事,一是找对单位、找对老板、找对上司;第二件事就是找对妻子或丈夫。为什么这么说呢?当太阳升起时我们与上司共事,当日落西下,我们与自己的爱人相拥。你永远可以更主动地去影响你的上 ...…

查看全部问答>

FM收音机带有立体声收音

收音部分采用CXA1238M集成电路,灵敏度高,性能稳定,立体收音,功放采用TDA2822M集成电路。 电子制作是综合能力的体现,从中可学到不少技术和经验,欢迎选购制作。一板两用,既可当FM收音机用,又可以当立体声功放用。本板体积小巧玲珑,给用户 ...…

查看全部问答>

求助:51与8155连接问题,模拟端口方式

如题,因为8155只需要低八位地址,P2想留做他用,故想采用普通IO模拟地址总线、ALE、WR等端口方式实现。按照时序图写出程序,但实验失败,在此求助,先谢过啦。代码如下: #include #include sbit AL = P2^0;    //ALE sbit W = P2^2 ...…

查看全部问答>

海浪发电的漂浮灯

除了每天准时升起的太阳时刻不停的将取之不竭能量输送到地球上,时刻波动起伏的广阔海面也蕴含着无穷的能量。这款漂浮在水面的信号灯利用海面的水流驱动发电机产生电力来点亮信号灯,可安置在暗礁周围用于警示或装置在深海边缘提醒游泳者慎入以及在 ...…

查看全部问答>

LCD液晶的操作

1602液晶:2行,每行16个点 主要看“写指令”和“写数据”,因为E=高脉冲,所以在初始化的时候要给E低电平,为高脉冲做准备。 1602液晶的屏幕地址,且以0x80为基地址。 在初始化中的指令码对应下表: 我写的LC ...…

查看全部问答>

如何获取WIFI的NIC_STATISTICS

直接用如下代码获取,返回值为TRUE,得不到数据:         memset(&m_nicdata, 0, sizeof(m_nicdata));         m_nicdata.Size = sizeof(NIC_STATISTICS);         m_nicdata.ptc ...…

查看全部问答>

求购在WINCE6.0下,A4平台上运行的TCPMP源码,价钱面议

在下求购能在WINCE6.0下,A4平台上运行的TCPMP源码. 本人在深圳 南山,西丽. QQ 50580776 EMAIL: gmb_669@163.com…

查看全部问答>

socket编程的问题

是这样的,我最近在ARM上移植了UCOSII,下载了TCP/IP包,目的是利用以太网口实现两个目标板的通信。应用层上用SOCKET编程实现,基于TCP协议。但是问题是server和client怎么也建立不起链接。client方connect函数一直调用失败。server方listen调用成 ...…

查看全部问答>

EVC下将LPBYTE转换成LPWSTR,谢谢!

LPBYTE lpByte; 如何转化为LPWSTR类型呢?…

查看全部问答>