Поиск
Показаны результаты для тегов 'edge'.
-
Приветствую! Среда: простейшая прошивка, написанная с использованием SDK_2.2_MCIM6ULL, скачанного с сайта NXP. Возникла странная проблема: я настраиваю вход GPIO4[22] на обработку прерывания по спаду сигнала и предполагаю, что обработчик прерывания будет вызываться один раз после одного active-low импульса сигнала длительностью около 200 мкс. Однако по факту вызов обработчика происходит два раза, при этом во время первого вызова состояние пина GPIO4[22], прочитанное с использованием функции GPIO_ReadPinInput(GPIO4, 22), вполне ожидаемо равно 0. При втором (повторном) вызове обработчика состояние пина уже равно 1, что совсем неожиданно, т.к. прерывание должно быть только по спаду сигнала. Я проверил значения регистров ICR2 - в нем в соответствующих битах установлено значение 11b, в регистре EDGE_SEL все биты равны нулю. В самом обработчике после проверки бита прерывания (GPIO_GetPinsInterruptFlags(GPIO4) & (1U << 22)) выполняется сброс флага прерывания с помощью вызова GPIO_ClearPinsInterruptFlags(GPIO4, 1U << 22). Т.е. сначала читается значение ISR и проверяется наличие бита прерывания, потом сбрасывается значение этого бита для подтверждения обработки прерывания. При этом я проверял, что значение бита в ISR действительно сбрасывается, т.е. на момент выхода из обработчика прерывания значение регистра ISR равно нулю. Фронты сигнала чистые, длительность менее 10 нс, проверял осциллографом. Включение гистерезиса на входе эффекта не даёт. В Errata ничего на этот счет нет. При этом проблема не с одним битом GPIO4[22], но и с GPIO4[23] наблюдается то же самое поведение. Кто-нибудь сталкивался с подобным поведением i.MX6? Что это может быть за мистика?