首页 文章

STM32 HAL GPIO中断计数太多

提问于
浏览
0

我有以下问题:我的电子板上有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 回答

  • 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指令之前以程序顺序出现的所有显式存储器访问 . 它不会影响在处理器上执行的任何其他指令的排序 .

  • 0
    • EXTI - 始终首先清除IT标志(其他中断也是如此)

    • Switch将始终产生多个implulse .

    • HAL&EXTI - 我遇到了很多问题(也许我太懒了,不能学习这个怪异的库)并开始使用裸寄存器 - 所有问题都立即消失了:)

  • 0

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

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

相关问题