реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> STM32F100 Непроизвольное срабатывание прерывания
AHTOXA
сообщение Aug 30 2014, 19:11
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 332
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Golikov A. @ Aug 30 2014, 21:06) *
ну он же не кортекс-м...

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

Цитата(adnega @ Aug 30 2014, 21:53) *
Согласен. У кортексов и контроллер прерываний совсем другой. Про ложные срабатывания (даже на STM32) ничего не слышал за более чем 4 года использования в серийном производстве (~ 100 изделий в месяц) на STM32F100/103/107/407.

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

Цитата(Plexus @ Aug 31 2014, 00:41) *
А какой именно флаг проверять? Разве в моем коде обработчик не полный?

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 30 2014, 19:22
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 387
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(AHTOXA @ Aug 30 2014, 23:11) *
Погуглите "spurious interrupt stm32", найдёте изрядно примеров. К тому же, если у вас в процедурах обработчиков прерывания есть проверка флага прерывания на входе, то вы это ложное прерывание никак и не заметите.

Флаги на входе конечно же обрабатываю. Я знаю как минимум два источника "ложных" прерываний:
1. Не сброшены флаги отложенных прерываний в NVIC и/или периферийного модуля при разрешении прерывания от этого модуля;
2. Очистка бита запроса прерывания от периферийного модуля в самом конце обработчика прерывания от этого модуля.
ST в этих случаях совершенно ни при чем, и косяк целиком программиста.

В то, что прерывание может само по себе возникнуть - не верю. Ибо для всех неиспользуемых прерываний у меня заглушка, и я ни разу в нее не влетал.
Или речь идет только о разрешенных прерываниях?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 30 2014, 19:42
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

Вообще как то мутно написано%(... хорошо бы чтобы кто на пальцах объяснил...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 30 2014, 21:30
Сообщение #19


фанат дивана
******

Группа: Свой
Сообщений: 3 332
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(adnega @ Aug 31 2014, 01:22) *
Флаги на входе конечно же обрабатываю.

Тогда вы ничего не можете утверждать навернякаsm.gif
Поставьте в каждом прерывании по два счётчика, один увеличивайте при входе в прерывание, второй - после успешной проверки флага. И через пару месяцев прогона на сотнях своих устройств снимите показания. Это будет хоть что-то. Хотя даже в этом случае отсутствие ложных прерываний не будет говорить о том, что их не бываетsm.gif
Цитата(adnega @ Aug 31 2014, 01:22) *
Я знаю как минимум два источника "ложных" прерываний:

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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Plexus
сообщение Aug 31 2014, 06:09
Сообщение #20





Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710



Цитата(AHTOXA @ Aug 31 2014, 02:11) *
У вас всё правильно, так и надо.

Так дело в том, что эта проверка в прерывании и проходит.
Код
if (EXTI_GetITStatus(EXTI_Line0) != RESET)

Самопроизвольно выполняется это условие.
Если цеплять купюроприемник и в обработчике прерывания инкрементировать каждый импульс (сумму денег), то через некоторое время самопроизвольно отработает обработчик прерывания, и приплюсуется лишняя сумма денег. Как быть?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 31 2014, 06:18
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



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


кстати про сброс прерывания в самом конце,насколько в конце? Прям последняя команда? Я так понимаю это вариант когда флаг не успевает сброситься до выхода? Сколько команд сбрасывается флаг?
Go to the top of the page
 
+Quote Post
Plexus
сообщение Aug 31 2014, 06:26
Сообщение #22





Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710



Цитата(Golikov A. @ Aug 31 2014, 13:18) *
а полингом проверить состояние пина нельзя? Кстати а сумму откуда узнаете или этот девайс сумму импульсами сообщает? Может правильнее этот импульс повесить на таймер, счетчиком, пусть в железе само считается чего на прерывания то реагировать?

Закидываешь 50 руб - 5 импульсов, 100 руб - 10 импульсов, и т.д.
Ширина импульса 50 мс. В обычном состоянии логическая "1". Поэтому настроил прерывание на спад.
Я так понял, можно эти импульсы как-то таймерам продвинутыми считать? Я не смог пример найти.
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 31 2014, 06:31
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 387
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Plexus @ Aug 31 2014, 10:09) *
Если цеплять купюроприемник и в обработчике прерывания инкрементировать каждый импульс (сумму денег), то через некоторое время самопроизвольно отработает обработчик прерывания, и приплюсуется лишняя сумма денег. Как быть?

Либо опросом с защитой от дребезга, либо выбрать купюроприемник с управлением по RS232.
Я импульсы от купюро/монетоприемников делал опросом - там скорость импульсов совсем никакая.
Потом перешли на управление по RS232, ибо 5000 купюра очень на долго парализует аппарат.
Цитата(Golikov A. @ Aug 31 2014, 10:18) *
кстати про сброс прерывания в самом конце,насколько в конце? Прям последняя команда? Я так понимаю это вариант когда флаг не успевает сброситься до выхода? Сколько команд сбрасывается флаг?

Флаг в периферийном модуле сбрасывается мгновенно, но пока реакция дойдет до NVIC... может не успеть до выхода из прерывания, и NVIC после выхода тут же попадает в прерывание снова.
Go to the top of the page
 
+Quote Post
Plexus
сообщение Aug 31 2014, 06:43
Сообщение #24





Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710



Цитата(adnega @ Aug 31 2014, 13:31) *
Либо опросом с защитой от дребезга, либо выбрать купюроприемник с управлением по RS232.
Я импульсы от купюро/монетоприемников делал опросом - там скорость импульсов совсем никакая.
Потом перешли на управление по RS232, ибо 5000 купюра очень на долго парализует аппарат.

Дребезг исключен - проверяли на осциллографе. А с 5000 купюрой действительно долго )
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 31 2014, 06:58
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 387
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Plexus @ Aug 31 2014, 10:43) *
Дребезг исключен - проверяли на осциллографе. А с 5000 купюрой действительно долго )

Смотря что считать дребезгом...
Если вместо 50мс импульса придет 30 мс?!

Мы в свое время решили так: если контроль ослабить, то будут лишние импульсы - пользователь получает лишние услуги и, естественно, не будет об этом сообщать и тем более оплачивать. Если контроль за импульсами усилить, то некоторые импульсы пропадут - пользователь это заметит и сообщит администратору - администратор решит вопрос. Правда, у нас особенность - музыкальные аппараты в барах и т.п. - т.е. администратор есть, услуга в виде проигрывания песни, т.е. убыток не настоящий. Другое дело платежные терминалы.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 31 2014, 08:04
Сообщение #26


фанат дивана
******

Группа: Свой
Сообщений: 3 332
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Plexus @ Aug 31 2014, 12:09) *
Так дело в том, что эта проверка в прерывании и проходит.
Код
if (EXTI_GetITStatus(EXTI_Line0) != RESET)

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

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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 31 2014, 09:51
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 387
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



А мне очень не нравится эта строчка
Цитата
if (flag)
{
flag = 0;
NVIC_EnableIRQ(TIM6_DAC_IRQn);
}

Зачем дергать NVIC (причем не правильно), когда лучше разрешать/запрещать прерывание в периферийном модуле (в данном случае TIM6 или DAC)?
Причем, обязательно сбросить флаг запроса прерывания, если он взведен, иначе тут же улетим в обработчик.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 31 2014, 11:16
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

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


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

ну так импульсы надо считать не прерыванием, а таймером. Берете таймер, и эти импулсы заводите как его клок (там есть много режимов, можно выбрать). Делаете счетчик вперед. Если появляются импульсы, таймер считает. Время от времени проверяете что он насчитал, что насчитал запоминаете, таймер сбрасываете. как то так
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 31 2014, 13:01
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 387
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Golikov A. @ Aug 31 2014, 15:16) *
ну это сено-соломаsm.gif Сколько тактов, нет таких данных? насколько от конца функции надо отодвигать сброс флага?
А если функция как заглушка только и сбрасывает флаг, надо нопов напихать или барьер какой что ли, типа __DSB();?

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

Цитата(Golikov A. @ Aug 31 2014, 15:16) *
ну так импульсы надо считать не прерыванием, а таймером. Берете таймер, и эти импулсы заводите как его клок (там есть много режимов, можно выбрать). Делаете счетчик вперед. Если появляются импульсы, таймер считает. Время от времени проверяете что он насчитал, что насчитал запоминаете, таймер сбрасываете. как то так

Вообще не гуд. Лучше уж EXTI. В момент сброса таймера может появиться импульс от купюрника. Проверять нужно периодически -- еще один таймер.
И опять же, это решение, не учитывающее форму импульса и его тайминги. Импульсная помеха легко может добавить сотню-другую денег на счет.
Go to the top of the page
 
+Quote Post
Plexus
сообщение Aug 31 2014, 15:07
Сообщение #30





Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710



Цитата(AHTOXA @ Aug 31 2014, 15:04) *
А, вон оно что... Тогда это не spurious. Если дребезг точно исключён, то, скорее всего, не успевает сброситься флаг прерывания до выхода из обработчика.
Вставьте строчку
Код
        __DSB();

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

Та функция вызывается непроизвольно не сразу после ее правильного вызова, т.е. проходит минут 5 и только после этого вызывается непроизвольно. Неужели флаг не успевает сброситься за 5 минут? )
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th December 2017 - 09:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016