STM32库函数EXTI_GetFlagStatus和EXTI_GetITStatus的区别

发布者:WhisperingSong最新更新时间:2021-12-24 来源: eefocus关键字:STM32  库函数 手机看文章 扫描二维码
随时随地手机看文章

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

关键字:STM32  库函数 引用地址:STM32库函数EXTI_GetFlagStatus和EXTI_GetITStatus的区别

上一篇:STM32的AFIO时钟什么时候需要开启
下一篇:STM32网络丢包问题分析

推荐阅读最新更新时间:2024-11-13 06:25

STM32——粗谈基础知识
对于STM32来说,首先我们从其精密性、可靠性以及安全性三个方面来进行说明: 精密性:与单片机的外设基本相同,除了其包含了7个DMA(直接存储器访问)通道。每个通道都可以用来在设备与内存之间进行8/16/32位数据的传输。每个设备都可以向DMA控制器发出发送或者接受数据的请求。 可靠性:采用硬件来对可靠性进行支持,包括一个低电压检测器,一个时钟安全管理系统和两个看门狗定时器(一个为窗口看门狗,一个为独立看门狗)。 安全性:STM32可以锁住其内部的Flash而使得破解人员无法通过端口读取其内容。STM32还有一小块电池备份RAM区,当该RAM区域检测到其入侵检测引脚产生电平变化时,就会自动将电池备份的RAM区域上的内容
[单片机]
STM32时钟详解
1.概述 时钟是单片机的脉搏,是单片机的驱动源,使用任何一个外设都必须打开相应的时钟。这样的好处是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。每个时钟tick,系统都会处理一步数据,这样才能让工作不出现紊乱。 2.原理 首先,任何外设都需要时钟,51单片机,STM32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。 51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以用了,而这个时钟是默认开启的,比如有一个水库,水库有很多个门,这些门默认是开启的,所以每个门都会出水,我们需要哪个门的水的时候可以直接用,但是也存在一个问题,
[单片机]
<font color='red'>STM32</font>时钟详解
基于STM32在IAR中调用printf()函数
在主文件main.c中添加如下代码: #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { USART_SendData(EVAL_COM1, (uint8_t) ch); while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} return ch; } #ifdef USE_F
[单片机]
STM32 printf问题
STM32 printf问题 怎么老是出现idenfier FILE is Undefined ,问题出在哪啊?望指教,谢谢! 我程序代码配置如下: #include stm32f10x.h #include stm32_eval.h #include stdio.h #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io
[单片机]
STM32的ADC1采集多条通道 可以不使用DMA功能吗?
类似的问题 为什么我采集5条通道的电压,而采集到的值却都是第一条的呢? 我什么时候需要使用DMA功能? Ⅰ 关于ADC的一些知识 STM32的ADC是一种12位逐次逼近型的模拟数字转换器。它有多达18条通道,可测量16个外部和2个内部信号源。 各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器ADC_DR中。 其实就是说,一个ADC,可检测18条通道,我们外接的只有16条。而结果只保存在一个寄存器ADC_DR中。 要使用ADC1采集多条通道,那么就需要对采集的通道进行分组排序。STM32的ADC可以把转换组织成两组:规则组和注入组。 假如我们采集的通道按照如下顺
[单片机]
<font color='red'>STM32</font>的ADC1采集多条通道 可以不使用DMA功能吗?
stm32的中断与事件
事件:是表示检测有一某件触发事件发生了。 中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中。 事件可以触发中断,也可以不触发 中断有可能被更优先的中断屏蔽,事件不会 事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒). 事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号
[单片机]
STM32程序加载---网络
一、设计流程 编写IAP加载程序,使用网口传输数据,并将.bin文件写入。单片机启动的时候按住某一个按键跳转到程序加载流程,否则跳转到应用程序入口地址执行。 二、程序分析 1、main程序 int main(void) { uint32_t flag = 0x00; #ifdef SERIAL_DEBUG DebugComPort_Init(); printf( rn %s , __VESION); #endif /* Initialize Key Button mounted on STM324xG-EVAL board */ IAP_Key_Init();
[单片机]
STM32的LCD12864液晶显示源程序
单片机源程序如下: #include config.h int main(void) { // int i=0,j=0; // int count=0; Stm32_Clock_Init(9);//系统时钟设置 delay_init(72); //延时初始化 //LED_Init(); //初始化与LED连接的硬件接口 Init_12864(); //初始化带字库12864液晶 // Display_string(0,0, 单片机综合设计 ); //显示第1行 // Display_st
[单片机]
<font color='red'>STM32</font>的LCD12864液晶显示源程序
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved