嵌入式接口之EXTI与NVIC的STM32模板库函数的一些解释

Posted Icy Hunter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式接口之EXTI与NVIC的STM32模板库函数的一些解释相关的知识,希望对你有一定的参考价值。

文章目录

前言

嵌入式其实还有中断实验和AD转换实验需要复习,但是老师PPT里说他的实验代码除了教学不可用于其他用途,再加上可能也没时间写完整的实验的博客了,那就简单讲讲函数库,能够让一些代码变得看起来顺眼一点。

STM32的中断

计算机离不开中断,STM32中断功能主要由NVIC(嵌套向量中断控制器)完成。其中中断分为硬中断和软中断。

硬请求信号来自ARM核CM3的外面,来自MCU片上各种接口和MCU片外扩展的外设接口,产生时刻与CM3的工作时钟异步,在CM3中它们被称为“中断”

软中断是因ARM核CM3的活动而产生的,即在执行指令或访问存储器时产生的,因此对CM3来说是与工作时钟同步的,在CM3中它们被称为“异常”

在STM32中,把所有能打断正常执行流的事件都称为异常,不严格区别到底是外部中断还是内部异常。

下面是STM32关于中断硬件设备的结构层次图。

下面讲解一些模板库中的函数的一些参数

EXTI

STM32中有一个片外中断接口EXTI用来代理19路中断源向NVIC的中断请求(芯片外设备中断需要经EXTI和NVIC二级管理,即芯片外设备须通过某个外中断请求引脚EXTIi(i=0~15)向EXTI请求中断,EXTI再向NVIC请求中断)

EXTI_InitTypeDef

定义了EXTI的结构体,其中包含了4个参数,分别用于设置外部线路、被使能的模式、触发边沿和线路状态

EXTI_Line

EXTI_Line 用于设置外部线路,取值如下:

0-15是对GPIO口的每个引脚的中断设置,16、17、18分别对应PVD、RTC、USB。

EXTI_Mode

EXTI_Mode用于设置被使能线路的模式,取值如下:

EXTI_Trigger

EXTI_Trigger设置了被使能线路的触发边沿,取值如下:

下降沿就是从高电平向低电平跳变,上升沿就是从低电平向高电平的跳变。

EXTI_LineCmd

EXTI_LineCmd 用来定义选中线路的新状态。它可以被设为 ENABLE 或者 DISABLE。

EXTI_Init

用于初始化设置好的EXTI_InitTypeDef的结构体。

EXTI_ClearITPendingBit

用于清除中断挂起位。

GPIO_EXTILineConfig

这个函数将GPIO管脚连接到指端外设线,使得GPIO能够引发中断

初始化一个GPIO的EXTI

//PE8转接EXTI8片外中断请求线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
//定义一个EXTI结构体
EXTI_InitTypeDef EXTI_InitStructure;
//使用外部中断线4
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
//中断请求
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//下降沿
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//使能线路
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//初始化对应中断外设
EXTI_Init(&EXTI_InitStructure);

这样我们就能够初始化一个用PE4中断使能外部线4,并且获得下降沿时才响应的中断。

NVIC

EXTI主要负责请求中断,STM32中断功能主要由NVIC(嵌套向量中断控制器)完成,因此我们还需要配置NVIC才能完成整个中断的过程。

NVIC_Init

用于初始化NVIC寄存器。

NVIC_InitTypeDef

用于定义NVIC的初始化结构体。

NVIC_IRQChannel

该参数用以使能或者失能指定的 IRQ 通道。



EXTI的请求使用外部中断线0-4响应即可。

NVIC_IRQChannelPreemptionPriority

该参数设置了成员 NVIC_IRQChannel 中的先占优先级

NVIC_IRQChannelSubPriority

该参数设置了成员 NVIC_IRQChannel 中的从优先级

NVIC_PriorityGroupConfig

能够设置优先级分组。

NVIC_IRQChannelCmd

该参数指定了在成员 NVIC_IRQChannel 中定义的 IRQ 通道被使能还是失能。这个参数取值为 ENABLE 或者 DISABLE

完成NVIC中外部中断EXTI4片外中断的初始化

//定义NVIC初始化结构体
NVIC_InitTypeDef NVIC_InitStructure;
//设置优先级分组为2
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//外部中断EXTI4_IRQn
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
//子优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
//使能外部中断
NVIC_InitStructure.NVIC_IRQChannelCmd - ENABLE;
//初始化NVIC
NVIC_Init(&NVIC_InitStructure);

//初始化NVIC后只需要再编写好对应的中断服务程序,就能完成整个中断的过程了
void EXTI4_IRQHandler(void)
xxx... //自己编写的中断服务程序
EXTI_ClearITPendingBit(EXTI_Line4);//需要及时清除中断标志位,防止一直响应中断


结语

以上就是关于EXTI以及NVIC在STM32模板库中的一些用法,GPIO连接EXTI然后向NVIC发送中断请求以及响应中断的整个过程也有了一定的认识。

以上是关于嵌入式接口之EXTI与NVIC的STM32模板库函数的一些解释的主要内容,如果未能解决你的问题,请参考以下文章

STM32中EXTI和NVIC的关系

stm32库函数算hal层吗

第17章 EXTI—外部中断/事件控制器

STM32 NVIC配置详解

GD32F103学习笔记——EXTI(外部中断)接口使用

GD32F103学习笔记——EXTI(外部中断)接口使用