STM32 HAL GPIO中断计数太多

时间:2017-05-11 12:05:13

标签: c interrupt stm32 gpio hal

我遇到了以下问题: 我的电子板上有2个输入:

#define TOR1_IN_uC_Port         GPIOC
#define TOR1_IN_uC_Pin          GPIO_PIN_5
#define TOR2_IN_uC_Port         GPIOE
#define TOR2_IN_uC_Pin          GPIO_PIN_6

我有这个初始化:

GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pin = TOR1_IN_uC_Pin;
HAL_GPIO_Init(TOR1_IN_uC_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = TOR2_IN_uC_Pin;
HAL_GPIO_Init(TOR2_IN_uC_Port, &GPIO_InitStruct);

HAL_NVIC_SetPriority(EXTI9_5_IRQn, 2, 1);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);

我有两个中断功能:

void EXTI9_5_IRQHandler(void)
{
    if(__HAL_GPIO_EXTI_GET_IT(TOR1_IN_uC_Pin) != RESET)
    {
        HAL_GPIO_EXTI_IRQHandler(TOR1_IN_uC_Pin);
        __HAL_GPIO_EXTI_CLEAR_IT(TOR1_IN_uC_Pin);
    }
    if(__HAL_GPIO_EXTI_GET_IT(TOR2_IN_uC_Pin) != RESET)
    {
        HAL_GPIO_EXTI_IRQHandler(TOR2_IN_uC_Pin);
        __HAL_GPIO_EXTI_CLEAR_IT(TOR2_IN_uC_Pin);
    }
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == TOR1_IN_uC_Pin)
        Input1.Count++;
    else if (GPIO_Pin == TOR2_IN_uC_Pin)
        Input2.Count++;
}

我已经以10Hz的频率输入GBF输入,但计数器计数过多。 当我在串行端口上打印计数器时,它显示大约5kHz

当我手动读取输入的状态时,我无法验证输入计数是否过多。

3 个答案:

答案 0 :(得分:1)

我也有这个问题,我注意到它需要一段时间。这是因为你清除IRQ标志非常接近中断返回。用自己创建tail-chain中断。

void EXTI9_5_IRQHandler(void)
{
    if(__HAL_GPIO_EXTI_GET_IT(TOR2_IN_uC_Pin) != RESET)
    {
        HAL_GPIO_EXTI_IRQHandler(TOR2_IN_uC_Pin);
        __HAL_GPIO_EXTI_CLEAR_IT(TOR2_IN_uC_Pin);
    }
    __DMB(); // add this
}

您必须等待公交车完成清除行动。 DMB instruction对此有所帮助。

  

数据存储器屏障充当内存屏障。它确保在DMB指令之后以程序顺序出现的任何显式存储器访问之前,观察在DMB指令之前以程序顺序出现的所有显式存储器访问。它不会影响处理器上执行的任何其他指令的排序。

答案 1 :(得分:0)

  1. EXTI - 始终首先清除IT标志(其他中断)
  2. Switch总会产生多个implulse。
  3. HAL& EXTI - 我遇到了很多问题(也许我太懒了,无法学习这个怪异的库)并开始使用裸寄存器 - 所有问题都立即出现了:)

答案 2 :(得分:0)

我解决了我的问题,由于R.C.这是一个电气问题。输入和微型GPIO之间的电路。

信号需要太长的时间才能上升(锯齿中的信号)。我现在改变了我的电子和mirco计数。