我有按钮中断:
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET){
if (/* BUTTON IS RELEASED */) {
/* do something */
}
if (/* BUTTON IS PRESSED */) {
/* do something else */
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
有可能检查一下吗?
答案 0 :(得分:4)
是的,这是可能的。您必须将EXTI
触发方式设置为EXTI_Trigger_Rising_Falling
。因此STM32在上升和下降边缘时输入ISR
。在ISR
中,您可以控制GPIO引脚。如果GPIOPın置位,它必须是上升沿,否则它必须是下降沿。
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET){
if (PIN==1) {//Rising so pressed
/* do something */
}
if (PIN==0) {Falling so released
/* do something else */
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
注意:上面的表现正常,下拉连接到按钮。随着上拉,上升和下降将被反转。
答案 1 :(得分:0)
是的。对于手动按下按钮的检测,您的代码应该可以正常工作。 对于某些关键信号检测,边缘和检查之间的间隔可能有意义。
答案 2 :(得分:-1)
1。)EXTI设置为EXTI_Trigger_Rising_Falling。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ //interrupt handler
if(GPIO_Pin == GPIO_PIN_4){ //check interrupt for specific pin
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)){ //check pin state
/* do something */
}
if(!HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)){
/* do something */
}
}
}
或
if((GPIOE -> IDR & GPIO_PIN_4)){ //IF STATUS PIN is HIGH
/* do something */
}
if(!(GPIOE -> IDR & GPIO_PIN_4)){ //IF STATUS PIN is LOW
/* do something */
}