历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2021年12月24日 | STM32库函数EXTI_GetFlagStatus和EXTI_GetITStatus的区别

2021-12-24 来源:eefocus

在使用 STM32 的外部中断功能时,我们经常需要确认是否真的产生了外部中断,查看库函数,我们发现了这两个函数:EXTI_GetFlagStatus 和 EXTI_GetITStatus 。原型如下:


FlagStatus EXTI_GetFlagStatus ( uint32_t  EXTI_Line );


ITStatus EXTI_GetITStatus ( uint32_t  EXTI_Line ); 


可以看出,这两个函数是十分相似的,EXTI_GetFlagStatus 的作用是 Checks whether the specified EXTI line flag is set or not. 即检查指定的外部中断线的标志是否被置位;而 EXTI_GetITStatus 的作用是 Checks whether the specified EXTI line is asserted or not. 即检查指定外部中断线的状态是否有效。


也就是说前者是检查中断标志的,后者是检查中断状态的。我们追踪一下这两个库函数的实现即可发现区别。


【库函数 EXTI_GetFlagStatus】


/**

  * @brief  Checks whether the specified EXTI line flag is set or not.

  * @param  EXTI_Line: specifies the EXTI line flag to check.

  *   This parameter can be:

  *     @arg EXTI_Linex: External interrupt line x where x(0..19)

  * @retval The new state of EXTI_Line (SET or RESET).

  */

FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line)

{

FlagStatus bitstatus = RESET;

/* Check the parameters */

assert_param(IS_GET_EXTI_LINE(EXTI_Line));

   

if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) {

bitstatus = SET;

}

else {

bitstatus = RESET;

}

return bitstatus;

}


【库函数 EXTI_GetITStatus】


/**

  * @brief  Checks whether the specified EXTI line is asserted or not.

  * @param  EXTI_Line: specifies the EXTI line to check.

  *   This parameter can be:

  *     @arg EXTI_Linex: External interrupt line x where x(0..19)

  * @retval The new state of EXTI_Line (SET or RESET).

  */

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)

{

ITStatus bitstatus = RESET;

uint32_t enablestatus = 0;

/* Check the parameters */

assert_param(IS_GET_EXTI_LINE(EXTI_Line));

 

enablestatus =  EXTI->IMR & EXTI_Line;

if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) {

bitstatus = SET;

}

else {

bitstatus = RESET;

}

return bitstatus;

}


可以看到区别在于 EXTI_GetITStatus 比 EXTI_GetFlagStatus 多做了一个判断:


enablestatus =  EXTI->IMR & EXTI_Line;

if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) 


EXTI->PR 是 STM32 的挂起寄存器(EXTI_PR),其中的各个位被称为挂起位(Pending bit)。当外部中断线上发生了选择的边沿事件时,EXTI_PR 中相应的 Pending 位被置‘1’,也就是上面提到的 Flag。


而 EXTI->IMR 是中断屏蔽寄存器(EXTI_IMR),其中各个位表示相应中断线上的中断屏蔽。‘0’表示屏蔽来自线x上的中断请求,‘1’开放来自线x上的中断请求。


所以,EXTI_GetFlagStatus 只是纯粹读取中断标志位的状态,但是不一定会响应中断(EXT_IMR 寄存器对该中断进行屏蔽);而 EXTI_GetITStatus 除了读取中断标志位,还查看 EXT_IMR 寄存器是否对该中断进行屏蔽,在中断挂起 & 没有屏蔽的情况下就会响应中断。

推荐阅读

史海拾趣

Electro-Optical Systems Inc公司的发展小趣事

EOS公司成立于1983年,创始人是一群热衷于红外技术的专家。他们深知红外探测器在军事、科研和工业领域的重要性,于是决定投身于这一领域。初创时期,EOS面临着资金短缺、技术难度大等挑战,但团队成员凭借着对技术的执着和对市场的敏锐洞察,逐步攻克难关,成功研制出第一批红外探测器产品。

Delta Electronics公司的发展小趣事

Delta Electronics在电源管理技术方面一直处于行业领先地位。公司不断投入研发资源,推动电源技术的创新和进步。其中,Delta开发的高效率开关式电源供应器,以其高效、稳定和可靠的性能,赢得了全球客户的广泛认可。此外,公司还积极推广绿色能源和节能技术,为客户提供环保、节能的电源解决方案。

Anderson Electronics Inc公司的发展小趣事

面对电子行业的快速变革和市场竞争的加剧,Anderson Electronics Inc公司积极进行产业升级和智能制造的转型。公司引进了先进的生产设备和技术,实现了生产过程的自动化和智能化。同时,公司还加大了对研发人员的培养和引进力度,建立了一支高素质的研发团队。通过产业升级和智能制造的转型,公司成功提升了生产效率和产品质量,进一步巩固了市场地位。

Dawning Precision Co Ltd公司的发展小趣事

随着市场竞争的加剧,Dawning意识到只有不断创新才能在行业中立于不败之地。公司加大了对研发的投入,聘请了一批在电子制造领域具有丰富经验的专家。在专家团队的带领下,Dawning成功开发出了多款具有自主知识产权的高精度电子产品,这些产品不仅在性能上领先同行,而且在价格上也更具竞争力。这些创新产品的推出,极大地提升了Dawning在市场上的竞争力。

Gardner Denver公司的发展小趣事

随着市场竞争的加剧,Dawning意识到只有不断创新才能在行业中立于不败之地。公司加大了对研发的投入,聘请了一批在电子制造领域具有丰富经验的专家。在专家团队的带领下,Dawning成功开发出了多款具有自主知识产权的高精度电子产品,这些产品不仅在性能上领先同行,而且在价格上也更具竞争力。这些创新产品的推出,极大地提升了Dawning在市场上的竞争力。

Cambridge Electronic Industries Ltd公司的发展小趣事

面对日益严峻的环境问题和社会责任,CEI积极响应可持续发展的号召。公司加大了对环保技术的研发投入,推出了多款节能、环保的电子产品。同时,CEI还关注员工福利和社会公益事业,积极参与社会捐赠和公益活动。展望未来,CEI将继续坚持技术创新和可持续发展战略,为电子行业的繁荣和发展做出更大的贡献。

通过以上五个故事,我们可以看到Cambridge Electronic Industries Ltd公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和可持续发展等方面的努力,逐渐成为了电子行业的佼佼者。

问答坊 | AI 解惑

闭路监控中的名词解释

1) CCTV的含义是什么? 答: CCTV 是英文Closed Circuit Television的缩写,意思是闭路电视监控系统 2) 什么是镜头的焦距? 答: 从光学原理来讲焦距就是从焦点到透镜中心的距离。即焦距长度。如\"f=8-24mm,\",就是指镜头的焦距长度为8-24mm ...…

查看全部问答>

NB变身 很好很强大!

前两天去逛中关村,看到同方的销售点摆了一台火影忍者的notebook,俺被雷了一下。过去询问一翻,老板说是别人定制的,我颤巍巍的问:“这定制很贵吧。”老板立即兴奋起来:“便宜,加400块,这个机器才3198,一共不到3600呢。这个人十天前定制的, ...…

查看全部问答>

请教下大虾预定义后边的数代表什么

0x06   0x04    ........这些数代表寄存器的地址吗?还是代表的数字? 但#define SLIDE_LENGTH  4中的4代表什么? // X5045 related constant//相关数据 #define WREN  0x06 #define WRDI &nbs ...…

查看全部问答>

科普一下哈!

科普一下哈!!——大功率LED器件介绍 [ 本帖最后由 雪山飞狐 于 2010-5-20 18:03 编辑 ]…

查看全部问答>

问一下大家,有没有熟悉工控机的?

我需要做个程序,是工控机内的JAVA WEB开发,需要做到是网站上点击一个按钮就拨出电话,再点另一个挂机按钮自动挂断,并且能知道打了多少分钟,打得电话号码多少这些资料的,谁能提供一点帮助,谢谢…

查看全部问答>

关于STM32的PWM快速打开/关闭,以及空闲时管脚电平设置

现在使用TIM3来产生PWM波形,并通过软件打开/关闭PWM以实现调制波形。做法是: 打开:TIM_Cmd(TIM3, ENABLE); 关闭:TIM_Cmd(TIM3, DISABLE); 跟踪到TIM_Cmd之后,发现直接操作寄存器就可以了:TIMx->CR1 |= CR1_CEN_Set; 这个问题算解 ...…

查看全部问答>

互联型产品能通过以太网更新固件吗

                                 stm32产品线支持IAP功能,手册上讲可以通过任何通讯协议来更新程序。那互联型产品能不能通过以太网远程来更新程序 ...…

查看全部问答>

大家帮忙了!

430中0/0的问题怎么处理呢?…

查看全部问答>

听说现在430单片机外接高频晶振可以大于8M了?

听说现在430单片机外接高频晶振可以大于8M了?那么最大可以外接多大的晶振?都有哪些型号?…

查看全部问答>