【发布时间】:2018-03-30 08:28:13
【问题描述】:
我正在尝试让外部中断在 Nucleo-F030R8 撞墙了。
一切都已配置并在步进模式下运行良好,但是当我使用简单的跳线将我的电路板连接到另一个测试板并运行相同的代码时,即使该测试板(第二个 Nucleo-F302R8, 它应该只产生一个我想用第一个测量的信号峰值)没有打开。
我混合使用了 STM 的 HAL 库和我自己的一些代码。
有人最终遇到过类似的问题吗? 我正在使用 STM32 的系统工作台。
ISR的一部分,中断处理程序被切断
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);
更新:
会不会是通过BSRR或BRR重置Pin会产生中断?
我正在逐步检查我的代码,每次重置引脚时都会生成中断。
【问题讨论】:
-
太糟糕了,这类话题没有得到太多的关注,如果我知道的话,我会帮助你的。
-
此代码看起来更像 CMSIS,但不像 HAL。可能的原因是您在退出处理程序之前没有清除中断位。这个强制处理程序被一次又一次地调用。
-
如果中断位被清除到这篇文章中,我根本没有复制该部分。将 tine 引脚设置为低电平并调用函数 change_rising 后触发中断。这是在芯片重置后发生的。
-
您没有清除中断标志,因此将“无限期”触发中断。如果在中断退出之前清除标志,则可能没有足够的时间来清除该清除以传播到整个总线,并且将再次触发中断。为了避免它:尽早清除它,使用屏障指令或在清除后读取标志。
-
能否也粘贴带有 EXTI/GPIO 初始化的部分?
GPIO_InitTypeDef.Mode是如何配置的?也许是GPIO_MODE_IT_RISING_FALLING? page 57