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

相关文章

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

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

SpringBoot嵌套事务详解及失效解决方案

《SpringBoot嵌套事务详解及失效解决方案》在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在SpringBoot中,如果嵌套事务的配置不当,可能会导致事务不生效的问题... 目录什么是嵌套事务?嵌套事务失效的原因核心问题:嵌套事务的解决方案方案一:将嵌套事务方法提取到独立类

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作