我有以下问题:我的电子板上有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 回答
我也遇到过这个问题,在我注意到它之前需要一段时间 . 这是因为你清除IRQ标志非常接近中断返回 . 自己创建tail-chain中断 .
你必须等公共汽车才能完成清除行动 . DMB instruction对此有所帮助 .
EXTI - 始终首先清除IT标志(其他中断也是如此)
Switch将始终产生多个implulse .
HAL&EXTI - 我遇到了很多问题(也许我太懒了,不能学习这个怪异的库)并开始使用裸寄存器 - 所有问题都立即消失了:)
我解决了我的问题,由于R.C.这是一个电气问题 . 输入和微GPIO之间的电路 .
信号需要太长的时间才能上升(锯齿信号) . 我现在改变了我的电子和mirco数量 .