Перейти к содержанию
    

STM32F100 Непроизвольное срабатывание прерывания

ну он же не кортекс-м...

Ну так spurious interrupt - это не кортексо-специфическая штука. Откуда рождается - вопрос сложный, покрытый мраком:) Возможно, что очень сложный контроллер прерываний, и не всегда всё успевает сбрасываться. Возможно ещё что-то. Главное, что жить это не мешает.

 

Согласен. У кортексов и контроллер прерываний совсем другой. Про ложные срабатывания (даже на STM32) ничего не слышал за более чем 4 года использования в серийном производстве (~ 100 изделий в месяц) на STM32F100/103/107/407.

Погуглите "spurious interrupt stm32", найдёте изрядно примеров. К тому же, если у вас в процедурах обработчиков прерывания есть проверка флага прерывания на входе, то вы это ложное прерывание никак и не заметите. Особенно в производстве:)

 

А какой именно флаг проверять? Разве в моем коде обработчик не полный?

У вас всё правильно, так и надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Погуглите "spurious interrupt stm32", найдёте изрядно примеров. К тому же, если у вас в процедурах обработчиков прерывания есть проверка флага прерывания на входе, то вы это ложное прерывание никак и не заметите.

Флаги на входе конечно же обрабатываю. Я знаю как минимум два источника "ложных" прерываний:

1. Не сброшены флаги отложенных прерываний в NVIC и/или периферийного модуля при разрешении прерывания от этого модуля;

2. Очистка бита запроса прерывания от периферийного модуля в самом конце обработчика прерывания от этого модуля.

ST в этих случаях совершенно ни при чем, и косяк целиком программиста.

 

В то, что прерывание может само по себе возникнуть - не верю. Ибо для всех неиспользуемых прерываний у меня заглушка, и я ни разу в нее не влетал.

Или речь идет только о разрешенных прерываниях?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

о разрешенных конечно, иначе это была бы мощная бага.

 

Я так понял их описания есть такой расклад, на примере UART идут данные, возникает прерывание что пришел байт, но сразу мы в прерывание не попадаем, сначала конвейер должен доработать, и если в конвейере будут команды запрета прерывания то будет флаг, когда его быть не может. Или если будут какие то ошибки за такты конвейера то возникнет другое прерывание, но первое возникшее все равно убдет отработано.

 

Вообще как то мутно написано%(... хорошо бы чтобы кто на пальцах объяснил...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Флаги на входе конечно же обрабатываю.

Тогда вы ничего не можете утверждать наверняка:)

Поставьте в каждом прерывании по два счётчика, один увеличивайте при входе в прерывание, второй - после успешной проверки флага. И через пару месяцев прогона на сотнях своих устройств снимите показания. Это будет хоть что-то. Хотя даже в этом случае отсутствие ложных прерываний не будет говорить о том, что их не бывает:)

Я знаю как минимум два источника "ложных" прерываний:

Да, эти два вида конечно наиболее распространены. Но есть и другие.

Лично сталкивался с возникновением прерывания от DMA при отключении канала в F4. Вот аналогичный случай. Наверняка есть ещё (не зря же во всех примерах от ST во всех обработчиках прерываний стоят проверки флагов, даже когда источник прерывания гарантированно один-единственный). Смысла копать глубже не вижу, проверка флагов решает проблему.

 

ЗЫ. Речь конечно только о разрешённых прерываниях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас всё правильно, так и надо.

Так дело в том, что эта проверка в прерывании и проходит.

if (EXTI_GetITStatus(EXTI_Line0) != RESET)

Самопроизвольно выполняется это условие.

Если цеплять купюроприемник и в обработчике прерывания инкрементировать каждый импульс (сумму денег), то через некоторое время самопроизвольно отработает обработчик прерывания, и приплюсуется лишняя сумма денег. Как быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а полингом проверить состояние пина нельзя? Кстати а сумму откуда узнаете или этот девайс сумму импульсами сообщает? Может правильнее этот импульс повесить на таймер, счетчиком, пусть в железе само считается чего на прерывания то реагировать?

 

 

кстати про сброс прерывания в самом конце,насколько в конце? Прям последняя команда? Я так понимаю это вариант когда флаг не успевает сброситься до выхода? Сколько команд сбрасывается флаг?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а полингом проверить состояние пина нельзя? Кстати а сумму откуда узнаете или этот девайс сумму импульсами сообщает? Может правильнее этот импульс повесить на таймер, счетчиком, пусть в железе само считается чего на прерывания то реагировать?

Закидываешь 50 руб - 5 импульсов, 100 руб - 10 импульсов, и т.д.

Ширина импульса 50 мс. В обычном состоянии логическая "1". Поэтому настроил прерывание на спад.

Я так понял, можно эти импульсы как-то таймерам продвинутыми считать? Я не смог пример найти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если цеплять купюроприемник и в обработчике прерывания инкрементировать каждый импульс (сумму денег), то через некоторое время самопроизвольно отработает обработчик прерывания, и приплюсуется лишняя сумма денег. Как быть?

Либо опросом с защитой от дребезга, либо выбрать купюроприемник с управлением по RS232.

Я импульсы от купюро/монетоприемников делал опросом - там скорость импульсов совсем никакая.

Потом перешли на управление по RS232, ибо 5000 купюра очень на долго парализует аппарат.

кстати про сброс прерывания в самом конце,насколько в конце? Прям последняя команда? Я так понимаю это вариант когда флаг не успевает сброситься до выхода? Сколько команд сбрасывается флаг?

Флаг в периферийном модуле сбрасывается мгновенно, но пока реакция дойдет до NVIC... может не успеть до выхода из прерывания, и NVIC после выхода тут же попадает в прерывание снова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Либо опросом с защитой от дребезга, либо выбрать купюроприемник с управлением по RS232.

Я импульсы от купюро/монетоприемников делал опросом - там скорость импульсов совсем никакая.

Потом перешли на управление по RS232, ибо 5000 купюра очень на долго парализует аппарат.

Дребезг исключен - проверяли на осциллографе. А с 5000 купюрой действительно долго )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дребезг исключен - проверяли на осциллографе. А с 5000 купюрой действительно долго )

Смотря что считать дребезгом...

Если вместо 50мс импульса придет 30 мс?!

 

Мы в свое время решили так: если контроль ослабить, то будут лишние импульсы - пользователь получает лишние услуги и, естественно, не будет об этом сообщать и тем более оплачивать. Если контроль за импульсами усилить, то некоторые импульсы пропадут - пользователь это заметит и сообщит администратору - администратор решит вопрос. Правда, у нас особенность - музыкальные аппараты в барах и т.п. - т.е. администратор есть, услуга в виде проигрывания песни, т.е. убыток не настоящий. Другое дело платежные терминалы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так дело в том, что эта проверка в прерывании и проходит.

if (EXTI_GetITStatus(EXTI_Line0) != RESET)

Самопроизвольно выполняется это условие.

А, вон оно что... Тогда это не spurious. Если дребезг точно исключён, то, скорее всего, не успевает сброситься флаг прерывания до выхода из обработчика.

Вставьте строчку

        __DSB();

после очистки флага прерывания, всё должно пройти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А мне очень не нравится эта строчка

if (flag)

{

flag = 0;

NVIC_EnableIRQ(TIM6_DAC_IRQn);

}

Зачем дергать NVIC (причем не правильно), когда лучше разрешать/запрещать прерывание в периферийном модуле (в данном случае TIM6 или DAC)?

Причем, обязательно сбросить флаг запроса прерывания, если он взведен, иначе тут же улетим в обработчик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Флаг в периферийном модуле сбрасывается мгновенно, но пока реакция дойдет до NVIC... может не успеть до выхода из прерывания, и NVIC после выхода тут же попадает в прерывание снова.

ну это сено-солома:) Сколько тактов, нет таких данных? насколько от конца функции надо отодвигать сброс флага?

 

А если функция как заглушка только и сбрасывает флаг, надо нопов напихать или барьер какой что ли, типа __DSB();?

 

 

Закидываешь 50 руб - 5 импульсов, 100 руб - 10 импульсов, и т.д

ну так импульсы надо считать не прерыванием, а таймером. Берете таймер, и эти импулсы заводите как его клок (там есть много режимов, можно выбрать). Делаете счетчик вперед. Если появляются импульсы, таймер считает. Время от времени проверяете что он насчитал, что насчитал запоминаете, таймер сбрасываете. как то так

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну это сено-солома:) Сколько тактов, нет таких данных? насколько от конца функции надо отодвигать сброс флага?

А если функция как заглушка только и сбрасывает флаг, надо нопов напихать или барьер какой что ли, типа __DSB();?

Ага, барьера хватает.

 

ну так импульсы надо считать не прерыванием, а таймером. Берете таймер, и эти импулсы заводите как его клок (там есть много режимов, можно выбрать). Делаете счетчик вперед. Если появляются импульсы, таймер считает. Время от времени проверяете что он насчитал, что насчитал запоминаете, таймер сбрасываете. как то так

Вообще не гуд. Лучше уж EXTI. В момент сброса таймера может появиться импульс от купюрника. Проверять нужно периодически -- еще один таймер.

И опять же, это решение, не учитывающее форму импульса и его тайминги. Импульсная помеха легко может добавить сотню-другую денег на счет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А, вон оно что... Тогда это не spurious. Если дребезг точно исключён, то, скорее всего, не успевает сброситься флаг прерывания до выхода из обработчика.

Вставьте строчку

        __DSB();

после очистки флага прерывания, всё должно пройти.

Та функция вызывается непроизвольно не сразу после ее правильного вызова, т.е. проходит минут 5 и только после этого вызывается непроизвольно. Неужели флаг не успевает сброситься за 5 минут? )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...