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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java 字符串包含_实现字符串的复制

    Java 字符串包含_实现字符串的复制1问题描述给定一长字符串A和一短字符串B。请问,如何最快地判断出短字符串B中的所有字符是否都在长字符串A中?请编写一个判断函数实现此功能。为简单起见,假设输入的字符串只包含小写英文字母。下面举几个例子。(1)如果字符串A是”abcd”,字符串B是”bad”,答案是包含,因为字符串B中的字母都在字符串A中,或者说B是A的真子集。(2)如果字符串A是”abcd”,字符串B是”bce”,答案是…

    2022年10月9日
    3
  • c语言bzero函数_hikaricp源码分析

    c语言bzero函数_hikaricp源码分析看《网络编程》,对bzero等函数的实现颇有兴趣,于是便翻看了其源代码的实现。bzero、bcopy、bcmp等函数源码如下:bzero源码:voidbzero(s1,n) void*s1; unsignedn;{ registerchar*t=s1; while(n!=0){ *t++=0; n–; }}bcopy源码如下:

    2022年10月13日
    6
  • python常见的数据类型有哪些?

    python常见的数据类型有哪些?变量用来存储数据,那么大家有没有想过,我们应该让变量占用多大空间,保存什么样的数据呢?在讲解变量的类型之前,我们先来看一个生活中的例子,例如,我们要运送一台电脑,大卡车和小轿车都可以完成,但是,如果使用大卡车运送一台电脑,显然有点小题大做,浪费了大卡车的空间,如图1所示。图一:卡车和轿车运输一台电脑同理,如果使用变量存储数据时,为了更充分利用内存空间,我们可以为变量指定不同的数据类型。Python中常见的数据类型如图2所示图二:Python变量数据类型图二中罗列了Python中常见的数据类型,下

    2022年6月4日
    30
  • freemarker自己定义标签报错(三)

    freemarker自己定义标签报错(三)

    2021年12月7日
    64
  • Java与C++的优劣:谁更胜一筹?

    Java与C++的优劣:谁更胜一筹?1.基础介绍Java与C++都拥有相当长的历史,且语法相当类似,并被众多业界巨头所采用。事实上,Java本来就是从C++衍生出来的。不过尽管相似,二者之间仍然存在显著区别。很多人都说会C++就能会快掌握Jave。C++是不好学,但是我告诉你java也不好学。C++难是难在语言本身,java难是难在各种框架和库。你单纯学个java语法,你什么玩意也做不了,java的东西都在java之外。

    2022年7月7日
    35
  • java线程池参数_java线程池参数设置原则,如何设置线程池参数比较合理?[通俗易懂]

    java线程池参数_java线程池参数设置原则,如何设置线程池参数比较合理?[通俗易懂]线程池的参数应该怎样设置呢?相信对于很多的人来说这也是一个比较难的问题,下面就让我们一起来解决一下,究竟应该如何设置线程池的参数才是最合理的吧!首先在设置参数的时候,有以下的几点是我们需要考虑到的!1、下游系统抗并发的能力多线程给下游系统造成的并发等于你设置的线程数例:假如,是多线程访问数据库,那么就得考虑数据库的连接池大小设置,数据库并发太多影响其qps,会将数据库打挂等问题。假如,是访问下游系…

    2022年5月3日
    50

发表回复

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

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