嵌入式接口之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模板库函数的一些解释的主要内容,如果未能解决你的问题,请参考以下文章