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

|
Требуется помошь в поиске проблемы. Непроизвольно срабатывает прерывание EXTI0_IRQHandler(). Нога подтянута к 3.3В резистором. И на нее подается импульс. Прерывание должно срабатывать по спаду. И срабатывает. Но время от времени, в обработчик залетает и выполняется проверка на EXTI_GetITStatus(EXTI_Line0). Импульсы в этот момент не поступают (слежу на осцилле). Что за магия такая? CODE void init_EXTI() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }
void init_NVIC() { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
int main(void) { RCC_Configuration(); init_timer();
init_EXTI(); init_NVIC();
NVIC_EnableIRQ(EXTI0_IRQn); NVIC_DisableIRQ(TIM6_DAC_IRQn);
while(1); }
void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
EXTI_ClearITPendingBit(EXTI_Line0); TIM_ClearITPendingBit(TIM6, TIM_IT_Update); TIM_SetCounter(TIM6, 0);
if (flag) { flag = 0; NVIC_EnableIRQ(TIM6_DAC_IRQn); } } }
Сообщение отредактировал IgorKossak - Aug 29 2014, 20:47
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Aug 29 2014, 10:43
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(Ant_m @ Aug 29 2014, 16:45)  А на GPIO 0 port B, С, D что происходит? Ничего. Я использую STM32VLDiscovery. Единственное, я удалил из вышепреведенного кода настройку таймера и настройку светодиодов на PC8 и PC9. Срабатывание происходит само по себе, когда плата лежит и ее никто не касается. Порт был настроен так: Код RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_WriteBit(GPIOC, GPIO_Pin_8 | GPIO_Pin_9, Bit_SET); Это же не значит, что ошибка в том, что я указал GPIO_Pin_8 | GPIO_Pin_9 вместо GPIO_Pin_All?
|
|
|
|
|
Aug 30 2014, 05:01
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Т.е. достаточно настроить все GPIO и проблема пропадет?
Кто еще сталкивался с этой проблемой? Если есть ссылки на топики - поделитесь, пожалуйста.
|
|
|
|
|
Aug 30 2014, 05:55
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
где то краем ухо я слышал про ложные срабатывания прерываний, этим грешили процы от ST, вот типа http://electronix.ru/forum/index.php?showt...%E2%E0%ED%E8%E5и в других контекстах слышал. эта тема про UART, про пины вроде тоже проходило где то... Другое дело что надо сначала все верно настроить, чтобы в регистрах было то что надо, а не дергая странные индуские функции. Многие из них очень плохо написаны. И только потом уже верить в ложное срабатывание.
|
|
|
|
|
Aug 30 2014, 09:56
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(adnega @ Aug 30 2014, 15:57)  Правильнее называть те прерывания "повторными". Это, скорее, грех Cortex-M, чем ST. Хорошо. А этого можно как-то избежать? Это лечится? Как другие разработчики решали подобные проблемы?
|
|
|
|
|
Aug 30 2014, 10:16
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Plexus @ Aug 30 2014, 13:56)  Хорошо. А этого можно как-то избежать? Это лечится? Как другие разработчики решали подобные проблемы? Это не ваш случай. Попробуйте ногу посадить железно на 3.3В. Попробуйте настроить EXTI на другой вывод. Если и в этом случае будут вызовы, то ищем в одном месте, если пропадут, то в другом, например, в ES Цитата A low-amplitude voltage glitch may be generated (on ADC input 0) on the PA0 pin, when the ADC is converting with injection trigger. It is generated by internal coupling and synchronized to the beginning and the end of the injection sequence, whatever the channel(s) to be converted. Кста, уSTM32VLDiscovery на PA0 сидит кнопка. Если вы имеете дребезг по нажатию/отпусканию кнопки, то это третий случай.
|
|
|
|
|
Aug 30 2014, 10:24
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(adnega @ Aug 30 2014, 17:16)  Это не ваш случай. Попробуйте ногу посадить железно на 3.3В. Попробуйте настроить EXTI на другой вывод. Если и в этом случае будут вызовы, то ищем в одном месте, если пропадут, то в другом, например, в ES
Кста, уSTM32VLDiscovery на PA0 сидит кнопка. Если вы имеете дребезг по нажатию/отпусканию кнопки, то это третий случай. Зачем сажать на 3.3В? У меня и так подтяжка железно через резистор на 3.3В, а не программно. Что вы имеете в виду? Буду на другом выводе юзать, но я должен быть уверен, что все работает как часы. А ждать самопроизвольного срабатывания - очень долго. Не всегда ж срабатывает. Дребезг исключен 100%. Проверка и на осцилле была и физически дребезг исключен. Подключение через транзистор на землю.
|
|
|
|
|
Aug 30 2014, 14:41
|

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

|
Цитата(adnega @ Aug 30 2014, 14:57)  Правильнее называть те прерывания "повторными". Это, скорее, грех Cortex-M, чем ST. Не, spurious - это как раз "ложные". Они не обязательно повторные, просто прерывание без причины. Цитата(Golikov A. @ Aug 30 2014, 20:16)  самое правильное, при прерывании проверять флаг, что именно от этой ноги все получилось, иначе игнорировать прерывание. Вот именно. Цитата(Golikov A. @ Aug 30 2014, 20:16)  но что-то тьфу тьфу тьфу на лпц не замечал такого.... Гы. AN10414 Handling of spurious interrupts in the LPC2000
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 30 2014, 18:41
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(Golikov A. @ Aug 30 2014, 21:16)  самое правильное, при прерывании проверять флаг, что именно от этой ноги все получилось, иначе игнорировать прерывание. Если это правда беда кортекса-М, но что-то тьфу тьфу тьфу на лпц не замечал такого.... А какой именно флаг проверять? Разве в моем коде обработчик не полный?
|
|
|
|
|
Aug 30 2014, 19:11
|

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

|
Цитата(Golikov A. @ Aug 30 2014, 21:06)  ну он же не кортекс-м... Ну так spurious interrupt - это не кортексо-специфическая штука. Откуда рождается - вопрос сложный, покрытый мраком  Возможно, что очень сложный контроллер прерываний, и не всегда всё успевает сбрасываться. Возможно ещё что-то. Главное, что жить это не мешает. Цитата(adnega @ Aug 30 2014, 21:53)  Согласен. У кортексов и контроллер прерываний совсем другой. Про ложные срабатывания (даже на STM32) ничего не слышал за более чем 4 года использования в серийном производстве (~ 100 изделий в месяц) на STM32F100/103/107/407. Погуглите "spurious interrupt stm32", найдёте изрядно примеров. К тому же, если у вас в процедурах обработчиков прерывания есть проверка флага прерывания на входе, то вы это ложное прерывание никак и не заметите. Особенно в производстве  Цитата(Plexus @ Aug 31 2014, 00:41)  А какой именно флаг проверять? Разве в моем коде обработчик не полный? У вас всё правильно, так и надо.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 30 2014, 19:22
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(AHTOXA @ Aug 30 2014, 23:11)  Погуглите "spurious interrupt stm32", найдёте изрядно примеров. К тому же, если у вас в процедурах обработчиков прерывания есть проверка флага прерывания на входе, то вы это ложное прерывание никак и не заметите. Флаги на входе конечно же обрабатываю. Я знаю как минимум два источника "ложных" прерываний: 1. Не сброшены флаги отложенных прерываний в NVIC и/или периферийного модуля при разрешении прерывания от этого модуля; 2. Очистка бита запроса прерывания от периферийного модуля в самом конце обработчика прерывания от этого модуля. ST в этих случаях совершенно ни при чем, и косяк целиком программиста. В то, что прерывание может само по себе возникнуть - не верю. Ибо для всех неиспользуемых прерываний у меня заглушка, и я ни разу в нее не влетал. Или речь идет только о разрешенных прерываниях?
|
|
|
|
|
Aug 30 2014, 21:30
|

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

|
Цитата(adnega @ Aug 31 2014, 01:22)  Флаги на входе конечно же обрабатываю. Тогда вы ничего не можете утверждать наверняка  Поставьте в каждом прерывании по два счётчика, один увеличивайте при входе в прерывание, второй - после успешной проверки флага. И через пару месяцев прогона на сотнях своих устройств снимите показания. Это будет хоть что-то. Хотя даже в этом случае отсутствие ложных прерываний не будет говорить о том, что их не бывает  Цитата(adnega @ Aug 31 2014, 01:22)  Я знаю как минимум два источника "ложных" прерываний: Да, эти два вида конечно наиболее распространены. Но есть и другие. Лично сталкивался с возникновением прерывания от DMA при отключении канала в F4. Вот аналогичный случай. Наверняка есть ещё (не зря же во всех примерах от ST во всех обработчиках прерываний стоят проверки флагов, даже когда источник прерывания гарантированно один-единственный). Смысла копать глубже не вижу, проверка флагов решает проблему. ЗЫ. Речь конечно только о разрешённых прерываниях.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 31 2014, 06:09
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(AHTOXA @ Aug 31 2014, 02:11)  У вас всё правильно, так и надо. Так дело в том, что эта проверка в прерывании и проходит. Код if (EXTI_GetITStatus(EXTI_Line0) != RESET) Самопроизвольно выполняется это условие. Если цеплять купюроприемник и в обработчике прерывания инкрементировать каждый импульс (сумму денег), то через некоторое время самопроизвольно отработает обработчик прерывания, и приплюсуется лишняя сумма денег. Как быть?
|
|
|
|
|
Aug 31 2014, 06:26
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(Golikov A. @ Aug 31 2014, 13:18)  а полингом проверить состояние пина нельзя? Кстати а сумму откуда узнаете или этот девайс сумму импульсами сообщает? Может правильнее этот импульс повесить на таймер, счетчиком, пусть в железе само считается чего на прерывания то реагировать? Закидываешь 50 руб - 5 импульсов, 100 руб - 10 импульсов, и т.д. Ширина импульса 50 мс. В обычном состоянии логическая "1". Поэтому настроил прерывание на спад. Я так понял, можно эти импульсы как-то таймерам продвинутыми считать? Я не смог пример найти.
|
|
|
|
|
Aug 31 2014, 06:31
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Plexus @ Aug 31 2014, 10:09)  Если цеплять купюроприемник и в обработчике прерывания инкрементировать каждый импульс (сумму денег), то через некоторое время самопроизвольно отработает обработчик прерывания, и приплюсуется лишняя сумма денег. Как быть? Либо опросом с защитой от дребезга, либо выбрать купюроприемник с управлением по RS232. Я импульсы от купюро/монетоприемников делал опросом - там скорость импульсов совсем никакая. Потом перешли на управление по RS232, ибо 5000 купюра очень на долго парализует аппарат. Цитата(Golikov A. @ Aug 31 2014, 10:18)  кстати про сброс прерывания в самом конце,насколько в конце? Прям последняя команда? Я так понимаю это вариант когда флаг не успевает сброситься до выхода? Сколько команд сбрасывается флаг? Флаг в периферийном модуле сбрасывается мгновенно, но пока реакция дойдет до NVIC... может не успеть до выхода из прерывания, и NVIC после выхода тут же попадает в прерывание снова.
|
|
|
|
|
Aug 31 2014, 06:43
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(adnega @ Aug 31 2014, 13:31)  Либо опросом с защитой от дребезга, либо выбрать купюроприемник с управлением по RS232. Я импульсы от купюро/монетоприемников делал опросом - там скорость импульсов совсем никакая. Потом перешли на управление по RS232, ибо 5000 купюра очень на долго парализует аппарат. Дребезг исключен - проверяли на осциллографе. А с 5000 купюрой действительно долго )
|
|
|
|
|
Aug 31 2014, 06:58
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Plexus @ Aug 31 2014, 10:43)  Дребезг исключен - проверяли на осциллографе. А с 5000 купюрой действительно долго ) Смотря что считать дребезгом... Если вместо 50мс импульса придет 30 мс?! Мы в свое время решили так: если контроль ослабить, то будут лишние импульсы - пользователь получает лишние услуги и, естественно, не будет об этом сообщать и тем более оплачивать. Если контроль за импульсами усилить, то некоторые импульсы пропадут - пользователь это заметит и сообщит администратору - администратор решит вопрос. Правда, у нас особенность - музыкальные аппараты в барах и т.п. - т.е. администратор есть, услуга в виде проигрывания песни, т.е. убыток не настоящий. Другое дело платежные терминалы.
|
|
|
|
|
Aug 31 2014, 08:04
|

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

|
Цитата(Plexus @ Aug 31 2014, 12:09)  Так дело в том, что эта проверка в прерывании и проходит. Код if (EXTI_GetITStatus(EXTI_Line0) != RESET) Самопроизвольно выполняется это условие. А, вон оно что... Тогда это не spurious. Если дребезг точно исключён, то, скорее всего, не успевает сброситься флаг прерывания до выхода из обработчика. Вставьте строчку Код __DSB(); после очистки флага прерывания, всё должно пройти.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 31 2014, 09:51
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
А мне очень не нравится эта строчка Цитата if (flag) { flag = 0; NVIC_EnableIRQ(TIM6_DAC_IRQn); } Зачем дергать NVIC (причем не правильно), когда лучше разрешать/запрещать прерывание в периферийном модуле (в данном случае TIM6 или DAC)? Причем, обязательно сбросить флаг запроса прерывания, если он взведен, иначе тут же улетим в обработчик.
|
|
|
|
|
Aug 31 2014, 11:16
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Флаг в периферийном модуле сбрасывается мгновенно, но пока реакция дойдет до NVIC... может не успеть до выхода из прерывания, и NVIC после выхода тут же попадает в прерывание снова. ну это сено-солома  Сколько тактов, нет таких данных? насколько от конца функции надо отодвигать сброс флага? А если функция как заглушка только и сбрасывает флаг, надо нопов напихать или барьер какой что ли, типа __DSB();? Цитата Закидываешь 50 руб - 5 импульсов, 100 руб - 10 импульсов, и т.д ну так импульсы надо считать не прерыванием, а таймером. Берете таймер, и эти импулсы заводите как его клок (там есть много режимов, можно выбрать). Делаете счетчик вперед. Если появляются импульсы, таймер считает. Время от времени проверяете что он насчитал, что насчитал запоминаете, таймер сбрасываете. как то так
|
|
|
|
|
Aug 31 2014, 13:01
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Golikov A. @ Aug 31 2014, 15:16)  ну это сено-солома  Сколько тактов, нет таких данных? насколько от конца функции надо отодвигать сброс флага? А если функция как заглушка только и сбрасывает флаг, надо нопов напихать или барьер какой что ли, типа __DSB();? Ага, барьера хватает. Цитата(Golikov A. @ Aug 31 2014, 15:16)  ну так импульсы надо считать не прерыванием, а таймером. Берете таймер, и эти импулсы заводите как его клок (там есть много режимов, можно выбрать). Делаете счетчик вперед. Если появляются импульсы, таймер считает. Время от времени проверяете что он насчитал, что насчитал запоминаете, таймер сбрасываете. как то так Вообще не гуд. Лучше уж EXTI. В момент сброса таймера может появиться импульс от купюрника. Проверять нужно периодически -- еще один таймер. И опять же, это решение, не учитывающее форму импульса и его тайминги. Импульсная помеха легко может добавить сотню-другую денег на счет.
|
|
|
|
|
Aug 31 2014, 15:07
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(AHTOXA @ Aug 31 2014, 15:04)  А, вон оно что... Тогда это не spurious. Если дребезг точно исключён, то, скорее всего, не успевает сброситься флаг прерывания до выхода из обработчика. Вставьте строчку Код __DSB(); после очистки флага прерывания, всё должно пройти. Та функция вызывается непроизвольно не сразу после ее правильного вызова, т.е. проходит минут 5 и только после этого вызывается непроизвольно. Неужели флаг не успевает сброситься за 5 минут? )
|
|
|
|
|
Aug 31 2014, 20:11
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Golikov A. @ Aug 31 2014, 21:04)  мне кажется у вас все таки проходит какая - то помеха. Может не нога дергается, а земля к примеру прыгает. Согласен более чем полностью. Землю осциллографа тоже ведь по разному подключить можно... Насколько я понимаю конструкцию, это (купюроприемник) некий блок, в котором находятся несколько двигателей, несколько излучающих диодов, видеодетекторов, могучий DSP для обработки, а на выходе импульсный сигнал по проводу на несколько десятков сантиметров в окружении другого электрооборудования. Как правило, провод не экранирован и возвратная земля проходит "черт знает где". А если есть GSM-модем внутри, то при обмене с базовой станцией он может наводить в этот контур приличную помеху. Сюжетов можно придумать много. Я советовал железно замкнуть PA0 на 3.3В и, убедившись, что прерываний не возникает, искать проблемы в схемотехнике. А резистор подтяжки линии с open drain где установлен? На стороне ключа или на стороне приемника?
|
|
|
|
|
Sep 1 2014, 02:47
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(adnega @ Sep 1 2014, 03:11)  А резистор подтяжки линии с open drain где установлен? На стороне ключа или на стороне приемника? Резистор со стороны приемника. Тестирую, как вы и сказали - без купюроприемника, с подтяжкой на выводе PA0 для исключения помех/дребезга со стороны купюроприемника.
|
|
|
|
|
Sep 1 2014, 06:36
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
1. Есть еще образец платы, вдруг именно на этой какой не пропай в резюке, к примеру. Или у него тепловой шум такой...
2. Проверьте и напишите значения регистров конфигурации, не то что вы функциями делаете, а прям реальное значение этих регистров
3. Уберите все переключения в программе после окончания конфигурации, вы спокойно можете какими-то функциями горе библиотеки от СТМ чего то еще подключать по ходу дела, то есть вызываете для включения 6 таймера, а ставиться может любой бит
4. if (EXTI_GetITStatus(EXTI_Line0) != RESET) - вот это замените пожалуйста на temp_reg = Значение регистра флагов. if((temp_reg & НУЖНЫЙ_ПИН) != 0) Потому что внешние прерывание принимает прерывание от 18 источников, 16 из них ноги, а 2 источника это будильник и PVD (че такое кстати ?). Ваша проверка смотрит только на то что было внешние прерывание, но она не смотрит на то какой пин или что его вызывало. Да и вообще полезно для отладки попечатать состояние флагов, мало ли что там как... Кроме прерываний есть же еще и еванты
В общем общие рекомендации при поиски магии, устраните все ее источники в виде дурных библиотек. Работайте напрямую с регистрами проца. Это часто более быстро, и всегда более безопасно и определено!
|
|
|
|
|
Sep 1 2014, 07:14
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Golikov A. @ Sep 1 2014, 08:36)  4. if (EXTI_GetITStatus(EXTI_Line0) != RESET) - вот это замените пожалуйста на temp_reg = Значение регистра флагов. Потому что внешние прерывание принимает прерывание от 18 источников, 16 из них ноги, а 2 источника это будильник и PVD (че такое кстати ?). Ваша проверка смотрит только на то что было внешние прерывание, но она не смотрит на то какой пин или что его вызывало. Вот эту тему тоже высказать хотел. Присоединяюсь и настоятельно рекомендую разобраться со всеми ногами, которые обрабатываются _Line0. Это же вроде все типа PA0, PB0, и т.д.? Достаточно какой-то ноге из этой гвардии быть высокоомным входом (что именно и имеет место быть при рестарте процессора), как помехи гарантированы. Посему, влетая в прерывание, читайте еще состояние именно той ножки порта, которая прерывание вызвать должна была. P.S. не могу удержаться: заголовок темы уж очень медицинские термины напоминает, особенно слово "непроизвольное" и "прерывание". Фантазия пустилась в пляс...
Сообщение отредактировал KnightIgor - Sep 1 2014, 07:19
|
|
|
|
|
Sep 1 2014, 07:55
|

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

|
Цитата(Golikov A. @ Sep 1 2014, 12:36)  4. if (EXTI_GetITStatus(EXTI_Line0) != RESET) - вот это замените пожалуйста на temp_reg = Значение регистра флагов. if((temp_reg & НУЖНЫЙ_ПИН) != 0) Потому что внешние прерывание принимает прерывание от 18 источников, 16 из них ноги, а 2 источника это будильник и PVD (че такое кстати ?). Ваша проверка смотрит только на то что было внешние прерывание, но она не смотрит на то какой пин или что его вызывало. Вообще-то смотрит, видите параметр EXTI_Line0 - это как раз оно. Цитата(KnightIgor @ Sep 1 2014, 13:14)  Присоединяюсь и настоятельно рекомендую разобраться со всеми ногами, которые обрабатываются _Line0. Это же вроде все типа PA0, PB0, и т.д.? Нет. Там в конфигурации задаётся порт для данной ножки. (GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0)) ЗЫ. Эх вы, библиотекофобы  Я тоже не пользую SPL, но хоть примерно знаю, как она работает. (Врага надо знать в лицо!  )
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 1 2014, 08:59
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Цитата(KnightIgor @ Sep 1 2014, 14:14)  P.S. не могу удержаться: заголовок темы уж очень медицинские термины напоминает, особенно слово "непроизвольное" и "прерывание". Фантазия пустилась в пляс... Если честно, я подумывал об этом же, когда писал. Но, спасибо что заметили, поржал на работе в голос... Хорошо, рядом никого не было (:
|
|
|
|
|
Sep 1 2014, 10:34
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(AHTOXA @ Sep 1 2014, 09:55)  Нет. Там в конфигурации задаётся порт для данной ножки. (GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0)) Да, да, это я перепутал. Нельзя одновременно использовать в качестве входов для внешних прерываний ножки разных портов того же номера. То есть, PA0 и PB0 не получится использовать одновременно, что накладывает существенные ограничения схемотехнику: если надо несколько внешних прерываний, надо раскидывать их на разные индексы. И снова автору топика: как говорил один наш доцент, вся дрянь от - источников питания. Где-то шумит масса, видать. Может повесить кондерчик с ноги на массу?
|
|
|
|
|
Sep 1 2014, 12:29
|

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

|
Цитата(Golikov A. @ Sep 1 2014, 17:41)  Да я вроде предложил ему привести что получилось в регистрах после всего сделанного. Даже если оставить функции в покое вроде бы проверить это имеет смысл. Функции функциями, а состояние регистров определяет работу схемы. Вы всерьёз думаете, что ошибка в библиотечных функциях? Причём в функциях конфигурирования, которыми пользуется огромное количество народа? Цитата(Golikov A. @ Sep 1 2014, 17:41)  И мне до сих пор кажется что я помогаю... Почитайте тред сначала, посчитайте, сколько пурги вы нагнали и окститесь. Даже если среди ваших предложений и есть здравое зерно, то отыскать его практически невозможно.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 1 2014, 12:42
|
Группа: Участник
Сообщений: 13
Регистрация: 21-01-09
Пользователь №: 43 710

|
Господа, да вы что в самом то деле? Для меня любая помощь в радость. На то и нужен мозговой - кто в какой области силен - железо, прошивка.
Пока сделал костыль - таймером опрашиваю ножку каждые 10 мс. Но выяснить нужно где непорядок. Сегодня начал смотреть регистры.
|
|
|
|
|
May 9 2017, 08:30
|
Группа: Участник
Сообщений: 6
Регистрация: 9-05-17
Пользователь №: 96 967

|
Столкнулся с похожей проблемой что и автор топика. Контроллер STM32F100RB на плате STM32VLDISCOVERY. На плате имеется штатная кнопка USER при нажатии на которую на ножку PA0 подаётся высокий уровень (2.9V - питание контроллера). Ножка PA0 изначально подтянута внешним резистором к общему проводу (к земле). Мне хочется чтобы при нажатии срабатывало прерывание EXTI и светодиод LD3 менял своё состояние на противоположное. Пример как можно видеть простейший и всё работает как и задумано, но есть БОЛЬШАЯ проблема с устойчивостью всей этой системы. При любом касании ножки PA0 металлическим пинцетом или щупом мультиметра происходит прерывание. Ничего подобного на других МК мною раньше не наблюдалось. Как пробовал бороться: 1. Проверил подтяжку ножки осцилогафом - при касании уровень не меняется (или осцилографф не успевает это зафиксировать). Попробовал подтянуть через резистор меньшего номинала (вплоть до 100 Ом) - НЕ ПОМОГАЕТ 2. Пробовал ставить RC фильтр на ножку (100 Ом 100 нФ) - НЕ ПОМОГАЕТ. 3. Пробовал менять процедуру инициализации ножки и внешнего прерывания. Вместо SPL пробовал инициализацию через прямую запись в регистры - НЕ ПОМОГАЕТ. Также пробовались разные варианты инициализации из разных примеров/форумов/руководств - НЕ ПОМОГАЕТ. 4. Пробовал другие линии EXTI и другие ножки МК - НЕ ПОМОГАЕТ. Устойчивость достигается только в одном случае - при прямой (без резистора) подтяжке ноги к питанию или земле. Тогда реакции на касания пинцетом нет. Сомнений в качестве разводки платы быть не может. Всё-таки это фирменная плата от STM. Поведение МК абсолютно не поддаётся логике и если честно уже начинают опускаться руки. В процессе поиска решения натыкался на темы форумов где описывались похожие глюки этих МК судя по всему авторам так и не смогли помочь с этим. Вообще какая-то засада... Схема платы  Код проекта. IDE CooCox 1.7.8 CODE #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_exti.h" #include "misc.h"
void EXTI_USER_Button_init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// Set pin PA0 as input GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
// Tell system that you will use PA0 for EXTI_Line0 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitTypeDef EXTI_InitStructure; // PA0 is connected to EXTI_Line0 EXTI_InitStructure.EXTI_Line = EXTI_Line0; // Interrupt mode EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // Triggers on rising edge EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // Enable interrupt EXTI_InitStructure.EXTI_LineCmd = ENABLE; // Add to EXTI EXTI_Init(&EXTI_InitStructure);
// Add IRQ vector to NVIC NVIC_InitTypeDef NVIC_InitStruct; // PA0 is connected to EXTI_Line1, which has EXTI0_IRQn vector NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // Set priority NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; // Set sub priority NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; // Enable interrupt NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // Add to NVIC NVIC_Init(&NVIC_InitStruct); }
int main(void) { // Инициализируем светодиоды LD3 и LD4 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; // PC8 - LD4, PC9 - LD3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // Set pin PC8 and PC9 as output GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_9); GPIO_SetBits(GPIOC,GPIO_Pin_8);
EXTI_USER_Button_init();
while(1) { // } }
void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) // Judge whether a line break { GPIOC->ODR ^= GPIO_Pin_9; for(uint32_t i = 0; i < 500000; i++); // Simple delay } EXTI_ClearITPendingBit(EXTI_Line0); // Remove LINE interrupt flag bit }
Сообщение отредактировал IgorKossak - May 9 2017, 10:07
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
May 9 2017, 12:04
|
Группа: Участник
Сообщений: 6
Регистрация: 9-05-17
Пользователь №: 96 967

|
Цитата(scifi @ May 9 2017, 11:01)  Вы в курсе, что есть такая штука, как дребезг металлического контакта? Самый простой способ бороться с ним - не опрашивать состояние кнопки после его изменения в течение 50-100 мс. Это автоматически реализуется, если состояние кнопки опрашивается с периодом 50-100 мс. Если вам так нравится прерывание, можно запрещать прерывание на это время, используя таймер и его прерывание, но это просто лишний геморрой. Про дребезг контактов и методы борьбы с ним мне известно, но то что я описываю это не дребезг. Прерывание срабатывает именно от касания (не замыкание на на что либо!) вывода МК любым металлическим предметом (палец такого эффекта не даёт). При этом не спасает даже подтяжка вывода к питанию или земле через резистор. Программно в обработчике прерывания удалось отследить что это всё-таки не случайность, а кратковременное изменение уровня на ножке при касании проводящим предметом. Удивляет поразительная чувствительность STM32 к такому. Тот же AVR на такое никогда не реагировал. И как в таком случае мерить потенциал на ножке если любое касание её даже щупом тестера вызывает подобные эффекты?
Сообщение отредактировал ISF - May 9 2017, 12:09
|
|
|
|
|
May 9 2017, 12:26
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(ISF @ May 9 2017, 11:30)  При любом касании ножки PA0 металлическим пинцетом или щупом мультиметра происходит прерывание. Ничего подобного на других МК мною раньше не наблюдалось. .... Тот же AVR на такое никогда не реагировал. И как в таком случае мерить потенциал на ножке если любое касание её даже щупом тестера вызывает подобные эффекты? Удивительные вещи вы пишете, в том плане, что такого раньше не наблюдали. А я вот обратного никогда не наблюдал. Если коснуться металлическим пинцетом (если он еще и не изолированный, и в руке, то еще похлеще будет) высокоомной ножки МК, там помеха будет в десятки вольт. Ограничена будет только входными защитными диодами МК. И на осциллографе это тоже прекрасно видно. Тестером измерять можно, но помеху при касании никто не отменит и прерывание все равно произойдет. Вы бы еще начали касаться контактов кварцевого генератора и удивляться, что программа улетает неизвестно куда...
|
|
|
|
|
May 9 2017, 12:45
|
Знающий
   
Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458

|
Вы все про высокое, а причина может быть намного проще - и в SPL и в HAL до сих пор есть элементарная ошибка - при совместном использовании ног порта могут менятся "не свои" пины. Например функция установки бита может быть прописана как GPIOx->ODR |= 0b0001000... т.е. последовательность - чтение, модификация, запись. Если при этом будет прерывание и в нем будет изменен другой бит - произойдет ошибка - восстановится его старое значение. Для предотвращения этого нужно использовать либо запрет прерываний, либо специальный регистр BSRR, сделанный специально для того, чтобы сделать операции установки/сброса бит атомарными.
В последних версиях SPL и HAL установка и сброс бита уже сделаны правильно (через BSRR), а вот операция toggle - по прежнему GPIOx->ODR ^= ...
Проверьте весь код на наличие работы с отдельными битами GPIO не через BSRR.
Понятно, что EXTI работает не с ODR, а с IDR, но точной реализации харда GPIO нет, так что стоит проверить, мало-ли что.
|
|
|
|
|
May 9 2017, 13:19
|
Группа: Участник
Сообщений: 6
Регистрация: 9-05-17
Пользователь №: 96 967

|
Цитата(Baser @ May 9 2017, 13:26)  Удивительные вещи вы пишете, в том плане, что такого раньше не наблюдали. А я вот обратного никогда не наблюдал. Если коснуться металлическим пинцетом (если он еще и не изолированный, и в руке, то еще похлеще будет) высокоомной ножки МК, там помеха будет в десятки вольт. Ограничена будет только входными защитными диодами МК. И на осциллографе это тоже прекрасно видно. Тестером измерять можно, но помеху при касании никто не отменит и прерывание все равно произойдет. Вы бы еще начали касаться контактов кварцевого генератора и удивляться, что программа улетает неизвестно куда... Почему же тогда на моей отладочной плате с ATmega16A подобных приколов с прерываниями нет и в помине. Касаюсь я щупом или пинцетом или нет всё работает устойчиво и чётко. К тому же я уже раз 5 повторил что ножка никакая не высокоомная - она ПОДЯТНУТА к питанию или земле через резистор. При поиске решения я испытывал даже 100 Ом в качестве подтягивающего резистора и эффект ничуть меньше не становился. К тому же я уже писал что подобную проблему на STM32 наблюдали и раньше, но тогда всё списали на плохую разводку и на этом всё и заглохло http://forum.easyelectronics.ru/viewtopic....76&start=50Крутаните до 3 страницы (последнее сообщение) - там человек описывает ровно туже проблему Цитата(rudy_b @ May 9 2017, 13:45)  Вы все про высокое, а причина может быть намного проще - и в SPL и в HAL до сих пор есть элементарная ошибка - при совместном использовании ног порта могут менятся "не свои" пины. Например функция установки бита может быть прописана как GPIOx->ODR |= 0b0001000... т.е. последовательность - чтение, модификация, запись. Если при этом будет прерывание и в нем будет изменен другой бит - произойдет ошибка - восстановится его старое значение. Для предотвращения этого нужно использовать либо запрет прерываний, либо специальный регистр BSRR, сделанный специально для того, чтобы сделать операции установки/сброса бит атомарными.
В последних версиях SPL и HAL установка и сброс бита уже сделаны правильно (через BSRR), а вот операция toggle - по прежнему GPIOx->ODR ^= ...
Проверьте весь код на наличие работы с отдельными битами GPIO не через BSRR.
Понятно, что EXTI работает не с ODR, а с IDR, но точной реализации харда GPIO нет, так что стоит проверить, мало-ли что. Спасибо за совет. Нужно будет внимательно проверить. Версия CooCox у меня далеко не новая. Возможно библиотеки действительно с багами. Хотя я пробовал инициализацию через прямой доступ к регистрам и это не дало положительного результата..
Сообщение отредактировал ISF - May 9 2017, 13:15
|
|
|
|
|
May 9 2017, 13:59
|
Группа: Участник
Сообщений: 6
Регистрация: 9-05-17
Пользователь №: 96 967

|
Цитата(amiller @ May 9 2017, 14:20)  По моему STM ведёт себя абсолютно правильно. Фронт есть - прерывание должно быть. Вообще кнопки и прерывания по входу - вещи плохо сочетаемые. В реальных условиях (при наличии помех) гарантируются случайные срабатывания. Правильно будет - опрашивать с определенной частотой. И если из 100 опросов больше 50 единиц, значит кнопка нажата. И посмотрите на наличие на плате конденсатора C22. Похоже его нет. Если поставить примерно 100n, то в Вашем случае должно помочь. Согласен что кнопка и прерывание = неудачное решение, но тут даже до нажатия кнопки дело не доходит. Достаточно просто коснуться вывода PA0 щупом тестера для замера напряжения и БАЦ!, получите прерывание. Я бы ещё понял если бы вывод болтался без подтяжки в воздухе и я его касался проводником - тут уж без вариантов будет многократное срабатывание прерывания от наводок, емкости щупов и т.п. Но почему себя так ведёт полностью обвязанный и прикрытый от всех случайностей вывод мне совершенно неясно ( Конденсатора C22 на плате нет, но я специально проверял на выводе PA1 схему с внешней подтяжкой и полной RC цепью - результат отрицательный, лучше не становиться. Вот проверенные мною варианты. Подтягивающий резистор менял от 100 Ом до 10к
|
|
|
|
|
May 9 2017, 14:55
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(ISF @ May 9 2017, 16:19)  К тому же я уже писал что подобную проблему на STM32 наблюдали и раньше, но тогда всё списали на плохую разводку и на этом всё и заглохло ... Крутаните до 3 страницы (последнее сообщение) - там человек описывает ровно туже проблему Просмотрел по диагонали предыдущие страницы - не обнаружил той же проблемы. Человек жаловался на самопроизвольное возникновение прерываний. В его случае причин может быть много, о чем и была дельная дискуссия. В вашем же случае, вы сами касаетесь пинцетом ножки и удивляетесь, почему возникает прерывание. Это же тест на электростатический разряд "Human Body Model" (HBM), там киловольты могут быть. Не выбивает ножку МК - и хорошо, производитель ничего больше и не обещал. Цитата Почему же тогда на моей отладочной плате с ATmega16A подобных приколов с прерываниями нет и в помине. Касаюсь я щупом или пинцетом или нет всё работает устойчиво и чётко. возможно: - питание 5В - частота низкая, аппаратная выборка ножки редкая + аппаратный фильтр - была программная обработка дребезга в прерывании, когда в прерывание попадаете, но действия не происходит из-за фильтрации - какие-нибудь еще нюансы забыли, как все делали... Цитата(ISF @ May 9 2017, 16:59)  Достаточно просто коснуться вывода PA0 щупом тестера для замера напряжения и БАЦ!, получите прерывание. Я бы ещё понял если бы вывод болтался без подтяжки в воздухе и я его касался проводником - тут уж без вариантов будет многократное срабатывание прерывания от наводок, емкости щупов и т.п. Но почему себя так ведёт полностью обвязанный и прикрытый от всех случайностей вывод мне совершенно неясно ( "полностью обвязанный и прикрытый от всех случайностей вывод" - это когда вы касаетесь пинцетом перед защитой, где кнопка подключена. Когда вы касаетесь прямо на ножку, защита тут не причем, получаете тест ESD
|
|
|
|
|
May 9 2017, 15:05
|
Частый гость
 
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612

|
Цитата(ISF @ May 9 2017, 17:59)  Согласен что кнопка и прерывание = неудачное решение, но тут даже до нажатия кнопки дело не доходит. Достаточно просто коснуться вывода PA0 щупом тестера для замера напряжения и БАЦ!, получите прерывание. Я бы ещё понял если бы вывод болтался без подтяжки в воздухе и я его касался проводником - тут уж без вариантов будет многократное срабатывание прерывания от наводок, емкости щупов и т.п. Но почему себя так ведёт полностью обвязанный и прикрытый от всех случайностей вывод мне совершенно неясно ( Почему то мне кажется, что во время экспериментов плата у Вас не заземлена, а на запястье нет браслета для снятия статики. А значит в момент касания Вы подключаете к выводу микросхемы конденсатор на несколько десятков пикофарад, заряженный до нескольких киловольт. Это эквивалент Вашего тела в достаточно сухом воздухе, если что. А далее получается емкостной делитель, где ток разряда Вашей емкости заряжает емкость на входе. И вполне может быть, что эквивалентное напряжение на входе превысит логический уровень. А если бы это был просто висячий вход, то таким образом легко его убить. Недаром всех монтажников заставляют браслеты одевать и работать заземленным инструментом. Бывает, что у некоторых процессоров есть система внутренней синхронизации, которая не пропускает наносекундные (иногда и микросекундные) импульсы. Видимо в STM такого нет. Это не значит, что процессоры плохие. Просто Вы использовать пытаетесь их не совсем правильно.
|
|
|
|
|
May 9 2017, 19:34
|
Группа: Участник
Сообщений: 6
Регистрация: 9-05-17
Пользователь №: 96 967

|
Цитата(ViKo @ May 9 2017, 17:04)  А попробовать одной рукой взяться за плату, за цепь земли, а другой пинцетом в кнопку тыкать. Сработает? Попробовал, всё равно срабатывает, но ощутимо реже чем раньше
Сообщение отредактировал ISF - May 9 2017, 19:38
|
|
|
|
|
May 10 2017, 04:56
|
Группа: Участник
Сообщений: 6
Регистрация: 9-05-17
Пользователь №: 96 967

|
Был задан вполне конкретный вопрос - какого чёрта МК улетает в прерывания от любого чиха и как бороться с таким поведением. Вопрос не праздный. На любом промышленном изделии порой требуются ремонтные действия и будет мало приятного если при банальном замере напряжения у МК будет сносить крышу напрочь. Если есть что сказать по делу, то стоит это сделать, а шутки тут как-то не особо к месту. Всё-таки не КВН
|
|
|
|
|
May 10 2017, 06:28
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(ISF @ May 10 2017, 07:56)  Был задан вполне конкретный вопрос - какого чёрта МК улетает в прерывания от любого чиха и как бороться с таким поведением. Сначала следует разобраться с "поведением" того, кто собраться сувать руки в работающее изделие Во-вторых, изделие нужно засунуть в корпус и поставить плобму, чтобы кто-попало туда не лазил без ведома разработчика. А, если сам разработчик допускает подобные копания в потрохах изделия с подключенным питанием, то виноват горе-разработчик, а вовсе не контора, которая делает микросхемы, используемые в его чудо-устройстве. Цитата Вопрос не праздный. Вам уже тут ответили по существу, сославшись на выдержки из даташита на МК. И про обработку нажатий кнопок по прерываниям (дикость какая) тоже подсказали, что это делается это совсем иначе - нужно бороться с дребезгом и слишком короткими "пысиками" программно. А также рассказали почему в вашем любимом AVR это не происходит, а тут - это возможно. Короче, вам "разжевали все по косточам". Доходчиво. Даже местами слишком. Цитата На любом промышленном изделии порой требуются ремонтные действия и будет мало приятного если при банальном замере напряжения у МК будет сносить крышу напрочь. На любом промышленном изделии перед копанием внутри сначала принято отключать питание и в обязательном порядке заземлять туловище любопытного электрика. Хотя, лучше всего от таких электриков помогает корпус с гарантийной пломбой. Цитата шутки тут как-то не особо к месту Ну да действительно! Как же я не подумал об этом! Ведь у вас траур - STM32 вывел на чистую воду, все то, что AVR упорно скрывал. Искренне сочувствую
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 10 2017, 07:31
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ISF @ May 10 2017, 07:56)  какого чёрта МК улетает в прерывания от любого чиха и как бороться с таким поведением. Вопрос не праздный. Перед разработкой промышленного оборудования неплохо бы чуть-чуть подучиться. Есть очень хорошая статья. Советую ознакомиться. На STM32 нападения напрасны - если схемотехника в порядке, то оборудование может работать в очень тяжелых условиях. У STM есть множество AN на данную тему, а у потребителей продукции STM есть множество реализованных серийных надежных изделий. Вам конкретно ответили: есть программные и есть аппаратные способы борьбы. Нужно использовать все. Виноват не контроллер, а разработчик. Могу рассказать историю, как светодиодные табло зависали намертво, когда рядом в сеть вставляли обычный нихромовый паяльник, при этом собраны они были на atmega128.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|