gpt4 book ai didi

microcontroller - STM32F4 EXTI中断相互干扰

转载 作者:行者123 更新时间:2023-12-04 01:52:33 26 4
gpt4 key购买 nike

我正在使用 STM32F407VGT6 MCU,但遇到外部中断问题 ( EXTI )。我已将两个引脚配置为 EXTI他们是 PE7PE15 .它们连接到霍尔传感器驱动器并检测触发轮的齿边。一个是多齿的主要来源,其他轮是确定位置的单齿轮。问题是它们可以单独工作而不会出现问题,但是如果我将它们都连接起来,它们就会开始相互干扰并且我会失去位置同步,因为 MCU 正在检测错误边缘。我可以通过将任一引脚连接到低信号并将其他引脚连接到 HALL 驱动器来重新创建相同的行为。但是如果我禁用 EXTI并将 pin 作为输入,问题就消失了。我不知道这里发生了什么。

另外,我遇​​到了 PE15 的问题和 EXTI之前,它可能与此有关。 EXTI只在 EXTI_Trigger_Rising 工作和 EXTI_Trigger_Rising_Falling模式,但 EXTI_Trigger_Falling正在提供随机边缘检测,唯一的解决方案是监听两个边缘并消除我不需要的边缘。我在数据表中找不到任何关于此的信息。

这个 STM32F4 让我头疼,我没有选择。好吧,最后一个选择是将霍尔驱动器重新路由到其他引脚并使用输入捕获/定时器。

主轮配置:

void Trigger_Configure_Primary(void) {
// GPIO
GPIOE->OSPEEDR |= (0x03 << (2 * 15)); // high speed

// EXTI
SYSCFG->EXTICR[3] = SYSCFG_EXTICR4_EXTI15_PE; // Tell system that you will use PE15 for EXTI15
EXTI->RTSR |= (1 << 15); // rising edge
EXTI->FTSR |= (1 << 15); // falling edge
EXTI->IMR |= (1 << 15); // Unmask EXTI15 interrupt
EXTI->PR |= (1 << 15); // Clear pending bit

/* Add IRQ vector to NVIC */
NVIC_SetPriority(EXTI15_10_IRQn, 0);
NVIC_EnableIRQ(EXTI15_10_IRQn);
}

副轮配置:

void Trigger_Configure_Secondary(void) {
// GPIO
GPIOE->OSPEEDR |= (0x03 << (2 * 7)); // high speed

// EXTI
SYSCFG->EXTICR[1] = SYSCFG_EXTICR2_EXTI7_PE; // Tell system that you will use PE7 for EXTI7
EXTI->RTSR |= (1 << 7); // rising edge
EXTI->FTSR |= (1 << 7); // falling edge
EXTI->IMR |= (1 << 7); // Unmask EXTI7 interrupt
EXTI->PR |= (1 << 7); // Clear pending bit

/* Add IRQ vector to NVIC */
NVIC_SetPriority(EXTI9_5_IRQn, 0);
NVIC_EnableIRQ(EXTI9_5_IRQn);
}

IRQ 处理程序:

void EXTI9_5_IRQHandler(void) {
__disable_irq();
/* Make sure that interrupt flag is set */
if ((EXTI->PR & EXTI_Line7) != 0) {
// Secondary trigger IRQ
uint32_t now_nt = GET_TIMESTAMP();

uint8_t edge = ((GPIOE->IDR & SECONDARY_PIN) == 0 ? 0 : 1);
TD_Decode_Secondary_Trigger_Event(
now_nt,
edge
);

#ifdef DEBUG
// Stats
secondary_ticks = (GET_TIMESTAMP() - now_nt);
#endif

/* Clear interrupt flag */
EXTI->PR |= EXTI_Line7;

++s_cnt;
}
__enable_irq();
}

void EXTI15_10_IRQHandler(void) {
__disable_irq();
/* Make sure that interrupt flag is set */
if ((EXTI->PR & EXTI_Line15) != 0) {
// Primary trigger IRQ
uint32_t now_nt = GET_TIMESTAMP();

uint8_t edge = ((GPIOE->IDR & PRIMARY_PIN) == 0 ? 0 : 1);
if (primary_edge == edge) {
TD_Decode_Primary_Trigger(now_nt);
}

#ifdef DEBUG
// Stats
primary_ticks = (GET_TIMESTAMP() - now_nt);
#endif

/* Clear interrupt flag */
EXTI->PR |= EXTI_Line15;

++p_cnt;
}
__enable_irq();
}

最佳答案

RM0090, 12.3.6 待处理寄存器 (EXTI_PR):

This bit is cleared by programming it to ‘1’.



因此,这段代码

/* Clear interrupt flag */
EXTI->PR |= EXTI_Line7;

不仅清零 EXTI_Line7但所有挂起的中断,因为它读取 EXTI-PR1对于所有触发的中断,然后 OR 位 EXTI_Line7并写入所有 1 -es 回来了。



/* Clear interrupt flag */
EXTI->PR = EXTI_Line7;

关于microcontroller - STM32F4 EXTI中断相互干扰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52326225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com