你好。
我有一个引脚中断配置为在下降沿触发。 观察具有示波器的线路、在转换时线路上存在迟滞。 我将配置设置如下。 当线路经历从高到低的转换时、回调被调用两次。 当我反转所有内容并检测到低电平到高电平转换(具有几乎没有迟滞)时、根据需要调用一次回调。
如何防止由于高到低迟滞而调用它两次?
谢谢!
// PIN CONFIG INITIALIZERS
#define PANEL_DETECT_PIN IOID_1
static PIN_Config detectPinConfig[] = {
PANEL_DETECT_PIN | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
PIN_TERMINATE
};
static PIN_Config allPinTable[] = {
LP_GREEN_LED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
LP_RED_LED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
SPF_RED_LED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
SPF_GREEN_LED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
SPF_YELLOW_LED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
NODE_RESET_PIN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PANEL_DETECT_PIN | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES,
PIN_TERMINATE
};
static PIN_Handle detectPinHandle;
static PIN_State detectPinState;
// CONFIGURATION
PIN_init(allPinTable);
detectPinHandle = PIN_open(&detectPinState, detectPinConfig);
if (!detectPinHandle) {
while(1);
}
PIN_setConfig(detectPinHandle, PIN_BM_HYSTERESIS, PANEL_DETECT_PIN | PIN_HYSTERESIS);
PIN_Status intRegStatus = PIN_registerIntCb(detectPinHandle, (PIN_IntCb)detectPinCb);
// PIN INTERRUPT CALLBACK
static void detectPinCb(PIN_Handle handle, PIN_Id id) // TODO: this gets called twice on falling edge for some reason
{
PIN_setInterrupt(handle, PIN_IRQ_DIS);
microState = (bool)!PIN_getInputValue(PANEL_DETECT_PIN);
if (!Clock_isActive(detectPinDebounceClockHandle)) {
Clock_start(detectPinDebounceClockHandle);
}
}
// DEBOUNCE CLOCK CALLBACK
static void detectPinDebounceClockCb(void)
{
bool state = (bool)!PIN_getInputValue(PANEL_DETECT_PIN);
if (microState == state) { // if still held after debounce timeout
Event_post(singleProgrammerEventHandle, SINGLE_PROGRAMMER_EVENT_DETECT_PIN_CHANGED);
}
if (state) {
PIN_setConfig(detectPinHandle, PIN_BM_IRQ, PANEL_DETECT_PIN | PIN_IRQ_POSEDGE | PIN_BM_HYSTERESIS);
}
else {
PIN_setConfig(detectPinHandle, PIN_BM_IRQ, PANEL_DETECT_PIN | PIN_IRQ_NEGEDGE | PIN_BM_HYSTERESIS);
}
}