070中断管理

来源:互联网 发布:13.3寸mac高清壁纸 编辑:程序博客网 时间:2024/06/05 01:13
中断嵌套
中断等待

中断管理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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚怀孕长了疱疹怎么办 吃完饭恶心想吐怎么办 减肥药吃了心慌怎么办 吃多了恶心想吐怎么办 想吐怎么办最快最有效 想吐又吐不出来怎么办 3岁宝宝反胃呕吐怎么办 2岁宝宝反胃呕吐怎么办 突然恶心想吐是怎么办 孕4个月反胃呕吐怎么办 怀孕2月反应大怎么办 狗吐拉稀不吃饭怎么办 狗狗咳喘怎么办最有效 半永久纹眉失败怎么办 纹的眉毛太细了怎么办 眉毛颜色做深了怎么办 半永久眼线不掉怎么办 移植9天来月经怎么办 月经迟迟不来该怎么办 lol晋级赛输了怎么办 激素正常的多囊怎么办 右侧输卵管通而不畅怎么办 小该咳嗽老不好怎么办 孩子吓着了怎么办最快 2个月宝宝吓到了怎么办 3个月宝宝吓到了怎么办 宝宝吓着了发烧怎么办 好几个月不遗精怎么办 孕妇吃了黑橄榄怎么办 内膜4mm来月经了怎么办 吃了伟哥没效果怎么办 维a酸乳膏副作用怎么办 颈椎病引起的头晕恶心怎么办 经常头疼怎么办最快最有效 感昌了头晕乏力怎么办 来例假喝啤酒了怎么办 来月经喝啤酒了怎么办 吃的油腻长痘怎么办 兔子拉黑色稀便怎么办 宝宝补钙便秘了怎么办 吃了肾宝片上火怎么办