[英]STM32F0: Interrupt on EXTI1 / EXTI2 not firing, while EXTI4 is working. *confused*
您能否在這里幫助我,並告訴我我做錯了什么? EXTI1和EXTI2不會觸發,但是EXTI4可以正常工作。 不是硬件。 如果我切換了引腳,則新的EXTI4按鈕將保持觸發狀態,而與之切換時不再使用該按鈕。
我已經徹底檢查了所有段,並且無法弄清楚為什么EXTI0_1_IRQHandler不能觸發而EXTI4_15_IRQHandler可以觸發。 請查看下面我用於庫的兩個文件。 我在OpenSTM32 IDE中使用SPL。 “ 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);
}
}
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 */
像掩碼位一樣將它們“或”在一起是沒有意義的,但是在這種特殊情況下,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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.