STM32F0:中断对EXTI1/EXTI2不点火,而EXTI4工作。 *混淆*

STM32F0:中断对EXTI1/EXTI2不点火,而EXTI4工作。 *混淆*

问题描述:

可以请你帮我在这里,告诉我什么,我做错了什么? EXTI1和EXTI2不会启动,而EXTI4却是完美无缺的。这不是硬件。如果我切换引脚,在新EXTI4按钮将持续开火,而我与切换的按钮,没有了。STM32F0:中断对EXTI1/EXTI2不点火,而EXTI4工作。 *混淆*

我已经彻底检查所有段,我想不通为什么EXTI0_1_IRQHandler不火,而EXTI4_15_IRQHandler一样。请参阅下面我用于图书馆的两个文件。我正在使用SPL和OpenSTM32 IDE。 “main.c”只呼叫

ENCODER_STM32_configureInterface(); 

所以真的没有其他的事情发生。

// ENCODER_STM32 library: This library shall enable interfacing an encoder on an STM32F0 chip. 

// GPIO Definitions 
#define ENCODER_GPIO_PORT  GPIOA 
#define ENCODER_GPIO_CLK_PIN GPIO_Pin_1 
#define ENCODER_GPIO_DT_PIN  GPIO_Pin_2 
#define ENCODER_GPIO_SW_PIN  GPIO_Pin_4 
#define ENCODER_GPIO_PERIPH  RCC_AHBPeriph_GPIOA 

// EXTI Definitions 
#define ENCODER_EXTI_PORTSRC EXTI_PortSourceGPIOA 
#define ENCODER_EXTI_CLK_PINSRC EXTI_PinSource1 
#define ENCODER_EXTI_CLK_LINE EXTI_Line1 
#define ENCODER_EXTI_DT_PINSRC EXTI_PinSource2 
#define ENCODER_EXTI_DT_LINE EXTI_Line2 
#define ENCODER_EXTI_SW_PINSRC EXTI_PinSource4 
#define ENCODER_EXTI_SW_LINE EXTI_Line4 
#define ENCODER_EXTI_PERIPH  RCC_APB2Periph_SYSCFG 
#define ENCODER_EXTI_MODE  EXTI_Mode_Interrupt 
#define ENCODER_EXTI_TRIGGER EXTI_Trigger_Falling 

// NVIC Definitions 
#define ENCODER_NVIC_CLK_CHA EXTI0_1_IRQn 
#define ENCODER_NVIC_DT_CHA  EXTI2_3_IRQn 
#define ENCODER_NVIC_SW_CHA  EXTI4_15_IRQn 
#define ENCODER_NVIC_PRIORITY 0x03 

// Variable Definitions 

// Parameter Definitions 

// Function Definitions 

// Function Declarations 
void ENCODER_STM32_configureInterface(void); 

和...

#include "stm32f0xx.h" 
#include "usart_stm32_console.h" 
#include "encoder_stm32.h" 

void ENCODER_STM32_configureInterface(void) { 

    // Enabling Clocks 
    RCC_AHBPeriphClockCmd(ENCODER_GPIO_PERIPH, ENABLE); 
    RCC_APB2PeriphClockCmd(ENCODER_EXTI_PERIPH, ENABLE); 

    // Configuring GPIO 
    GPIO_InitTypeDef GPIO_InitStructure; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; 
    GPIO_InitStructure.GPIO_Pin = ENCODER_GPIO_CLK_PIN | ENCODER_GPIO_DT_PIN | ENCODER_GPIO_SW_PIN; 
    GPIO_Init(ENCODER_GPIO_PORT, &GPIO_InitStructure); 

    // Configuring EXTI 
    EXTI_InitTypeDef EXTI_InitStructure; 
    EXTI_InitStructure.EXTI_Line = ENCODER_EXTI_CLK_LINE | ENCODER_EXTI_DT_LINE | ENCODER_EXTI_SW_LINE; 
    EXTI_InitStructure.EXTI_Mode = ENCODER_EXTI_MODE; 
    EXTI_InitStructure.EXTI_Trigger = ENCODER_EXTI_TRIGGER; 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE; 
    SYSCFG_EXTILineConfig(ENCODER_EXTI_PORTSRC, ENCODER_EXTI_CLK_PINSRC); 
    SYSCFG_EXTILineConfig(ENCODER_EXTI_PORTSRC, ENCODER_EXTI_DT_PINSRC); 
    SYSCFG_EXTILineConfig(ENCODER_EXTI_PORTSRC, ENCODER_EXTI_SW_PINSRC); 
    EXTI_Init(&EXTI_InitStructure); 

    // Configuring NVIC 
    NVIC_InitTypeDef NVIC_InitStructure; 
    NVIC_InitStructure.NVIC_IRQChannel = ENCODER_NVIC_CLK_CHA | ENCODER_NVIC_DT_CHA | ENCODER_NVIC_SW_CHA; 
    NVIC_InitStructure.NVIC_IRQChannelPriority = ENCODER_NVIC_PRIORITY; 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure); 

} 


void EXTI0_1_IRQHandler(void) { 

    USART_STM32_sendToUSART("IRQ0_1 triggered"); 

    if(EXTI_GetITStatus(ENCODER_EXTI_CLK_LINE) != RESET) { 
     USART_STM32_sendToUSART("CLK triggered"); 
     EXTI_ClearITPendingBit(ENCODER_EXTI_CLK_LINE); 
    } 

} 


void EXTI2_3_IRQHandler(void) { 

    USART_STM32_sendToUSART("IRQ2_3 triggered"); 

    if(EXTI_GetITStatus(ENCODER_EXTI_DT_LINE) != RESET) { 
     USART_STM32_sendToUSART("DT triggered"); 
     EXTI_ClearITPendingBit(ENCODER_EXTI_DT_LINE); 
    } 

} 


void EXTI4_15_IRQHandler(void) { 

    USART_STM32_sendToUSART("IRQ4_15 triggered"); 

    if(EXTI_GetITStatus(ENCODER_EXTI_SW_LINE) != RESET) { 
     USART_STM32_sendToUSART("SW triggered"); 
     EXTI_ClearITPendingBit(ENCODER_EXTI_SW_LINE); 
    } 

} 
+0

我已经通过CubeMX与HAL尝试,它的工作,因此它不能是一个问题与活性成分的过载。上面的SPL配置中的代码有问题,导致它停止工作。我只是看不到它。 –

+0

谁在乎SPL是已经死了5年。反正我个人认为写使用像HAL或SPL那些“伟大的”图书馆这样一个简单的程序仅仅是荒谬。 –

NVIC_Init()作品,并以每次一个中断,因为NVIC_InitStructure.NVIC_IRQChannel是不是一个位掩码,但一个简单的标识符。

看标头中的IRQ信道的定义:

EXTI0_1_IRQn    = 5,  /*!< EXTI Line 0 and 1 Interrupts       */ 
    EXTI2_3_IRQn    = 6,  /*!< EXTI Line 2 and 3 Interrupts       */ 
    EXTI4_15_IRQn    = 7,  /*!< EXTI Line 4 to 15 Interrupts       */ 

在一起的OR'ing他们像屏蔽位是没有意义的,但在此特定情况下,5 | 6 | 7个产率7,其意外地等于EXTI4中断的数量,这就是这个按钮工作的原因。

直接让NVIC_Init()三次:

NVIC_InitTypeDef NVIC_InitStructure; 
NVIC_InitStructure.NVIC_IRQChannel = ENCODER_NVIC_CLK_CHA; 
NVIC_InitStructure.NVIC_IRQChannelPriority = ENCODER_NVIC_PRIORITY; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 
NVIC_InitStructure.NVIC_IRQChannel = ENCODER_NVIC_DT_CHA; 
NVIC_Init(&NVIC_InitStructure); 
NVIC_InitStructure.NVIC_IRQChannel = ENCODER_NVIC_SW_CHA; 
NVIC_Init(&NVIC_InitStructure); 
+0

谢谢!这真的帮助我理解。对不起,这样的菜鸟问题。我第一次使用STM平台。 –