|
|
  |
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)  самое правильное, при прерывании проверять флаг, что именно от этой ноги все получилось, иначе игнорировать прерывание. Если это правда беда кортекса-М, но что-то тьфу тьфу тьфу на лпц не замечал такого.... А какой именно флаг проверять? Разве в моем коде обработчик не полный?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|