8. 嵌套向量中断控制器NVIC

2023-12-02 17:18

本文主要是介绍8. 嵌套向量中断控制器NVIC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

8. 嵌套向量中断控制器NVIC

  8.1 NVIC简介

  8.2 EXTI中断

  8.3 USART中断

  8.4 TIM中断

  8.5 ADC中断

  8.1 NVIC简介

  • 接口数据传送控制方式有查询、中断和DMA等,中断是重要的接口数据传送控制方式
  • STM32中断控制分为全局和局部2级,全局中断由NVIC控制,局部中断由设备控制
  • NVIC支持多个内部异常和多达240个外部中断。从广义上讲,异常和中断都是暂停正在执行的程序转去执行异常或中断处理程序,然后再返回原来的程序继续执行。从狭义上讲,异常由内部事件引起,而中断由外部硬件产生
  • 异常和中断的处理与子程序调用有相似之处,但也有本质下列区别:
  • (1)什么时候调用子程序是确定的,而什么时候产生异常和中断是不确定的
  • (2)子程序的起始地址由调用程序给出,而异常和中断程序的起始地址存放在地址表中
  • (3)子程序的执行一般是无条件的,而异常和中断处理程序的执行要先使能
  • STM32异常和中断(异常)

  • STM32异常和中断(中断)

  • NVIC通过6种寄存器对中断进行管理

  • STM32支持16个中断优先级,使用8位中断优先级设置的高4位,并分为抢占优先级和响应优先级,抢占优先级在前,响应优先级在后,具体位数分配通过应用程序中断及复位控制寄存器AIRCR的优先级分组PRIGROUP位段(AIRCR[10:8])设置

  • 抢占优先级高(数值小)的中断可以中断抢占优先级低(数值大)的中断,而响应优先级高的中断不能中断响应优先级低的中断

 

8.2 EXTI

  • 每个配置为输入方式的GPIO引脚都可以配置成外部中断/事件方式EXTI
  • 每个中断/事件都有独立的触发和屏蔽,触发请求可以是上升沿、下降沿或者双边沿触发

  • 每个外部中断都有对应的悬起标志,系统可以查询悬起标志响应触发请求,也可以在中断允许时以中断方式响应触发请求

  • 系统默认的外部中断输入线EXTI0-15是PA0-15,可以通过AFIO的EXTI控制寄存器(AFIO_EXTICR1-4)配置成其他GPIO引脚(访问EXTI控制寄存器时必须先使能AFIO时钟)

  • 另外四个EXTI线的连接方式为:

        EXTI16连接到PVD中断

        EXTI17连接到RTC闹钟中断

        EXTI18连接到USB唤醒中断

        EXTI19连接到以太网唤醒中断

  • EXTI通过6个寄存器进行操作

  • EXTI的2级中断控制

  • 按键中断初始化程序段
RCC->APB2ENR |= 1;             //开启AFIO时钟AFIO->EXTICR[2] |= 0x0011;     //EXTI9=PB.9,EXTI8=PB.8EXTI->IMR |= 0x0300;           //允许EXTI9和EXTI8中断EXTI->FTSR |= 0x0300;          //EXTI9和EXTI8下降沿触发NVIC->ISER[0] |= 1<<23;        //允许EXTI9-8中断
  • 按键中断处理子程序
void EXTI9_5_IRQHandler(void)
{if(EXTI->PR & 1<<8 )         //KEY1按下(PR.8=1)flag = 0;if(EXTI->PR & 1<<9 )         //KEY2按下(PR.9=1)flag = 1;EXTI->PR |= 0x0300;         //清除中断触发请求
}
  • 对比按键处理的查询和中断实现方法可以看出:中断实现方法的初始化子程序有些复杂
  • 处理子程序的主要区别是:查询处理Key_Proc()判断的是GPIOB->IDR(电平),中断处理EXTI9_5_IRQHandler()判断的是EXTI->PR(边沿)

 

8.3 USART中断

  • USART的2级中断控制

  • USART中断初始化程序段
USART->CR1 |= 1<<5;         //允许RXNE中断NVIC->ISER[1] |= 1<<5;      //允许USART1全局中断
  • USART中断处理子程序
void USART1_IRQHandler(void)

 

8.4 TIM中断

  • TIM的2级中断控制

  • TIM1中断初始化程序段
TIM1->DIER |= 1;             //允许更新中断NVIC->ISER[0] |= 1<<25;      //允许TIM1更新中断
  • TIM1中断处理子程序
void TIM1_UP_IRQHandler(void)
  • TIM2中断初始化程序段
TIM2->DIER |= 6;             //允许捕获/比较2-1中断NVIC->ISER[0] |= 1<<28;      //允许TIM2全局中断
  • TIM2中断处理子程序
void TIM2_IRQHandler(void)

 

8.5 ADC中断

  • ADC的2级中断控制

  • ADC中断初始化程序段
ADC1->CR1 |= 1<<5;             //允许转换结束中断ADC1->CR1 |= 1<<7;             //允许注入通道转换结束中断NVIC->ISER[0] |= 1<<18;        //允许ADC1和ADC2全局中断
  • ADC中断处理子程序
void ADC_IRQHandler(void)

 

 

 

这篇关于8. 嵌套向量中断控制器NVIC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/446164

相关文章

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

python展开嵌套列表的多种方法

《python展开嵌套列表的多种方法》本文主要介绍了python展开嵌套列表的多种方法,包括for循环、列表推导式和sum函数三种方法,具有一定的参考价值,感兴趣的可以了解一下... 目录一、嵌套列表格式二、嵌套列表展开方法(一)for循环(1)for循环+append()(2)for循环+pyPhWiFd

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4