微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32外部中断用一根中断线怎样配置两个中断口,优先级设置

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

时间:10-02 整理:3721RD 点击:
大侠在哪儿呢?请问一下下面这个程序怎样设置优先级呢?怎样就能用一根中断线配置两个中断口,中断服务程序怎么写啊, 求大神指导啊,
************************************************************************/

#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);
}

优先级在nvic的结构体成员里面赋值就可以了。
学习不能太浮躁,要好好看手册及一些学习资料,不要上来就改程序,因为你对很多概念都不清楚。

xxxxxxxxxxxxxxxxxxxbbbbbbbbbbbbbbbbbb

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top