NVIC中断管理

NVIC中断管理使用中断之前,第一步要了解的是其优先级管理,下面总结一下STM32NVIC的中断优先级管理。(正点原子系列)以smt32f103系列为例,其具有16个内核中断和60个可屏蔽中断。下面介绍其库函数的开发:MDK内与NVIC相关的寄存器包含在结构体中,通过创建结构体,配置其内部组成员也就是寄存器,来配置NVIC各个配置。先介绍其结构体的内部内容:在结构体内有介绍!中断配置寄存器[]内的…

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

使用中断之前,第一步要了解的是其优先级管理,下面总结一下STM32 NVIC的中断优先级管理。(正点原子系列)

以smt32f103系列为例,其具有16个内核中断和60个可屏蔽中断。
下面介绍其库函数的开发:

MDK内与NVIC相关的寄存器包含在结构体中,通过创建结构体,配置其内部组成员也就是寄存器,来配置NVIC各个配置。

先介绍其结构体的内部内容:在结构体内有介绍!

中断配置寄存器

[ ]内的8表示有8个这样的寄存器!

typedef struct
{
//[ ]内8表示有8个寄存器,每个都是32位,总计256个位,每个位控制一个中断,最高支持256个!
// offest 表示地址
  __IO uint32_t ISER[8];                      /*!< Offset: 0x000  打开中断的使能寄存器           */
       uint32_t RESERVED0[24];                                   
  __IO uint32_t ICER[8];                      /*!< Offset: 0x080  清除的中断使能的寄存器         */
       uint32_t RSERVED1[24];                                    
  __IO uint32_t ISPR[8];                      /*!< Offset: 0x100   把中断挂起的寄存器(就是暂停现在的中断放到一边,执行同级或者更高的中断)         */
       uint32_t RESERVED2[24];                                   
  __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  关闭中断挂起        */
       uint32_t RESERVED3[24];                                   
  __IO uint32_t IABR[8];                      /*!< Offset: 0x200  中断标志位,对应位为1则表示对应中断正在执行,为0则未执行,中断执行完成后自动置0        */
       uint32_t RESERVED4[56];                                   
  __IO uint8_t  IP[240];                      /*!< Offset: 0x300  240个8位寄存器组成,配置240个可屏蔽中断,8位长度,只使用了高4位,用来配置抢占优先级和子优先级,两者分别占一定的长度来配置,具体长度由SCB->AIRCR的中断分组来确定 */
       uint32_t RESERVED5[644];                                  
  __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */
}  NVIC_Type;

中断分组:

将中断分为5组,每组有对应的抢占优先级和子优先级。
由寄存器SCB->AIRCR寄存器的位8-10来定义的!具体配置参考下图:
在这里插入图片描述
关于优先级,注意一下两点:
这里需要注意两点:第一,如果个中断的抢占优先级和响应都是样话则看哪个中断先发生就先执行;第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

以上就是原理的一点总结了,下面到使用中断时库函数的配置:

配置中断三步走:
第一!分组配置优先级在AIRCR中的分配位数!
第二!配置结构体内需要用到的成员 、什么中断 、什么抢占优先级、 什么子优先级 、是否使能 !
第三!将结构体首地址传入,装载配置!

分组

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
//IS_NVIC_PRIORITY_GROUP详解
#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \
                                       ((GROUP) == NVIC_PriorityGroup_1) || \
                                       ((GROUP) == NVIC_PriorityGroup_2) || \
                                       ((GROUP) == NVIC_PriorityGroup_3) || \
                                       ((GROUP) == NVIC_PriorityGroup_4))

中断的分组直接通过void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)传参传入NVIC_PriorityGroup_X对应的值就行。

配置

通过结构体配置(如下)
typedef struct
{

uint8_t NVIC_IRQChannel; /* 定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到 每个中断对应的名字。例如 USART1_IRQn*/

uint8_t NVIC_IRQChannelPreemptionPriority; /定义这个中断的抢占优先级别。/

uint8_t NVIC_IRQChannelSubPriority; /* 定义这个中断的子优先级别。*/

FunctionalState NVIC_IRQChannelCmd; /*该中断是否使能 */
} NVIC_InitTypeDef;

传入参数

通过下面函数传址,把配置的结构体传入寄存器中,
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

样例:

比如我们要使能串口 1 的中断,同时设置抢占优先级为 1,子优先级位 2,初始化的方法是(分组省去):

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ; // 抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 子优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器

OVER!

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

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

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


相关推荐

  • mysql字符串和数字的互相转换

    mysql字符串和数字的互相转换1.最简单的方式就是直接在字符串后面+0,就相当于直接把字符串转为数字类型了,下面可以看一下具体的操作,可以看到通过+0操作,成功将两个字符串转化为了数字,并得到了相加后的结果。2.使用CAST()函数,使用方式为CAST(valueAStype);,下面可以看一下具体的操作例子,通过如下sql语句查看结果:SELECTCAST(‘5.45’ASSIGNED);…

    2022年5月30日
    49
  • 【其他】资源整合「建议收藏」

    【其他】资源整合「建议收藏」偶然整理云盘,发现曾经收藏过一些比较不错的资源,正好分享一下;1.C语言教程,郝斌老师作为读书时候的启蒙老师,推荐一波链接:https://pan.baidu.com/s/1rn_cHgNs5qIZV9ON-pcWVw提取码:wa7j2.UI框架链接:https://pan.baidu.com/s/1Q2Bj-i79C1gDWZSvfDVEeQ提取码:a47l3.UI万能框架链接:https://pan.baidu.com/s/1Ikvqo9mtabD104bWVLte2w…

    2022年5月22日
    50
  • 显卡三重缓冲

    显卡三重缓冲显卡三重缓冲是解决显示器刷新率不足的问题的方案。

    2022年5月22日
    40
  • 【JAVA】Java学习路线图「建议收藏」

    【JAVA】Java学习路线图「建议收藏」怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西:    首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA)。J2SE,Java2PlatformStandardEdition,我们经常说到的JDK,就主要指的这个,它是三者的基础,属于桌面级应用开发,这部分如果学得好很容易拓展J2EE和J2ME。

    2022年5月15日
    31
  • heels(redflagdeals)

    Shewaschosenbeingonewiththe50beautiesinmagazine.There’salwaysasoundtrackandcameramaninsidemy…

    2022年4月16日
    55
  • 两个div在同一行,两个div不换行「建议收藏」

    两个div在同一行,两个div不换行

    2022年1月18日
    43

发表回复

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

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