STM32
直播中

刘洋

10年用户 1157经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[问答]

STM32F4中断过程可以分为哪几步呢

什么是中断?中断过程可以分为哪几步呢?
NVIC和EXti寄存器的区别在哪?


回帖(1)

高峰

2021-10-20 09:28:27
  首先介绍什么是中断,指CPU对外部事件发出的中断请求进行响应和处理,完成后返回程序断点处继续之前的工作。打一个很简单的比方,你在家看电视时突然门铃响了,这就是一个中断请求,然后你就去开门,结果发现是快递来了,你签收完快递回到家继续看电视,这就是一整个中断过程。
  再来说说中断的抢占优先级和响应优先级,当你看电视时家里的电话和门铃同时响了,也就是同时有两个中断发生,那么CPU要响应先那个中断就要看中断优先级,如果中断优先级相同时再看响应优先级。STM32F4中需要设置中断优先级分组,如果不设置就是默认抢占优先级和响应优先级都占两位,也就是从零到三,值越小优先级越高。
  整个中断过程可以分为三步:
  1.中断检测
  2.中断响应
  3.中断挂起
  在STM32F4中以按键外部中断为例,需要以下几个步骤:
  1.定义NVIC、EXTI结构体
  2.使能系统时钟
  3.设置IO口和中断的映射关系
  4.配置外部中断EXTI控制寄存器
  5.配置NVIC控制寄存器
  6.中断服务函数
  关于NVIC和EXTI寄存器的区别:NVIC是嵌套向量中断控制器,而EXTI为外部中断控制器。NVIC相当于控制中断的大开关,而EXTI只是系统中断里面外部中断的小开关。
  为什么要使能系统时钟:STM32F4有两条总线:AHP即advanced high performance bus 高级高性能总线和APB即advanced periphoral bus高级外设总线。如图
  
  在每次芯片复位后,所有外设时钟都被关闭了,SRAM和FLASH除外,所以在使用外设时需要使能时钟,这么做的目的是为了降低芯片的功耗,开启时钟相当于提供电源。在STM32F4中文参考手册2.2节存储器组织结构中可以看到外设挂载到那根总线上。
  
  代码如下:
  `#include “EXTI.h”
  void EXTI2_IRQHandler(void)
  {
  if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
  {
  GPIO_WriteBit(GPIOE,GPIO_Pin_13,!GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_13));
  }
  EXTI_ClearITPendingBit(EXTI_Line2);
  }
  void InitExit(void)
  {
  NVIC_InitTypeDef NVIC_InitStruct;
  EXTI_InitTypeDef EXTI_InitStruct;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);
  EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
  EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
  EXTI_InitStruct.EXTI_Line=EXTI_Line2;
  EXTI_InitStruct.EXTI_LineCmd=ENABLE;
  EXTI_Init(&EXTI_InitStruct);
  NVIC_InitStruct.NVIC_IRQChannel=EXTI2_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
  NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
  NVIC_Init(&NVIC_InitStruct);
  }
  `
  从keil软件复制过来注释全乱了,所以删掉了注释,那么两个结构体的成员变量怎么设置如图:
  
  
  需要注意的就是怎么选择中断线,在哪个GPIO管脚上就选择那根线,这是内部结构决定的,如图是用选择器来进行选择的。
  
  还有一点必须注意中断服务函数名称不能写错,都为EXTI2(此处为中断线编号)_IRQHandler如果写错既不会报错也无法进入中断服务函数。
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分