我的stm32学习之旅 点击:674 | 回复:0



fuqing5542

    
发表于:2012-06-26 15:05:27
楼主

虽然现在工作中主要使用的是51系列单片,看到STM32发展如此快,就买了一个板子开始学习,没有自己想的那么简单,只能下班回来学习,有时一个问题自己得琢磨好几晚上才解决,今晚猛然想,何不在一个论坛把自己遇到的问题写出来,看了一下几个论坛,最终绝地写在这个论坛上,学习STM32已经有段时间了,期间遇到好多问题,今晚就先写一下今晚碰到的问题,想到什么就写什么。
  1  对NVIC的理解
      CM3支持硬件中断嵌套,分为抢占式优先级和亚优先级,使用规则主要有,抢占优先级高级别的可以打断低级别的,同一级别的抢占优先级同时发生时,亚当优先级高的先发生中断,若是相同,则按硬件排列顺序发生。若是有一个亚优先级正在执行中断,同一级别的其它亚优先级发生时,则先挂起,等此中断执行完再执行!
     从库函数中找到优先级分组模式:
#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /* 0 bits for pre-emption priority
                                                          4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /* 1 bits for pre-emption priority
                                                          3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /* 2 bits for pre-emption priority
                                                          2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /* 3 bits for pre-emption priority
                                                          1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /* 4 bits for pre-emption priority
                                                          0 bits for subpriority */
从中可以看出第一组只有一个级别,16个亚优先级,我可以这样理解,若是分配成这个组里,不能发生嵌套中断,同时发生中断时,亚优先级高的先发生,若有中断执行时,必须等中断执行完才能执行下一个中断。最后一组正好相反,有15个级别,若是执行一个中断,可以最多嵌套15个中断执行一个中断。看下面的例子:
  NVIC_InitTypeDef    NVIC_InitStructure;  //定义中断初始化类型结构体变量
 
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   //配置优先级分组1 2个两个抢占优先级 8个亚优先级
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //开口外部中断0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置0号抢占式优先级 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//亚优先级配置为0号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //开口外部中断5到9
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置

  NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //ADC1中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置

从上面的配置来看,外部中断0的优先级最高,可以打断ADC和外部5到9的中断,也就说可以嵌套发生,当ADC中断和外部5到9中断同时发生时,它们的抢占优先级别相同,亚优先级别也相同,因为ADC1硬件排在更靠前,则先发生ADC中断,若是两者任何一个中断正在执行,则等此中断执行完,再去执行另一个中断。
详细可以联系940436962



楼主最近还看过

SSI ļʱ