EXTI和NVIC随手记

这次主要记录中断的编写过程。

在32中对于中断函数的编写,首先需要配置 NVIC 和 EXTI,首先要配置 NVIC ,其中包括中断优先级, 中断源,以及中断类型等,主要依据 misc.h 中的 NVIC_InitTypeDef来编写。

之后配置EXTI的结构体的相关寄存器,根据EXTI_InitTypeDef 配置即可。

在这之后便可以在 stm32f10x_it.c 中快乐的编写中断函数了,当然还会有一些细节注意下面会记录。


NVIC(嵌套向量中断控制器)是属于 cortex-m3 内部的一个外设,用于控制这整个芯片的中断系统,与内核紧密耦合,大部分芯片厂商在设计时会将 NVIC 进行裁剪,所以所32中的 NVIC 是原 NVIC 的子集。

NVIC寄存器

关于 NVIC 的相关寄存器信息在《Cortex-M3 内核编程手册》 -4.3.11:NVIC 寄存器映射中找到。同时关于 NVIC 的一些声明在 core_cm3.h 末尾中可以找到一些函数用来配置 NVIC。

下面是 NVIC 的结构体

typedef struct {
  uint8_t NVIC_IRQChannel; // 中断源
  uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占优先级
  uint8_t NVIC_IRQChannelSubPriority; // 子优先级
  FunctionalState NVIC_IRQChannelCmd; // 中断使能或者失能
  } NVIC_InitTypeDef;

我们需要做的就是把这个结构体配置好并调用 NVIC_Init(&NVIC_InitStructure); 配置好即可。

  1. 首先配置中断源,这个参数在 stm32f10x.h 中有对应的宏只需要查找即可,不同的外设中断对应不同的中断源。
  2. 之后配置两个优先级,在配置这个之前要先使用 NVIC_SetPriorityGrouping(uint32_t PriorityGroup) 来配置对应的优先级组,之后在配置这两个参数。
  3. 最后要使能这个中断。
  4. 调用 NVIC_Init(&NVIC_InitStructure); 配置好即可。

EXTI外设

EXTI(外部中断控制器)管理了20个中断线 / 事件线 ,可以实现对这20个线单独配置。
在使用EXTI的时候要开启对应IO的AFIO的时钟。

下面是EXTI的结构体:

typedef struct {
  uint32_t EXTI_Line; // 中断/事件线
  EXTIMode_TypeDef EXTI_Mode; // EXTI 模式
  EXTITrigger_TypeDef EXTI_Trigger; // 触发类型
  FunctionalState EXTI_LineCmd; // EXTI 使能
} EXTI_InitTypeDef;
  1. 中断/事件 线 相应的宏在 stm32f10x_exti.h 中可以找到,20条中断线中每个GPIO都有对应的线由 EXTI0 到EXTI15 都有, 还有另外4根用于特定的外设事件.
  2. 之后配置是事件还是中断,这个对应的宏也在 stm32f10x_exti.h 中
  3. EXTI 边沿触发事件,可选上升沿触发、下降 沿 触 发 或 者 上 升 沿 和 下 降 沿 都 触 发
  4. 之后使能EXTI
  5. 使用EXTI_Init()实现配置即可

中断服务函数

中断服务函数会统一写道 stm32f10xit.c 中,每个外设的中断函数名是有要求的,在启动文件中有对应的函数名,必须保持和这个名字相同,否则无法实现中断函数,同时IDE也不会报错。

其中可以使用 EXTI_GetITStatus 函数来检测是否有中断信号。
执行任务后需要调用EXTI_ClearITPendingBit 函数清除 EXTI 线的中断标志位。


你可能感兴趣的:(随手记)