070中断管理

中断嵌套
中断等待

中断管理NVIC只管理中断,不对异常进行管理,异常只要开启相应异常功能或一些默认就可以存在打开的

对于中断函数而言:
(1)中断服务函数的函数名必须与中断向量表中的声明一致。
(2)中断服务函数可以编写在工程中的所有位置;
但是意法半导体已经为我们提供了stm32f10x_it.c文件作为存放中断函数。
推荐将中断服务函数编写在此处。
(3)切记!在中断函数当中不能存在延迟较长的事件处理或者认为。禁止在中断函数中使用延时。
(4)在工程中,中断资源是很宝贵的资源,通常用作很必要的事件通知和处理。不能滥用。


抢占优先级:优先级高打断抢占优先级低的中断执行
响应优先级:优先级高的无法打断正在进行的中断,但中断结束后会根据响应优先级的高低去执行相应中断(也     
                      就是处理正在等待的中断其抢占优先级相同的情况下如何处理中断)
在一个中断系统中,允许不同的中断的优先级(包括抢占式和响应式)相同。


以下都有默认优先级,除了其中三个异常外其余都可修改
中断和异常向量:异常的模式分类,关于系统内核带来的
中断和事件:中断类型,外部决定的
()对于中断优先级:它使用了一个整数来表示其优先级的高端。其中数字越小,优先级越高。
对于CPU或者MCU的外设而言,最高的优先级为0。还有三个高于普通优先级的特殊的不可设置的优先级

如果管理MCU的中断?
(1)对于Cortex-M系列的MCU而言,ARM提供了一个名为“嵌套向量中断控制器”的控制器来管理中断。
(2)嵌套向量中断控制器:Nested vectored interrupt controller ,简称为NVIC

中断优先级的分配:
Cortex-M3的优先级:
(1)在Cortex-M3内核中,使用了一个8bit的数据来表示优先级,并且包括抢占式优先级和响应式优先级。
(2)在Cortex-M3内核的中断系统中,可以不存在抢占式优先级,但是必须存在响应式优先级。
(3)STM32F1用4个位来分配优先级,以分组分配,抢占和相应都在这4个位里分组设置

中断向量表
和X86的一样一样,存放中断向量的位置,而向量又存储中断服务程序的地址,通过寻表来找到相应的中断服务程序,汇编定义在启动文件中(.s文件)


中断原理:
1.保存当前指令的地址,还有一些参数配置等,保护现场
2.进入中断向量表
3.找到并执行中断服务程序
4.恢复现场

中断函数的书写标准,所写的位置的约定俗成
中断服务函数一般写在it.c中,且函数名要对应中断向量表的中断名,一般在it.c都有,没有自己编写,函数名对应就可以
注意:中断服务程序的时间越短越好,太长容易CPU挂掉


********************************************************************************************************************************

中断号:中断号的定义顺序是一件中断向量表来定义的。
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */
  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */
  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */
  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */
  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */
  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */
  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */
  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */
  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
  USBWakeUp_IRQn              = 42,     /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */
  TIM8_BRK_IRQn               = 43,     /*!< TIM8 Break Interrupt                                 */
  TIM8_UP_IRQn                = 44,     /*!< TIM8 Update Interrupt                                */
  TIM8_TRG_COM_IRQn           = 45,     /*!< TIM8 Trigger and Commutation Interrupt               */
  TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                       */
  ADC3_IRQn                   = 47,     /*!< ADC3 global Interrupt                                */
  FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                */
  SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                */
  TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */
  SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */
  UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */
  UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */
  TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */
  TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */
  DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */
  DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */
  DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */
  DMA2_Channel4_5_IRQn        = 59      /*!< DMA2 Channel 4 and Channel 5 global Interrupt        */

*******************************************************************************************************************************

思路
1.基本配置好后,开启的外设的中断功能,使其相关外设中断所拥有的触发模式一旦触发就进入中断
   如USART:
   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART1->SR &= ~(1<<6);
//清空发送完的标志位,因为如果不清空则第一次就会发送数据会失效,因为默认是置一的,且1时会自动进入发送及其发送中断(如果有中断的话),导致第一次要发送的数据还没写完到寄存器就进入发送了。其能被软件置零,且每次被读取该位(也就是标志位检验函数读取该位时)会自定置零

USART_Cmd(USART1, ENABLE);
2.配置该外设所在的中断
NVIC_InitTypeDef NVIC_InitStructure; 
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先级配置的分组(注意,分组最好只分一次,后面是根据这个分组去对各个中断进行管理配置,如果想多次分组,则各个中断的管理配置需要重新配置)(最好单独拿出来)
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//赋值外设对应的中断  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//设置该中断抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7; //设置该中断响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断使能
NVIC_Init(&NVIC_InitStructure);//配置好后中断初始化
3.中断服务程序,自己编写
4.一些注意的标志位,有些中断是标志位置位进入中断的,如USART读数据寄存器有数据时从0被置1进入中断,而且不会自动清零,这种就有必要手动清零下次才能再进入中断,不然一直是1置不了再也进入不了




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值