我遇到了以下问题: 我的电子板上有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
当我手动读取输入的状态时,我无法验证输入计数是否过多。
答案 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)
答案 2 :(得分:0)
我解决了我的问题,由于R.C.这是一个电气问题。输入和微型GPIO之间的电路。
信号需要太长的时间才能上升(锯齿中的信号)。我现在改变了我的电子和mirco计数。