NVIC的使用[通俗易懂]

NVIC的使用[通俗易懂]NVIC相关内容中断编程的四个部分——1.使能中断请求;2.配置中断优先级分组(一个项目中只需要配置一次)3.配置NVIC寄存器,初始化NVIC_InitTypeDef;4.编写中断服务函数。中断过程的三个部分——1.配置NVIC_Config()函数:NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。因此控制中断的进行与NVIC_Config函数的配置密切相关。2.配置EXTI_Config()函数:3.编写中断服务函数:…

大家好,又见面了,我是你们的朋友全栈君。

NVIC相关内容(补充)

中断编程的三个部分——
1.配置NVIC_Config()函数
NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。因此控制中断的进行与NVIC_Config函数的配置密切相关。
2.配置EXTI_Config()函数
EXIT(External interrupt/event controller):外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。 EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
(开启相应GPIO的时钟,初始化要与EXIT相连的GPIO(配置EXIT并连接GPIO引脚),初始化GPIO外设,配置中断/事件线。)

3.编写中断服务函数
中断并不是程序一开始就判断好会在那里发生,或者会在什么时候发生。中断发生的完全是随机的,中断源连接到硬件,由硬件来产生触发中断
中断只做了两件事,就是获取中断类型,然后加入队列中,其余复杂的程序处理都在主函数中完成
中断服务函数的重点就是要判断某个中断是否发生以及发生后清除某个标志位(退出中断前要清楚中断标志位,否则在退出中断后,标志位没有清除。会再一次进入中断)

一.

寄存器SCB—AIRCR的8—10位共三位可设置值来表明中断优先级分组,具体分组情况参考上一笔记中表格
对于每一个中断都有一个IP寄存器,它的4—7位共四位来给其设置该组的抢占优先级和响应优先级(分组情况和优先级分配是一一对应的,意思是设置了该组,则其优先级就是该组对应的唯一优先级分配,具体对应参照上一笔记分组)。如果两个中断的两个优先级都是一样的,则哪个中断先发生就先执行。对于上一个笔记所说的分组配置,一般通过NVIC_PriorityGroupConfig(uint32_t NVIC_Priority)函数,通过配置SCB—AIRCR寄存器来配置(入口参数范围是NVIC_PriorityGroup0——NVICPriorityGroup4)
注:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

与上一笔记分组对应的5组配置在这里插入图片描述

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
//设置中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
// 指定抢占式优先级别1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
// 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//设置中断使能(或失能)

中断设置相关寄存器
__IO uint8_t IP[240];//中断优先级控制的寄存器组
__IO uint32_t ISER[8];//中断使能寄存器组
__IO uint32_t ICER[8];//中断失能寄存器组
__IO uint32_t ISPR[8];//中断挂起寄存器组,可挂起正在执行的中断
__IO uint32_t ICPR[8];//中断解挂寄存器组,可解除被挂起的中断
__IO uint32_t IABR[8];//中断激活标志位寄存器组,可读取该寄存器正在执行的中断是什么,只读

各寄存器配置及作用在这里插入图片描述
分清IP与IPR
(IPR)中断优先级寄存器为60个32位寄存器,st的结构体中用了240个8位的字节数组NVIC->IP[240]来映射,每一个对应一个中断的优先级
在这里插入图片描述

下图为配置函数结构体在这里插入图片描述

NVIC_InitTypeDef结构体,第一个成员变量用来确定需要使用的中断是哪一个中断响应函数接口(或通道)(82个外部中断向量表中选取),第二个成员变量是用来设置抢占优先级,第三个成员变量是用来设置响应优先级,第四个成员变量是用来使能这个通道(IRQ是中断请求的简称,因此第四成员变量也是指中断入口地址)

二.

配置EXTI的初始化结构体,结构体如下:

typedef struct 
{ 
   
     uint32_t EXTI_Line; // 中断/事件线
     EXTIMode_TypeDef EXTI_Mode; // EXTI 模式
     EXTITrigger_TypeDef EXTI_Trigger; // 触发类型
     FunctionalState EXTI_LineCmd; // EXTI 使能
 } EXTI_InitTypeDef;

配置此结构体主要是:选择相应的EXTI线、选择触发模式、选择产生的结果(中断还是事件)、是否使能EXTI线。
EXTI_Line:中断线选择,可选 EXTI_0 至 EXTI_19(一共20个)。既然刚才配置好了与GPIO引脚对应的EXTI线,所以初始化结构体中的EXTI线就是与GPIO连接的那个线。
EXTI_Mode: EXTI 模式选择,可选为产生中断或者产生事件。就是决定信号的发展方向,是产生中断呢?还是产生事件呢?此处是中断。
EXTI_Trigger: EXTI 边沿触发模式,可选上升沿触发、下降沿触发或者上升沿和下降沿都触发触发信号。
EXTI_LineCmd:控制是否使能 EXTI 线,可选使能 EXTI 线或禁用。
初始化结构体配置完毕后交由初始化函数写入相应的寄存器中。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140486.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 百度竞价点击(商盾)研究

    百度竞价点击(商盾)研究今天写个比较详细的说明,也参考了大量这方面的资料进行的总结,算是给大家一个长见识,写的不好的地方,希望大家多多指教!感谢吾爱朋友的支持!移动广告平台都有各自的检测点击欺诈的机制,通过各种维度(包括I

    2022年7月2日
    27
  • Java安全之Commons Collections3分析

    Java安全之CommonsCollections3分析文章首发:Java安全之CommonsCollections3分析0x00前言在学习完成前面的CC1链和CC2链后,其实再来看CC3

    2021年12月12日
    39
  • 编程语言难度排名_最难学的七大编程语言,VB 第一,Python垫底,看你学的排第几…

    在很多人眼里程序员的标配就是黑框眼镜+格子衫+双肩包+牛仔裤+运动鞋,拥有了这些可能就被判定为一个程序员。而如何判定一个程序员的工作年限,那就需要从他的头发浓密度上去判断,如果头发过于浓密,说明是初级程序员,如果秃顶了,可能是高级程序员。嗯?程序员的头发浓密不是应该和编程语言的难易程度相关吗?像我这种在面对数学难题的时候总是喜欢拽头发,导致我的发量变少了。01最难学的七大编程语言众所周知,编程界有…

    2022年4月4日
    2.5K
  • pytest指定用例_文件夹排列顺序自定义

    pytest指定用例_文件夹排列顺序自定义前言测试用例在设计的时候,我们一般要求不要有先后顺序,用例是可以打乱了执行的,这样才能达到测试的效果.有些同学在写用例的时候,用例写了先后顺序,有先后顺序后,后面还会有新的问题(如:上个用例返回

    2022年7月29日
    0
  • 多台路由器堆叠_h3c路由器堆叠配置命令[通俗易懂]

    多台路由器堆叠_h3c路由器堆叠配置命令[通俗易懂]本次网络的拓扑结构是三台交换机连接到一起,依次为A交换机,B交换机和C交换机。交换机A是主交换机,他通过G1/1接口连接B交换机的G1/1接口,通过G2/1连接C交换机的G1/1。所有G端口都设置为VLAN100。这个A交换机作为主交换机完全是网络管理员自己选择的,实际上我们可以随意的将ABC中的任何一个选择为主交换机,大家根据实际情况选择即可。IP地址与Trunk设置:首先将网络的管理VLAN…

    2022年10月17日
    0
  • layer 弹出层全屏「建议收藏」

    layer 弹出层全屏「建议收藏」letindex=layer.open({title:”,type:1,shade:false,skin:’layui-layer-lan’,//加上边框content:$(‘#zgjzWrapper’),success:function(){},cancel:function(){.

    2022年7月13日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号