设置引脚后触发外部中断

5
我正在尝试在Nucleo-F030R8上运行外部中断,但是遇到了问题。
在步进模式下一切都配置好并正常运行,但是当我将我的板子连接到另一个带有简单跳线的测试板上并运行相同的代码时,即使第二个测试板(Nucleo-F302R8)未打开且应该只产生我要在第一个板子上测量的单个信号峰,外部中断也会触发。
我正在使用STM的HAL库和自己写的一些代码。是否有人遇到过类似的问题?我正在使用STM32的System Workbench。
ISR的一部分,Interrupthandler被剪切。
void EXTI0_1_IRQHandler(void)
{
   /* USER CODE BEGIN EXTI0_1_IRQn 0 */
   if ((EXTI->IMR & EXTI_IMR_MR0) && (EXTI->PR & EXTI_PR_PR0))
   {
       int_flag_pin.copen = 1;
   }
   if ((EXTI->IMR & EXTI_IMR_MR1) && (EXTI->PR & EXTI_PR_PR1))
   {
      int_flag_pin.ma1 = 1;
   }

   /* USER CODE END EXTI0_1_IRQn 0 */
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
   /* USER CODE BEGIN EXTI0_1_IRQn 1 */

   /* USER CODE END EXTI0_1_IRQn 1 */
}

在将引脚设置为低电平和变化上升之间,中断被触发。

TEST_GPIO_Port->BSRR = (uint32_t) TEST_Pin;
//HAL_GPIO_WritePin(TEST_GPIO_Port, TEST_Pin, GPIO_PIN_RESET);      
TEST_GPIO_Port->BRR = (uint32_t) TEST_Pin;
change_rising(0);

更新:

是否可能通过BSRRBRR重置引脚会生成中断? 我正在逐步检查我的代码,每次引脚被重置时都会生成中断。


很遗憾这类话题没有得到很多关注,如果我知道任何相关信息,我会帮助你的。 - DarkMukke
2
这段代码更像是CMSIS而不是HAL。 可能的原因是在退出handler之前您没有清除中断位。这将强制再次调用handler。 - Yuriy
我只是没有将清除中断位的部分复制到这篇文章中。 当引脚被设置为低电平并调用change_rising函数时,中断被触发。这发生在芯片重置后。 - Heiko Thober
1
你没有清除中断标志,因此中断将会一直被触发。如果在退出中断之前清除标志,可能没有足够的时间让这个清除通过总线传播,中断将再次被触发。为了避免这种情况:尽早清除它,使用屏障指令或在清除后读取标志。 - 0___________
我会以逐步模式运行我的代码并观察挂起中断寄存器。在我写入BRR寄存器之前,没有中断被注册。使用HAL函数“HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)”在ISR中清除标志。在启用中断后,我应该提前执行此操作吗? - Heiko Thober
2
你能否也粘贴一下 EXTI/GPIO 初始化的部分?GPIO_InitTypeDef.Mode 是如何配置的?也许是 GPIO_MODE_IT_RISING_FALLING 吗?第57页 - pan-mroku
1个回答

0
如果TEST_Pin是GPIO_PIN_0或GPIO_PIN_1引脚,您将合法地接收到中断请求。 EXTI0_1_IRQHandler可以捕获来自任何端口的中断请求,但不包括#0或#1引脚。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接