-
- Результаты теста Evgeniy1294(178 знак., 16.03.2018 16:53)
- NVIC_ClearPendingIRQ, куда вы его поместили? - 0men(16.03.2018 16:57)
- Перед выходом из прерывания. - Evgeniy1294(16.03.2018 17:46)
- Цитата "не очищайте флаг, который очищается 1, операцией |=. Очищайте простым присваиванием =. А лечение повторного входа в прерывание барьером или фиктивным чтением EXTI_PR после очистки." De_User(1586 знак., 17.03.2018 00:45)
- т.е. у меня стоит EXTI->PR1|=0x01; неправильно? - Лагунов(17.03.2018 09:52)
- Неправильно. Заменяй на присваивание. - деЮзеру работка(17.03.2018 10:24, )
- вроде проблем не было ни разу, у меня там выскакивает импульс, по которому ввожу код нажатой клавиши (последовательный код) на эту же ножку, 16 импульсов. Потом разрешаю прерывание по этой ножке и жду следующего нажатия. Всегда срабатывает один Лагунов(31 знак., 17.03.2018 14:24)
- Так. Погоди. Мы говорим о exti->pr|=. Тогда не понимаю,что там за импульс выскакивает? Куда там ты вводишь и выводишь по 16 импульсов? Давай по шагам, на потеху AVRщикам, которые борются с таким сбросом флагов с 199х небось года. Смотри по шагам: ДеЮзеру работка(385 знак., 17.03.2018 15:15, )
- Я уже писал. Операция "|=" не является присваиванием. Она может не сбросить некоторые флаги. Например, флаги прерываний ETH так не сбросить, нужно строго использовать "=". evgeniy1294(40 знак., 17.03.2018 14:35)
- А еще луччи конечно битбандингом, сразу атомарность получишь. Актуально для общих для нескольких ресурсов регистров: разрешения тактирования, флаги EXTI - деЮзеру работка(17.03.2018 10:32, )
- В этом случае плошши. wek(335 знак., 17.03.2018 13:02)
- Я, знаете ли больше верю вышеуказанной фразе Use Cortex-M3 Bit-banding feature for interrupt clearing since it is an atomic operation and NVIC pending interrupts will be ignored during this operation, however Read-Modify-Write is not. Но готов ДеЮзеру работка(63 знак., 17.03.2018 13:58, )
- укажу - wek(18.03.2018 18:52, ссылка)
- А какое там еще может быть поведение? - LightElf(17.03.2018 18:35)
- "А может, гири не золотые?""А какие же они могут по-Вашему быть, Шура?":) Зачем гадать? Пока нет ни разъяснений авторов, ни свидетельств пострадавших от ЧМЗ (а помню такая битбандинг-паранойя полыхала еще в 2010-12гг), то просто считайте, что ДеЮзеру работка(175 знак., 17.03.2018 19:16, )
- "Writing to a word in the alias region has the same effect as a read-modify-write operation on the targeted bit in the bit-band region." (С) RM0090 Reference manual - LightElf(19.03.2018 20:26)
- "А может, гири не золотые?""А какие же они могут по-Вашему быть, Шура?":) Зачем гадать? Пока нет ни разъяснений авторов, ни свидетельств пострадавших от ЧМЗ (а помню такая битбандинг-паранойя полыхала еще в 2010-12гг), то просто считайте, что ДеЮзеру работка(175 знак., 17.03.2018 19:16, )
- Я, знаете ли больше верю вышеуказанной фразе Use Cortex-M3 Bit-banding feature for interrupt clearing since it is an atomic operation and NVIC pending interrupts will be ignored during this operation, however Read-Modify-Write is not. Но готов ДеЮзеру работка(63 знак., 17.03.2018 13:58, )
- В этом случае плошши. wek(335 знак., 17.03.2018 13:02)
- вроде проблем не было ни разу, у меня там выскакивает импульс, по которому ввожу код нажатой клавиши (последовательный код) на эту же ножку, 16 импульсов. Потом разрешаю прерывание по этой ножке и жду следующего нажатия. Всегда срабатывает один Лагунов(31 знак., 17.03.2018 14:24)
- Неправильно. Заменяй на присваивание. - деЮзеру работка(17.03.2018 10:24, )
- Спасибо. Ещё бы источник, может в этом ЧАВО ещё полезнящки есть. - Dingo(17.03.2018 04:37)
- Я понимаю, что вы имеете ввиду. Операция "|=" не является присваиванием, поэтому некоторые флаги она не сбросит. например ETH: evgeniy1294(487 знак., 16.03.2018 23:43)De_user
- т.е. у меня стоит EXTI->PR1|=0x01; неправильно? - Лагунов(17.03.2018 09:52)
- Цитата "не очищайте флаг, который очищается 1, операцией |=. Очищайте простым присваиванием =. А лечение повторного входа в прерывание барьером или фиктивным чтением EXTI_PR после очистки." De_User(1586 знак., 17.03.2018 00:45)
- Перед выходом из прерывания. - Evgeniy1294(16.03.2018 17:46)
- NVIC_ClearPendingIRQ, куда вы его поместили? - 0men(16.03.2018 16:57)
- А вот почему заходит при 0, я хз. Попробую сегодня повторить эксперимент, статистику соберу немного по другому. Только с обеда приду. evgeniy1294(404 знак., 16.03.2018 13:26)
- У меня такой исходник занимался статистикой Dingo(970 знак., 16.03.2018 13:32)
- Словил такой-же эффект на stm32f103. Нога ловила всё подряд, при нажатии кнопки (с кондёром) было 30-50 срабатываний. Решил грубой фильтрацией на системном таймере. evgeniy1294(142 знак., 16.03.2018 13:14)
- ну по кнопке обработка дребезга стандартная процедура, у st тоже есть фильтрация по входам для таймеров - AVF(16.03.2018 13:21)
- Там для любой ноги. На таймерах это неудобно делать, например, в моём устройстве входы таймеров и так заняты. Под EXTI я выделил отдельный порт (GPIOF) из-за особенностей настройки внешних прерываний. - evgeniy1294(16.03.2018 13:30)
- если для любой ноги, это круто, буду иметь вввиду - AVF(16.03.2018 14:04)
- Там для любой ноги. На таймерах это неудобно делать, например, в моём устройстве входы таймеров и так заняты. Под EXTI я выделил отдельный порт (GPIOF) из-за особенностей настройки внешних прерываний. - evgeniy1294(16.03.2018 13:30)
- ну по кнопке обработка дребезга стандартная процедура, у st тоже есть фильтрация по входам для таймеров - AVF(16.03.2018 13:21)
- если быстродействие в наносекунды не нужно, то лучше сделать не через прерывание по состоянию ноги, а опрос в таймере с хорошим дебаунсом. - Nikolay801_(16.03.2018 11:30)
- как раз проект перепиливаю с прерываний на опросы. Все прозрачнее. - VLLV(17.03.2018 19:18)
- +1 Для отладки как раз можно в прерывании проверить уровень несколько раз (для подавления дребезга), и только после этого устанавливать свой флаг "уже таки произошло прерывание" - AU08(16.03.2018 11:54 - 11:57)
- вроде у кортексов есть такая фича отложенные прерывания. Наверно что то вроде того что следующее событие происходит во время обработки предыдущего и после выхода из прерывания оно вызывается повторно, хотя флаг его вызывающий сброшен. Бывает что Nikolay801_(97 знак., 16.03.2018 11:27)
- Логически лучше всего подходит, но есть одна нестыковка: бит Pending сбрасывается в конце обработчика. Осциллограммы вы видите, звон если и есть, то не сильный. Dingo(402 знак., 16.03.2018 11:51)
- Два предположения: LightElf(108 знак., 16.03.2018 12:34)
- “1) После ClearPending поставить __DSB() 2) После __DSB() добавить принудительный сброс прерывания на NVIC” Sl(938 знак., 18.03.2018 12:01)
- 1) Какбэ да, но бывают нюансы. LightElf(169 знак., 19.03.2018 21:00)
- именно так это и происходит, поэтому тоже не оч понял про необходимость сброса на NVIC - 0men(19.03.2018 14:12)
- Спасибо! 1) После ClearPending поставить __DSB() - пофиксило. Можете объяснить, что там происходило в общих чертах? Про инструкцию прочитал, но понятней, в каких случаях они нужны, не стало. Dingo(47 знак., 16.03.2018 13:06 - 13:08)
- Вы делаете запись в регистр EXTI, данные пошли по D-Bus, а процессор пошел выполнять следующие команды. Регистры EXTI находятся на шине APB2. Тактовая частота этой шины отличается от тактовой частоты процессора, соответственно существует мост со LightElf(336 знак., 16.03.2018 16:00)
- Он может зайти в прерывание повторно. Так как заход повторный, EXTI->PR будет равен 0 (флаг снят при первом заходе), __DSB() не даёт этому произойти. evgeniy1294(31 знак., 16.03.2018 13:34)
- Даже если так, то: 1) для входа в прерывание надо сохранить регистры на стеке, потом их восстановить; 2) сброс флага производится в регистре периферии. И тем не менее эффект просочился через "вот это вот всё"? Отпишитесь о результате тестов, Dingo(12 знак., 16.03.2018 14:54)
- Да, конечно. - evgeniy1294(16.03.2018 14:57)
- Даже если так, то: 1) для входа в прерывание надо сохранить регистры на стеке, потом их восстановить; 2) сброс флага производится в регистре периферии. И тем не менее эффект просочился через "вот это вот всё"? Отпишитесь о результате тестов, Dingo(12 знак., 16.03.2018 14:54)
- “1) После ClearPending поставить __DSB() 2) После __DSB() добавить принудительный сброс прерывания на NVIC” Sl(938 знак., 18.03.2018 12:01)
- Два предположения: LightElf(108 знак., 16.03.2018 12:34)
- Логически лучше всего подходит, но есть одна нестыковка: бит Pending сбрасывается в конце обработчика. Осциллограммы вы видите, звон если и есть, то не сильный. Dingo(402 знак., 16.03.2018 11:51)
- Прерывание должно срабатывать по фронту? Помехи есть, насколько длинная линия этого PD6? - AU08(16.03.2018 10:35)
- Результаты теста Evgeniy1294(178 знак., 16.03.2018 16:53)