【发布时间】:2017-05-11 12:05:13
【问题描述】:
我遇到了以下问题: 我的电子板上有 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
当我手动读取输入的状态时,我无法验证输入是否太多。
【问题讨论】:
-
什么是TOR4_IN_uC_Pin?我只看到 1 和 2 的定义。
-
不匹配,我已经更正了我的帖子,谢谢
-
做一些橡皮鸭并详细解释你的代码是如何工作的。也许您想添加更多代码,在我看来,代码肯定比您显示的要多。我正在考虑 HAL_GPIO_EXTI_IRQHandler 和 HAL_GPIO_EXTI_Callback 之间的链接。您需要确认/使用中断吗? 5kHz/10Hz 的因子似乎不太像算法错误(例如,逐一),更像是不断循环的 ISR 可以通过串行打印的最大频率……在边缘触发和电平之间有选择吗?触发?
-
你在触发什么?等级?然后尝试如果您不断应用非触发级别会发生什么。边缘?然后尝试不断应用两个级别(即没有边缘)时会发生什么。如果在电平之外触发,请降低输入频率。你的计数会随着频率而变化吗?按比例?
-
应用一些屏蔽,例如用锡箔纸包好所有东西(当然要小心无意接触)。这样算不算数?
标签: c interrupt stm32 gpio hal