历史上的今天
返回首页

历史上的今天

今天是:2024年08月31日(星期六)

2018年08月31日 | STM32库函数EXTI_GetFlagStatus和EXTI_GetITStatus的区别

2018-08-31 来源: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 寄存器是否对该中断进行屏蔽,在中断挂起 & 没有屏蔽的情况下就会响应中断。


推荐阅读

史海拾趣

ETA-USA公司的发展小趣事

进入XXXX年代,ETA-USA开始将重心转向CAE(计算机辅助工程)软件的开发。公司投入大量资源进行研发,成功推出了一系列创新的CAE软件解决方案,如Dynaform,这些软件在覆盖件冲压成形、汽车碰撞模拟等领域取得了显著的应用效果。这一突破不仅巩固了ETA-USA在电子工程领域的地位,也为其后续发展奠定了坚实的基础。

Active-Semi公司的发展小趣事

ETA-USA一直注重技术创新和研发实力的提升。公司拥有一支高素质的研发团队和先进的研发设施,不断推出具有竞争力的新产品和解决方案。同时,ETA-USA还积极与高校、科研机构等合作,共同推动电子技术的创新和发展。

乾坤(Cyntec)公司的发展小趣事

产品质量是企业的生命线。乾坤公司深谙此道,因此在发展过程中始终注重质量管理体系的建立和完善。公司引进了国际先进的质量管理理念和方法,通过ISO 9001质量管理体系认证,并严格执行每一道生产工序的质量控制。为了确保产品质量的稳定性和可靠性,乾坤还建立了完善的产品测试和验证流程,每一批产品都要经过严格的质量检测才能出厂。这些举措不仅提升了产品质量,也赢得了客户的广泛认可和信赖。

Alpha & Omega Semiconductor(万国半导体)公司的发展小趣事

面对工业4.0的浪潮,乾坤公司积极响应国家智能制造的号召,开始进行智能制造的转型。公司引进了先进的自动化设备,对生产线进行了全面升级,实现了生产过程的自动化、信息化和智能化。通过智能制造的转型,乾坤不仅提高了生产效率,还降低了生产成本,同时提升了产品的一致性和可靠性。这一转型为乾坤公司的持续发展注入了新的动力,使其在激烈的市场竞争中保持了领先地位。

Hitano Enterprise Corp公司的发展小趣事

产品质量是企业的生命线。乾坤公司深谙此道,因此在发展过程中始终注重质量管理体系的建立和完善。公司引进了国际先进的质量管理理念和方法,通过ISO 9001质量管理体系认证,并严格执行每一道生产工序的质量控制。为了确保产品质量的稳定性和可靠性,乾坤还建立了完善的产品测试和验证流程,每一批产品都要经过严格的质量检测才能出厂。这些举措不仅提升了产品质量,也赢得了客户的广泛认可和信赖。

Anders DX公司的发展小趣事

产品质量是企业的生命线。乾坤公司深谙此道,因此在发展过程中始终注重质量管理体系的建立和完善。公司引进了国际先进的质量管理理念和方法,通过ISO 9001质量管理体系认证,并严格执行每一道生产工序的质量控制。为了确保产品质量的稳定性和可靠性,乾坤还建立了完善的产品测试和验证流程,每一批产品都要经过严格的质量检测才能出厂。这些举措不仅提升了产品质量,也赢得了客户的广泛认可和信赖。

问答坊 | AI 解惑

SIM卡座PCB封装(抽屉式和推拉式)

SIM卡座PCB封装(抽屉式和推拉式)…

查看全部问答>

卢二都

嘿嘿,麻烦大家给我提供74HC14施密特整形电路的一些资料。谢谢…

查看全部问答>

世界上最环保的笔记本~~~

感觉和百元笔记本的手摇发电有一拼~~…

查看全部问答>

关于LED电源驱动芯片

大家懂电源的朋友可以关心一下的,现最好的驱动电源使用哪种芯片,推荐一下!…

查看全部问答>

NorFlash应用问题(39VF1601型号)

1)NorFlash可供使用的地址空间应该从0x0000开始吧。那么为什么在手册中在说明ID读取时,如下:manufacturer\'s ID   0000H(address)   00BFH(data) ; Device ID   0001H(address)  2782H(data) 。感到不 ...…

查看全部问答>

关于函数的调用

我由CDialog类派生了一个新类DlgMenu 然后定义了一个DlgMenu类型变量Dlg1; 写了一个函数:void Fun(CDialog myDlg) 当我这样调用这个函数时Fun(Dlg1),为什么不行? 程序报错:cannot convert parameter 1 from \'class DlgMenu ‘to \'class C ...…

查看全部问答>

ADC0809的C程序,不知道哪错了。大侠们指点迷津啊

void main(void) { unsigned char xdata* data dptr;   unsigned char i,VOUT=0;   float Y,Y1,Y2,X;   while(1)         {          dptr=0x7ff8;  ...…

查看全部问答>

LED照明设计过程中关键问题全析

要设计产品,首先要确定用谁的LED封装结构;接下来考虑怎样适应这些封装形式; 由我们选择的机会不多,光学结构是建立在这些封装之上的;我们很多创意不能很好的发挥。下面介绍LED照明设计过程中的关键问题及分析。   一、半导体照明应用中存在 ...…

查看全部问答>

IAR4.2能修改缩进吗?

最近用IAR4.2开发ST,发现它默认的缩进只有两个空格,像 if(a) { ? ?b; } 不知道能不能修改成默认有更多空格,比如四个,像 if(a) { ? ? ? ? b; } 求教!…

查看全部问答>

430 能进行指数运算吗?

430 能进行指数运算吗? 如果能该怎样实现?? #include <math.h> void main(void) { dou××e i; i=exp(1.5); } 但从 watch 中检测 i 值 ,显示 un××iala××e 怎么一回事?? 3ks…

查看全部问答>