STM32 中断NVIC详解,配置及示例

这篇具有很好参考价值的文章主要介绍了STM32 中断NVIC详解,配置及示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        NVIC全称 Nested Vectored Controller 嵌套向量中断控制器

        它是一种硬件设备,用于管理和协调处理器的中断请求。NVIC可以管理多个中断请求,并按优先级处理它们。当一个中断请求到达时,NVIC会确定其优先级并决定是否应该中断当前执行的程序,以便及时响应和处理该中断请求。

        它可以提高系统的响应速度和可靠性,尤其是在需要及时处理大量中断请求的实时应用程序中。NVIC通常集成在处理器中,可以使用特定的控制寄存器进行编程配置。在嵌入式系统中,程序员需要理解和使用NVIC以确保系统能够正确处理中断请求,同时提高系统的性能和可靠性。

       举个例子:当你在炒菜的时候,来了个电话,你停下炒菜,去接了个电话,然后再回来炒菜。停下炒菜,去接电话。这个过程就叫做中断。

        在STM32中有两个优先级的概念,每个中断源都需要指定这两种优先级。

  • 抢占优先级 Preemption Priority
  • 从优先级(响应优先级) Sub Priority

        其中高抢占优先级的中断可以嵌套低抢占优先级的中断。

        假设 X抢占优先级为,Y抢占优先级为,X响应优先级为,Y响应优先级位。

当时,中断和代码,先执行。

当时,若先到达,则先执行后执行。反之,先执行后执行。

若且时,根据它们在中断表中的排位顺序执行。

        可以使用STM32库函数中的NVIC_PriorityGroupConfig()选择优先级,函数的参数为NVIC_PriorityGroup_X

        EXTI(External Interrupt/event Controller)是外部中断/事件控制器。它提供了一种单向的、由外部事件触发的中断机制,可以用于响应外部信号的变化,例如按键、传感器、通信接口等外设的状态变化。EXTI模块可以配置为两种工作模式:事件中断和触发中断

        事件中断手头有上的事情做完了,再去执行中断。

        触发中断直接执行中断。

        所以中断请求的及时性比时间请求的及时性快。

        触发方式上升沿触发下降沿触发双边沿触发、以及低电平触发

        EXTI模块可以实现多种中断触发方式的支持,中断延时时间短,具有高精度的中断响应能力,并可以与其他外设操作结合使用,是STM32微控制器中实现外部中断的常用模块。

        我们看一下外部中断/时间线路映像图

nvic,stm32,嵌入式硬件,单片机,c++,c语言,经验分享,51单片机

        从中我们可以看到PA0/PB0/.../PG0——>EXTI0 ,PA1/PB1/.../PG1——>EXTI1,...,PA15/PB15/.../PG15——>EXTI15       

        在本示例用PA0按钮控制LED亮灭,所以等等配置EXTI_Line的时候就要用到EXTI_Line0

//1.配置NVIC

	NVIC_InitTypeDef NVIC_InitStructure;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitStructure.NVIC_IRQChannel =EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	
    NVIC_Init(&NVIC_InitStructure);

//2.配置PA0+PA0外部中断使能

	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);

//3.配置EXTI

	EXTI_InitTypeDef EXTI_InitSturcture;
	
	EXTI_InitSturcture.EXTI_Line = EXTI_Line0;
	EXTI_InitSturcture.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitSturcture.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitSturcture.EXTI_LineCmd = ENABLE;
	
	EXTI_Init(&EXTI_InitSturcture);

//4.开启PA0和PA0的复用功能的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

到这里PA0的配置就搞定了

void PA0_EXTI0_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitSturcture;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitStructure.NVIC_IRQChannel =EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	EXTI_InitSturcture.EXTI_Line = EXTI_Line0;
	EXTI_InitSturcture.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitSturcture.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitSturcture.EXTI_LineCmd = ENABLE;
	
	EXTI_Init(&EXTI_InitSturcture);
	
}

//5.配置LED

void Led_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

        根据中断表,当PA0配置成外部中断,只要PA0出现异常就会跳转到EXTI0_IRQHandler

        在STM32中,厂家已经把中断的主要部分都编写完了,我们只需要在stm32f103x_it.c中编写自己需要的中断即可。也可以放在自己想要的位置

void EXTI0_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line0)==SET)
	{
		GPIOA->ODR ^= GPIO_Pin_1;
        ClearITPendingBit(EXTI_Line0);
	}
}

        EXTI_GetITStatus判断中断是否触发,触发的话返回SET,没出发返回RESET       

        触发后翻转一次PA1的电平

        然后清除EXTI_GetITStatus,要不然你第一次按下PA0的按钮后,EXTI_GetITStatus返回SET,然后会一直触发中断文章来源地址https://www.toymoban.com/news/detail-770360.html

到了这里,关于STM32 中断NVIC详解,配置及示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 HAL库配置 NVIC Settings 作用

    tim 1 break interrupt and tim15 global interrupt tim 1 update interrupt and tim16 global interrupt tim1 trigger and commutation interrupt and tim17 global interrupt tim1 capture compare interrupt 这四个有什么用,具体怎么选择 这四个中断与TIM1定时器相关,具体作用如下: 1.TIM1 Break Interrupt(TIM1BRKIRQHandler)和TIM15 Globa

    2024年04月09日
    浏览(26)
  • Air32F103学习笔记-5.中断配置NVIC

    中断是单片机非常重要的功能,也是一个难点,本节单独讲下NVIC,以及NVIC的配置。 NVIC: Nested Vectored Interrupt Controller 内嵌向量中断控制器  是M3内核的一个外设 是用来总控中断的,例如中断优先级设置,中断使能等 下面看下《STM32F10xxx Cortex-M3编程手册-英文版》中关于NV

    2024年01月16日
    浏览(24)
  • 夜深人静学32系列10——GPIO中断/NVIC/EXTI/SYSCFG详解,外部中断控制LED

    上期我们学习了GPIO驱动数码管/蜂鸣器/LED和按键等外设,本期我们一起来学习STM32中断的相关内容 当CPU正在处理某个事件的时候,外界发生了紧急事件请求,CPU需要暂停当前的工作,转而去处理这个紧急事件,处理完之后,再次回到之前被中断的地方,继续执行原来的工作,

    2024年01月16日
    浏览(32)
  • STM32——关于NVIC讲解及标准库应用(基础篇)

            NVIC是指STM32中的中断控制器(Nested Vectored Interrupt Controller)。中断是STM32中的重要机制,通过中断可以实现异步事件处理。NVIC提供了灵活、高效、可扩展的中断处理机制,支持多级优先级、多向中断、嵌套向量中断等特性,是STM32中的重要组件。         当S

    2024年02月16日
    浏览(20)
  • STM32 hal库 NVIC初始化函数梳理

    使用的是stm32f407vg,代码来源stm32cubemx。 已经配置了中断的是GPIOD_pin6和TIM2。  这个是STM32CubeMX里面NVIC的控制面板;其中最上面priority grope是优先级组,我设置的是4位抢占优先级,0位响应优先级,就和以前刚学中断时中断嵌套那样。 下面是有哪些中断源,勾上之后,在最下面

    2024年01月18日
    浏览(35)
  • 【STM32】HAL库的RCC复位状态判断及NVIC系统软件复位

    【STM32】HAL库的RCC复位状态判断及NVIC系统软件复位 在实际开发中 有时候会遇到复位状态不同 导致结果不同的情况 比如在上电复位时 电压不稳定 可能导致一些外部芯片无法正常工作 从而导致进行了错误的操作流程 所以 可以在程序运行后 加一个复位状态判断 用来检测是否

    2024年02月02日
    浏览(34)
  • Cortex-M3/M4内核NVIC及HAL库函数详解(4):使用HAL库配置外部中断

    Keil uVision5 Cortex M3权威指南(中文) Cortex M3与M4权威指南 stm32f407的HAL库工程 STM32F4xx中文参考手册 前面我们已经熟悉了有关内核部分的寄存器配置,接下来我们结合stm32f407的GPIO外设,从实战角度进一步加深对这些寄存器的认识。 我们这里使用PA0作为输入引脚,可以看到SW1未按

    2024年01月24日
    浏览(36)
  • 【STM32】进阶(一):抢占式优先级和响应式优先级(NVIC_PriorityGroupConfig)

    【STM32】STM32单片机总目录 STM32(Cortex-M3)中每个中断源都有两级优先级:抢占式优先级(pre-emption priority)和子优先级(subpriority),子优先级也叫响应式优先级。 望文知义,就是优先级高的可以抢占优先级的中断。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断

    2024年02月12日
    浏览(43)
  • STM32的中断系统详解(嵌入式学习)

    中断是处理器中的一种机制,用于响应和处理突发事件或紧急事件。当发生中断时,当前正在执行的程序会被暂时中止,处理器会跳转到中断处理程序(也称为中断服务例程),对中断事件进行处理。处理完中断后,处理器再返回到被中断的程序继续执行。 中断可以分为内部

    2024年02月12日
    浏览(57)
  • Cortex-M3/M4内核NVIC及HAL库函数详解(2):HAL库中断底层函数实现

    Keil uVision5 Cortex M3权威指南(中文) Cortex M3与M4权威指南 stm32f407的HAL库工程 STM32F4xx中文参考手册 打开stm32f407的HAL库工程,可以在CMSIS-Include-core_cm4.h内找到有关NVIC寄存器设置的相关函数: 该函数操作步骤如下: (1)读取SCB-AIRCR旧值,保存到reg_value (2)将reg_value的bit31-16(访

    2024年01月20日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包