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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> STM32F100 Непроизвольное срабатывание прерывания
Plexus
сообщение Aug 29 2014, 09:10
Сообщение #1





Группа: Участник
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post
Ant_m
сообщение Aug 29 2014, 09:45
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 755
Регистрация: 14-08-07
Из: Москва
Пользователь №: 29 765



Цитата(Plexus @ Aug 29 2014, 13:10) *
Импульсы в этот момент не поступают (слежу на осцилле).

А на GPIO 0 port B, С, D что происходит?
У меня все нормально работает, только у меня нет работы с TIM6 и приоритеты стоят не 0x0f, а 3...
Go to the top of the page
 
+Quote Post
Plexus
сообщение Aug 29 2014, 10:43
Сообщение #3





Группа: Участник
Сообщений: 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?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 29 2014, 11:51
Сообщение #4


Гуру
******

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



это ваще может значить черти что, куча народу нарывалось на то что эти дурные функции делали что хотели а не что надо.

там через раз срабатывает вот это GPIO_Pin_8 | GPIO_Pin_9;

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

Go to the top of the page
 
+Quote Post
Plexus
сообщение Aug 30 2014, 05:01
Сообщение #5





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



Т.е. достаточно настроить все GPIO и проблема пропадет?

Кто еще сталкивался с этой проблемой? Если есть ссылки на топики - поделитесь, пожалуйста.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 30 2014, 05:55
Сообщение #6


Гуру
******

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



где то краем ухо я слышал про ложные срабатывания прерываний, этим грешили процы от ST,


вот типа
http://electronix.ru/forum/index.php?showt...%E2%E0%ED%E8%E5
и в других контекстах слышал.

эта тема про UART, про пины вроде тоже проходило где то...

Другое дело что надо сначала все верно настроить, чтобы в регистрах было то что надо, а не дергая странные индуские функции. Многие из них очень плохо написаны. И только потом уже верить в ложное срабатывание.
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 30 2014, 08:57
Сообщение #7


Гуру
******

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



Цитата(Golikov A. @ Aug 30 2014, 09:55) *
где то краем ухо я слышал про ложные срабатывания прерываний, этим грешили процы от ST,

Правильнее называть те прерывания "повторными". Это, скорее, грех Cortex-M, чем ST.
Go to the top of the page
 
+Quote Post
Plexus
сообщение Aug 30 2014, 09:56
Сообщение #8





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



Цитата(adnega @ Aug 30 2014, 15:57) *
Правильнее называть те прерывания "повторными". Это, скорее, грех Cortex-M, чем ST.

Хорошо. А этого можно как-то избежать? Это лечится? Как другие разработчики решали подобные проблемы?
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 30 2014, 10:16
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 245
Регистрация: 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 сидит кнопка. Если вы имеете дребезг по нажатию/отпусканию кнопки, то это третий случай.
Go to the top of the page
 
+Quote Post
Plexus
сообщение Aug 30 2014, 10:24
Сообщение #10





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



Цитата(adnega @ Aug 30 2014, 17:16) *
Это не ваш случай.
Попробуйте ногу посадить железно на 3.3В. Попробуйте настроить EXTI на другой вывод. Если и в этом случае будут вызовы, то ищем в одном месте, если пропадут, то в другом, например, в ES

Кста, уSTM32VLDiscovery на PA0 сидит кнопка. Если вы имеете дребезг по нажатию/отпусканию кнопки, то это третий случай.


Зачем сажать на 3.3В? У меня и так подтяжка железно через резистор на 3.3В, а не программно. Что вы имеете в виду?

Буду на другом выводе юзать, но я должен быть уверен, что все работает как часы. А ждать самопроизвольного срабатывания - очень долго. Не всегда ж срабатывает.

Дребезг исключен 100%. Проверка и на осцилле была и физически дребезг исключен. Подключение через транзистор на землю.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 30 2014, 14:16
Сообщение #11


Гуру
******

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



самое правильное, при прерывании проверять флаг, что именно от этой ноги все получилось, иначе игнорировать прерывание. Если это правда беда кортекса-М, но что-то тьфу тьфу тьфу на лпц не замечал такого....
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 30 2014, 14:41
Сообщение #12


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

Группа: Свой
Сообщений: 3 274
Регистрация: 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 sm.gif


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


Гуру
******

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



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

Можно в 2 словах откуда они рождаются? Я как то не искушен в этом вопросе, думал это чисто СТ косяк, а выходит все же нет, че почитать?

UPD. А нашел, в приведенном же документе есть причина их возникновения. Но что-то получается что это не для любой периферии возможно и причина в конвейере, то есть фактически на самом деле прерывание было, просто пока конвейер чистился оно исчезло. Но такое не возможно для GPIO прерываний, или возможно?

Как оно все рождается то?

Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 30 2014, 15:53
Сообщение #14


Гуру
******

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



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

Согласен. У кортексов и контроллер прерываний совсем другой. Про ложные срабатывания (даже на STM32) ничего не слышал за более чем 4 года использования в серийном производстве (~ 100 изделий в месяц) на STM32F100/103/107/407.
Go to the top of the page
 
+Quote Post
Plexus
сообщение Aug 30 2014, 18:41
Сообщение #15





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



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

А какой именно флаг проверять? Разве в моем коде обработчик не полный?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th July 2017 - 22:57
Рейтинг@Mail.ru


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