shuiqinghan2012的个人空间 https://bbs.21ic.com/?875044 [收藏] [复制] [RSS]

日志

STM32中断学习

已有 282 次阅读2016-7-17 14:24 |系统分类:单片机

1.中断优先级管理
嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC)

CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。
STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。
STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个)


1.1中断管理方法
首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。
分组配置是在寄存器SCB->AIRCR中配置

参考如上的方式,3bit 可分为5个组,0~4,而当其分组号确定之后,对应的抢占式和响应优先级的数目也对应的已经确定了。

比如分组2,,对应于2bit抢占式优先级和2bit响应优先级,因此对应的抢占式优先级必须在0~3,同理响应优先级也是0~3.

1.2抢占优先级 & 响应优先级区别:

高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的

抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

抢占优先级相同的中断,即:响应优先级:当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。

如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

以上说明:只要符合中断分组方式,只需要注意对应的抢占式和响应的优先顺序,如果是同一个等级,可分配抢占式和响应优先级相同。

NVIC_InitTypeDef NVIC_InitStructure; 

        /* Configure the NVIC Preemption Priority Bits */  

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

       

        /* Enable the USARTy Interrupt */

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;         

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

       

        NVIC_Init(&NVIC_InitStructure);


2.中断优先级设置步骤

1.系统运行后先设置中断优先级分组。调用函数:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
 整个系统执行过程中,只设置一次中断分组。
②针对每个中断,设置对应的抢占优先级和响应优先级:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
③ 如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。

3.外部中断的一般配置步骤:
3.1初始化IO口为输入。
       GPIO_Init();
3.2  开启IO口复用时钟。
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
3.3设置IO口与中断线的映射关系。
        void GPIO_EXTILineConfig();
3.4初始化线上中断,设置触发条件等。
       EXTI_Init();
3.5配置中断分组(NVIC),并使能中断。
       NVIC_Init();
3.6 编写中断服务函数。
      EXTIx_IRQHandler();
3.7清除中断标志位 (在中断服务函数最后)
      EXTI_ClearITPendingBit();


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)