STM32F103中断嵌套为什么不成功,配置有问题吗

2019-07-21 08:58发布

#include "stm32f10x.h"
#include "delay.h"

#define LED0_ON()  GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define LED0_OFF() GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define LED1_ON()  GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define LED1_OFF() GPIO_SetBits(GPIOB,GPIO_Pin_15)

void GPIO_Config(void);
void NVIC_Config(void);
void EXTI_Config(void);
void EXTI2_IRQHandler(void);
void EXTI3_IRQHandler(void);

u8 i = 0;
int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        delay_init(72);  //初始化时钟
        GPIO_Config();
        NVIC_Config();
        EXTI_Config();
        EXTI2_IRQHandler();
        EXTI3_IRQHandler();
        LED0_OFF();
        LED1_OFF();
        while(1)
        {
               
        }
}

void GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_Initstruction;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);
        /*  LED0  LED1*/
        GPIO_Initstruction.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_15;
        GPIO_Initstruction.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Initstruction.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_Initstruction);
        /*  KEY2 KEY3  */
        GPIO_Initstruction.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;
        GPIO_Initstruction.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Initstruction.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOE, &GPIO_Initstruction);
}
void NVIC_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStruction;
       
        NVIC_InitStruction.NVIC_IRQChannel=EXTI2_IRQn;
        NVIC_InitStruction.NVIC_IRQChannelPreemptionPriority=0x01;
        NVIC_InitStruction.NVIC_IRQChannelSubPriority=0x01;
        NVIC_InitStruction.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruction);
       
        NVIC_InitStruction.NVIC_IRQChannel=EXTI3_IRQn;
        NVIC_InitStruction.NVIC_IRQChannelPreemptionPriority=0x01;
        NVIC_InitStruction.NVIC_IRQChannelSubPriority=0x03;
        NVIC_InitStruction.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruction);
}
void EXTI_Config(void)
{
        EXTI_InitTypeDef EXTI_InitStruction;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);
       
        EXTI_InitStruction.EXTI_Line=EXTI_Line2;
        EXTI_InitStruction.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruction.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStruction.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStruction);
       
        EXTI_InitStruction.EXTI_Line=EXTI_Line3;
        EXTI_InitStruction.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruction.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStruction.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStruction);
}

void EXTI2_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line2)!= RESET)
        {
                for(i=0;i<10;i++)
                {
                        LED0_ON();
                        delay_ms(500);
                        LED0_OFF();
                        delay_ms(500);
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line2);
}

void EXTI3_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line3)!= RESET)
        {
                for(i=0;i<10;i++)
                {
                        LED1_ON();
                        delay_ms(1000);
                        LED1_OFF();
                        delay_ms(1000);
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line3);
}
配置没问题,是不是还缺少东西,怎么优先级就是实现不了

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
qiuzhicheng
2019-07-21 10:46
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

NVIC_InitStruction.NVIC_IRQChannelPreemptionPriority=0x01; 抢占式优先级相同,中断不嵌套

一周热门 更多>