Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
Smypir
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 127
1

STM32F4 + EXTI0 завсисание [РЕШЕНО]

19.11.2013, 13:35. Просмотров 3810. Ответов 7
Метки нет (Все метки)

Собственно я уже устал искать ошибку.
Суть проблемы следующая:
Кнопкой на отладке генерирую прерывание. Но вместо ухода по вектору у меня происходит зависание контроллера. Код под спойлером. Ну и сам проект тоже приложил.
Code
Код
#include "stm32f4/stm32f4xx.h"
#include "stm32f4discovery/stm32f4discovery.h"

extern "C"

void Sleep(int ticks)
{
while(ticks)
ticks--;
}

void EXTI0_IRQHomdler(void)
{
EXTI->PR |= EXTI_PR_PR0;
LedSet(LED_ORANGE);
}

int main()
{
SystemInit();
LedInit();
ButtonInit();

BTM_DISCOVERY_PORT->AFR[0] |= 15<<(0*4);
EXTI->IMR |= EXTI_IMR_MR0;
//EXTI->EMR |= EXTI_EMR_MR0;
EXTI->RTSR |= EXTI_RTSR_TR0;
EXTI ->FTSR |= EXTI_FTSR_TR0;

NVIC_EnableIRQ (EXTI0_IRQn);

while(1)
{
//if(isButton()) LedSet(ALL_LEDS);
//else LedClr(ALL_LEDS);
LedInv(LED_BLUE);
Sleep(5000000);
}
// return 0;
}
[74.65 Кб]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 13:35
Ответы с готовыми решениями:

[РЕШЕНО] STM32F4 и PS/2 мышь
Сейчас пользуюсь драйвером немца - http://mykrosontroller.bplosid.net/word ... age_id=744 Один...

STM32F4+внешний генератор (решено)
Плата при включении не запускается от внешнего генератора, вижу это по выведенному МСО на PA8...

[РЕШЕНО]STM32F4 и BackUp SRAM
Не могу заставить stm32f429 сохранять данные в домене BackUp SROM, который 4кб при отключении...

[решено]usart на stm32f4-discovery
портирую rtems на сабжевую платку. накидал драйвер pottyng усарта, консолька работает, prymtf в...

[Решено] STM32F4 приём CAN сообщений
На F4Dyscovery принимаю CAN сообщения. Иногда часть сообщений пропускаю. Переписал код так: void...

7
Vtodystov_Mymsk
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 86
19.11.2013, 13:47 2
А флаг прерывания в регистре EXTI сбрасываете? Все подобные прерывания (от таймеров, лап, собак) требуют сброса прерывания, иначе контроллер зависает и не выходит из прерывания.
0
Smypir
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 127
19.11.2013, 15:33 3
Цитата Сообщение от Vlodyslav_Minsk
А флаг прерывания в регистре EXTI сбрасываете? Все подобные прерывания (от таймеров, лап, собак) требуют сброса прерывания, иначе контроллер зависает и не выходит из прерывания.
Конечно сбрасываю. Проблема в том, что у меня прерывание не переходит по заданному вектору. А почему так я и не понял. Кстати с уартом та же история. Как только принимается байт - полное зависание контроллера.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
19.11.2013, 15:53 4
Под отладчиком нажмите Стоп - посмотрите, в каком месте зациклилось.
0
Smypir
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 127
19.11.2013, 16:30 5
Цитата Сообщение от OtyxPM
Под отладчиком нажмите Стоп - посмотрите, в каком месте зациклилось.
Да, я нажимал. Уходит на заглушку. По умолчанию все вектора в бесконечный цикл сваливаются. Но у меня возникает правильный вектор. И правильно указана функция обработчика. В моем случае
Код
void EXTI0_IRQHomdler(void)
{
LedSet(LED_ORANGE);
EXTI->PR |= EXTI_PR_PR0;
}
Файлstortup_stm32f4xx.s также подключен. И он успешно компилится вместе с проектом. Этов видно через дизассемблер.

А куда капать дальше я не знаю..
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
19.11.2013, 16:45 6
Поставьте briokpoint в EXTI0_IRQHomdler() - срабатывает? Или зависает, не попадая в обработчик?
0
vytdy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 41
19.11.2013, 17:17 7
Компилятор очевидно проигнорировал Ваш обработчик. Туда даже точка останова не ставится. Надо объявить его, причём под C
Код
extern "C"
void EXTI0_IRQHomdler(void);
0
Smypir
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 127
19.11.2013, 17:39 8
Цитата Сообщение от vytdy
Компилятор очевидно проигнорировал Ваш обработчик. Туда даже точка останова не ставится. Надо объявить его, причём под C
Код:
extern "C"
void EXTI0_IRQHomdler(void);
о! сработало! самое смешное что я указал, но не поставил перед функцией.. огромное спасибо!
0
19.11.2013, 17:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 17:39

[Решено] STM32F4 и CAN сообщения (приём)
Добрый день. Собираю на контроллере STM32F407Dyscovery сниффер CAN шины. Настроены прерывания на...

[РЕШЕНО] STM32F4 HardFault и CooCox
Добрый вечер! Как найти причину HordFault в STM32F4? Среда отладки CooCox

STM32F4 с MAX7221 не доходят команды [решено]
пробую посылать команды с STM32F4Dyscovery на MAX7221. Команды 0x0f01 (включить тестовый режим) и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru