STM32外部中断用一根中断线怎样配置两个中断口,优先级设置

2019-07-14 23:52发布

大侠在哪儿呢?请问一下下面这个程序怎样设置优先级呢?怎样就能用一根中断线配置两个中断口,中断服务程序怎么写啊, 求大神指导啊,
************************************************************************/


#include "STM32f10x.h"
#include "string.h"



/***********************************************************************

         外设时钟使能


************************************************************************/
void RCC_Configuration(void)
{        
          /*  使能外设时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO |
                                                   RCC_APB2Periph_GPIOA  | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
                                                   RCC_APB2Periph_GPIOD  | RCC_APB2Periph_GPIOE, ENABLE);
  
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}

/*******************************************************************************
      
        全部用到的引脚将在在配置

*******************************************************************************/
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

//    /* 配置串口1引脚  */
//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//    GPIO_Init(GPIOA, &GPIO_InitStructure);

//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//    GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        /*外部中断引脚*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOE, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
        /*LED*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);        
}                                 

/*******************************************************************************

        全部中断在此配置

*******************************************************************************/
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    /* Configure the NVIC Preemption Priority Bits */  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    /* Enable the USART1 Interrupt */
//    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//    NVIC_Init(&NVIC_InitStructure);

        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;        // S4中断入口
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

//        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;        // S3中断入口
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//    NVIC_Init(&NVIC_InitStructure);


        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

/*******************************************************************************

        外部中断在此配置

*******************************************************************************/
void EXTI_Configuration(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource13);          // S4中断
        EXTI_InitStructure.EXTI_Line = EXTI_Line13;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource13);          // S3中断
        EXTI_InitStructure.EXTI_Line = EXTI_Line13;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);


        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5);          // S3中断
        EXTI_InitStructure.EXTI_Line = EXTI_Line5;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

        //EXTI_GenerateSWInterrupt(EXTI_Line13);

}

/*******************************************************************************

        初始化时钟晶振 72MHZ

*******************************************************************************/
void SysClock_Init(void)
{
        ErrorStatus HSEStartUpStatus;     
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus == SUCCESS){
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
                FLASH_SetLatency(FLASH_Latency_2);
            RCC_HCLKConfig(RCC_SYSCLK_Div1);           
            RCC_PCLK2Config(RCC_HCLK_Div1);         
            RCC_PCLK1Config(RCC_HCLK_Div2);        
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);        
            RCC_PLLCmd(ENABLE);        
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){
                    ;
                }        
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);        
            while(RCC_GetSYSCLKSource() != 0x08){
                    ;
                }
        }
}

/*****************************************************************

          USART1 初始化 baud 波特率


*****************************************************************/
void USART1_Init(unsigned int baud)
{
    USART_InitTypeDef USART_InitStructure;

    USART_InitStructure.USART_BaudRate = baud;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1, ENABLE);
}

/*****************************************************************

          从 USART1 发送一个字节

*****************************************************************/
void USART1_SendByte(unsigned char temp)
{
    USART_SendData(USART1, temp);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

/*****************************************************************

          从 USART1 发送字符串

*****************************************************************/
void USART1_Printf(char *pch)
{
    while(*pch != ''){
        USART1_SendByte(*(unsigned char *)pch);
        pch++;
    }
}

/******************************************
*
*             延时程序 ms
*
****************************************/
void Delay(unsigned short time)
{
    unsigned short i, j;
        
        for(; time > 0; time--){
            for(j = 0; j < 10; j++){
                    for(i = 0; i < 1000; i++);
                }
        }

}


/*******************************************************

                MAIN 函数

*******************************************************/
int main(void)
{        

         
    SysClock_Init();                 // 初始化系统时钟 72MHZ
        RCC_Configuration();         //        使能外设
        GPIO_Configuration();         //        配置引脚
        NVIC_Configuration();         // 配置中断
        EXTI_Configuration();
//        USART1_Init(9600);                 // 配置串口1,波特率9600
//   
//        USART1_Printf("火牛开发板基础实验");

        
        while(1){
            ;                                   
        }
    // return(0);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。