请教下,stm32L03xx 无法进入外部中断函数 ? 函数配置如下: // 使用外部 PB0 作为按键中断输入脚 void KEY_EXTI0_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStructure.Pull = GPIO_NOPULL; // 外部已经加了上啦电组了 GPIO_InitStructure.Pin = KEY_INT0_IN_Pin; HAL_GPIO_Init(KEY_INT0_IN_GPIO_Port, &GPIO_InitStructure); HAL_NVIC_SetPriority(EXTI0_1_IRQn, 4, 0); HAL_NVIC_EnableIRQ(EXTI0_1_IRQn); } void EXTI0_1_IRQHandler(void) // 当外部按键按下后,程序不会执行到这里来,不知道是什么情况啊 ?????????????? { // HAL_GPIO_EXTI_IRQHandler(DECARSTIRQ | KEY_INT0_IN_Pin); // EXTI line interrupt detected if(__HAL_GPIO_EXTI_GET_IT(DECARSTIRQ) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(DECARSTIRQ); HAL_GPIO_EXTI_Callback(DECARSTIRQ); } // EXTI line interrupt detected if(__HAL_GPIO_EXTI_GET_IT(KEY_INT0_IN_Pin) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(KEY_INT0_IN_Pin); HAL_GPIO_EXTI_Callback(KEY_INT0_IN_Pin); } } /** * @brief EXTI line detection callbacks * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { switch(GPIO_Pin) { case DW1000_DECAIRQ: printf("dwm1000 - pa3 int\r\n"); break; case DECARSTIRQ: printf("dwm1000 - pa1 rstint\r\n"); break; case KEY_INT0_IN_Pin: SetExtiState(); printf("KEY_INT0_IN_Pin key sos alarm \r\n"); break; default:break; } } |
你好,
下面的两行就是配置中断的啊
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
这个是 hal 苦的,不是标准库啊,
官方的历程也是这么配置的
终于搞定了,在配置前 必须先禁止中断,
void KEY_EXTI0_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_NVIC_DisableIRQ(EXTI0_1_IRQn); // 配置前先禁止,因为在其他地方已经有初始化过了,如果不禁止
// 这次重新再初始化时会失败
GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStructure.Pull = GPIO_NOPULL; // 外部已经加了上啦电组了
GPIO_InitStructure.Pin = KEY_INT0_IN_Pin;
HAL_GPIO_Init(KEY_INT0_IN_GPIO_Port, &GPIO_InitStructure);
ClearExtiState();
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 4, 0);
__HAL_GPIO_EXTI_CLEAR_IT(KEY_INT0_IN_Pin);
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
}
评分
查看全部评分