基于个人对STM32的EXTI的理解

目录

EXTI外部中断的讲解

什么是EXTI?

EXTI的应用

如何触发外部中断

EXTI的结构与功能

EXTI库函数

 编写IDWG.c文件


EXTI外部中断的讲解

什么是EXTI?

EXTI是指微处理器在执行某段程序的过程中,由于某种原因,暂时中止原程序的执行,转去执行相应的处理程序,执行完后再回来继续执行原程序的过程。

EXTI的应用

1.微处理器与外设并行工作,解决了微处理器速度快,外设速度慢的矛盾。

2.实时处理。控制系统往往有许多数据需要采集或输出,实时控制中有的数据难以估计何时需要交换。。

3.故障处理。计算机系统的故障往往会随机发生,如电源断电、运算溢出、储存器出错等等,采用中断技术时,系统故障一旦出现就能及时得到处理。 4.

实现人机交互。人和微处理器交互一般采用键盘和按键,可以采用中断技术实现,采用中断方式时微处理器执行效率高,而且可以保证人机交互的实时性。

如何触发外部中断

1.电平触发方式。在数字电路中,电平从低电平变为高电平的那一瞬间成为上升沿;相反从 e高电平到低电平的那一瞬间称为下降沿。而这种电平变化同样可以用微处理器来检验,当配置了外部中断的引脚接受到相应配置后的电压后会触发外部中断,从而去执行中断服务函数。

2.跳变沿触发方式。外部中断若定义为跳变沿触发方式,外部中断申请触发器可以锁存外部中断输入线上的负跳变,即使微处理器暂时不能响应,中断申请标志也不会丢失。在这种方式中,如果连续两次采样,一个机器周期采样到外部中断输入为高,下一个机器周期采样为低,则置1中断申请触发器,直到微处理器响应此中断时才清0,外部中断的跳变沿触发方式适合以负脉冲形式输入的外部中断请求。

EXTI的结构与功能

EXTI用于管理STM32的外部中断/事件线,每个中断/事件线都对应着一个边沿检测器,可以实现输入信号的上升沿检测和下降沿检测。互联网产品系列的EXTI由20个产生事件/中断请求的边沿检测器组成,而其他产品系列的EXTI由19个产生事件/中断请求的边沿检测器组成。EXTI可以实现对每个中断/事件线进行单独配置,每个输入线可以单独地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿,下降沿或双边沿),并可以单独被屏蔽。

  • 中断屏蔽寄存器(EXTI_IMR)
  • 事件屏蔽寄存器(EXTI_EMR)
  • 上升沿触发选择寄存器(EXTI_RTSR)
  • 下降沿触发选择寄存器(EXTI_FTSR)
  • 软件中断事件寄存器(EXTI_SWIER)
  • 挂起寄存器(EXTI_PR)

 

  • 边沿检测电路:可以根据上升沿触发选择寄存器(EXIT_RTSR)和下降沿触发选择寄存器(EXIT_FTSR)对应位的设置来控制信号触发。边沿检测电路以输入线作为信号输入端,当没有检测到边沿跳变时,会输出无效信号0;而当检测到边沿跳变时,会输出有效信号1给或门电路,(EXIT_RTSR)和(EXIT_FTSR)两个寄存器用来控制需要检测那些类型的电平跳变过程,可以是只有上升沿触发、只有下降沿触发或上升沿和下降沿触发。
  • 或门电路:有两个信号端,其中是边沿检测电路,另一个来自软件中断事件寄存(EXTI_SWIER)。无论哪一个信号产生有效信号1,都可以通过或门电路输出1给与门电路
  • 与门电路(上):有两个信号端,其中一个是或门电路,另一个来自中断屏蔽寄存器(EXTI_IMR)。该与门电路的输出信号会被保持到挂起寄存器(EXTI_PR)内,如果确定该与门电路输出为1,则会把EXTI_PR中的对应位置1。
  • NVIC中断控制器:将EXTI_PR中对应位的内容输出到NVIC内,从而实现系统中断/事件控制。
  • 与门电路(下):有两个信号端,其中一个是或门电路,另一个来自事件屏蔽寄存器(EXTI_EMR)。
  • 脉冲发生电路。其信号是一个与门电路,如果输入信号为0,则脉冲发生器不会输出脉冲;如果输入信号为1,则脉冲发生器电路会产生一个脉冲信号。
  • 一个脉冲信号:是EXTI产生事件线路的最终产物。该脉冲信号可以供其他外设电路使用,如定时器TIMx,模拟数字转换器ADC等,用来触发TIMx或使ADC开始转换。
    综上,在EXTI中,产生中断线路的目的是把输入信号输入NVIC中,以便进一步运行中断服务函数,实现相应的功能;而产生事件线路的目的是通过电路信号传输,传送一个脉冲信号给其他外设使用。前者是软件,后者是硬件
     

EXTI库函数

EXTI_DeInit(void)

功能:将EXTI外设寄存器重置为默注释 注释:RCC_APB2PeriphResetCmd参数中没有EXTI外设的的宏,该外设重置采取的是直接向寄存器赋默认值的操作 例如,重设EXTI寄存器为默认的复位值:

EXTI_DeInit();

EXTI_ Init(EXTI_InitTypeDef*EXTI_InitStruct) 

功能:根据EXTI_InitStruct结构体中所配置的参数来初始化EXTI外设 注释:结构体中模式成员设置了被使能线路为事件请求还是中断请求 输入参数:EXTI_InitStruct:指向结构体EXTI_InitTypeDef的指针,包含外设EXTI寄存器的配置信息。

typedef struct
{
	uint32_t EXTI_Line;                //外部中断/事件线路
	EXTIMode_TypeDef EXTI_Mode;        //设置线路模式(事件/中断)
	EXTITrigger_TypeDef EXTI_Trigger;  //设置触发边沿(上/下)
	FunctionalState EXTI_LineCmd;      //线路使能或失能
} EXTI_InitTypeDef;

 EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct)

功能:将EXTI_InitStruct结构体中各成员按默认值填充 注释:只填充了结构体,还没有将参数写入到寄存器中(xxx_Init) 输入参数:EXTI_InitStruct:指向结构体EXTI_InitTypeDef的指针,包含外设EXTI寄存器的配置信息。 EXTI_InitStruct默认值

EXTI_InitStruct成员默认值EXTI_InitStruct成员默认值
EXTI_LineEXTI_LineNoneEXTI_ModeEXTI_Mode_Interrupt
EXTI_TriggerEXTI_Trigger_FallingEXTI_LineCmdDSIABLE

EXTI_GenerateSWInterrupt(uint32_t EXTI_Line)         

功能:产生一个软件中断 注释:如果在EXTI_IMR和EXTI_EMR中允许产生该中断,则此时将产生一个中断 输入参数:EXTI_Line:待使能或失能的EXTI线路,EXTI_Linex(x可以取0~19) 例如,产生一个软件请求:

EXTI_GenerateSWInterrupt(EXTI_Line4);

EXTI_GetFlagStatus(uint32_t EXTI_Line) 

功能:检查指定的外部中断线的标志是否被置位(如果在EXTI_IMR和EXTI_EMR中允许产生该中断,则此时将产生一个中断) 注释:该函数没有检查EXTI_IMR和EXTI_EMR状态,它只是纯粹读取中断标志位的状态,但是不一定会响应中断 输入参数:EXTI_Line:待检查的EXTI线路标志位,EXTI_Linex(x可以取0~19)

例如,获取外部中断线路8的标志位状态:

FlagStatus EXTIStatus;
EXTIStatus = EXTI_GetFlagStatus(EXTI_Line8);

EXTI_ClearFlag(uint32_t EXTI_Line) 

功能:清除EXTI线路的挂起标志 ****注释:与EXTI_ClearITPendingBit完全一致 输入参数:EXTI_Line:待清除的EXTI线路标志位,EXTI_Linex(x可以取0~19) 例如,清除外部中断线路2的标志位

EXTI_ClearFlag(EXTI_Line2);

EXTI_GetITStatus(uint32_t EXTI_Line) 

功能:检查指定外部中断线的状态是否有效,检查中断状态,也就是中断是否发生 注释:除了读取中断标志位,还查看 EXT_IMR 寄存器是否对该中断进行屏蔽,在中断挂起 & 没有屏蔽的情况下就会响应中断 例如,检查外部中断线路2的挂起位状态

ITStatus EXTIStatus;
EXTIStatus EXTI_GetITStatus(EXTI_Line8);

EXTI_ClearITPendingBit(uint32_t EXTI_Line)

功能:清除EXTI线路挂起位 ****注释:与EXTI_ClearFlag完全一致 EXTI_Line:待检查的EXTI线路待处理位,EXTI_Linex(x可以取0~19) 例如,清除外部中断线路2的挂起位

EXTI_ClearITPendingBit(EXTI_Line2);

 编写IDWG.c文件

void IWDG_Init(u8 pre,u16 rlr)
{
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
	IWDG_SetPrescaler(pre);//设置预分频系数 0-6
	IWDG_SetReload(rlr);//设置重装载值
	IWDG_ReloadCounter();  //重装载初值
	IWDG_Enable(); //打开独立看门狗
	
}

/*******************************************************************************
* 函 数 名         : IWDG_FeedDog
* 函数功能		   : 喂狗
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void IWDG_FeedDog(void)  //喂狗
{
	IWDG_ReloadCounter();  //重装载初值
}

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 EXTI中断是指基于STM32系列微控制器的外部中断。STM32F40xx/STM32F41xx微控制器具有82个可屏蔽中断,用于处理来自外部设备的中断请求。这些中断可以被编程为不同的优先级,并且可以通过设置抢占优先级和响应优先级来灵活地处理中断。 在设置STM32 EXTI中断的过程中,首先需要设置中断优先级分组,这是通过调用函数`NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)`来完成的。这个函数只需要在系统运行后设置一次即可。接下来,针对每个具体的中断,需要设置相应的抢占优先级和响应优先级,这可以通过调用函数`NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)`来实现。 当一个中断被触发并开始执行时,为了能够接收下一个中断,需要使用函数`EXTI_ClearITPendingBit()`来清除中断标志位。这样可以确保中断已经开始执行,并且可以接收到下一个中断请求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [7、STM32的外部中断EXTI及NVIC中断优先级介绍(内附代码)](https://blog.csdn.net/weixin_42108484/article/details/80719186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值