Артём__ 0 13 марта, 2013 Опубликовано 13 марта, 2013 · Жалоба почему USB? volatile - возможно, но почему в дебагере работает? Может в отладчике используется Debug, а прошивается Release? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 14 марта, 2013 Опубликовано 14 марта, 2013 · Жалоба Количество странностей заставило меня все таки открыть доку и проектик. и так список векторов прерываний в файлике startup_stm32f10x_md.s учитывая стилистку и имена вызываемых функций у вас такое должно быть они там просто идут списком. описания функций можно правда не чем не предварять, просто void vector_func(void), видать ядро берет на себя все правильные возвраты... дальше КАН имеет 2 входных буфера и если внимательно поглядеть то есть CAN_TX_interrupt CAN_RX0_interrupt CAN_RX1_interrupt сообщения приходят в 0, если он занят то они приходят в 1 буфер. ваша первая попытка поймать сообщение в 1 буфере потому и не сработала, и потом сработала вторая попытка поймать сообщение в 0. По идее необходимо обрабатывать оба буфера и 0 и 1 Ответ на вопрос почему USB. Потому что так чудно получилось что на 19 и 20 канале прерываний у этих процессоров и USB и CAN - вот же! Так что если все по уму то у вас надо 1. сделать реакцию не только на RX0 но и на RX1, 2. Под прерывание от RX0 проверить что прерывание точно от кана, а то добавите потом USB, и будете думать кто вас дернул... 3. В обработчиках прерываний не забыть снять флаги прерываний, то есть обозначить что вы их уже обработали, а то из них никогда не выйдете. Некоторые флаги снимаются сами по прочтению регистров, некоторые надо снимать руками, читайте мануал 4. Опять же прочитать мануал чтобы понять что да как работает. Если вы в кэйле добавить в проект отладочную информацию, то тыкая правой кнопкой мыши в функции сможете из меню выбирать пункт показать их объявление. Думаю имеет смысл прочитать реализацию функций типа NVIC_Init чтобы понимать точно что происходит, где какие флаги ставятся, и как что потом будет работать! http://easyelectronics.ru/arm-uchebnyj-kur...preryvanij.html ИМХО имеет смысл ознакомиться! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Elcarnado 0 14 марта, 2013 Опубликовано 14 марта, 2013 · Жалоба Приписать volatile к переменной. Volatile был изначально. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 14 марта, 2013 Опубликовано 14 марта, 2013 · Жалоба ну тогда вы просто не выпадаете из прерывания в основной цикл где можете по флажку включить диод. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Elcarnado 0 14 марта, 2013 Опубликовано 14 марта, 2013 · Жалоба ну тогда вы просто не выпадаете из прерывания в основной цикл где можете по флажку включить диод. Спасибо большое за советы! Поставил включение светодиода в прерывание - все-равно не включается. Прерывания включил и RX0 и RX1: в RX1 не попадаю, т.к. отправляю всего одно сообщение, - в принципе логично и это радует. Почитал про флаги для выхода из прерывания: в прерывания мы залетаем, когда счетчик принятых сообщений не равен нулю, выставляя флаг RFOM0 в регистре CAN_RF0R, аппаратно декрементируется этот счетчик. Посмотрел регистр в дебаге - счетчик на входе в прерывании равен 1, после чтения сообщения - 0, здесь все нормально. Наткнулся на непонятную мне запись в Reference manual (RM0008, страница 639, выбор режима работы CAN): Bit 31 SILM: Silent mode (debug) 0: Normal operation 1: Silent Mode Bit 30 LBKM: Loop back mode (debug) 0: Loop Back Mode disabled 1: Loop Back Mode enabled Это значит, что данные режимы (а у меня CAN как раз в режиме Loop back) доступны только в дебаге или как? Помогите расшифровать эту запись, пожалуйста. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 14 марта, 2013 Опубликовано 14 марта, 2013 · Жалоба строго говоря это режим для отладки, как и сайлент мод, а вот может ли как то процессор отличить в каком он режиме в рабочем или отладке хрен знает, всегда думал что режимы не отличимы, но если может тогда понятно что происходит, без дебага к вам не возвращается ваше сообщение, его никто не принимает, и не возникает прерывания... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Elcarnado 0 18 марта, 2013 Опубликовано 18 марта, 2013 · Жалоба Добрый день! Наконец-то удалось подружить два устройства по СAN-интерфейсу. Основной момент был в том, что во время дебага при приеме сообщения я влетал в прерывание по FIFO0, а во время выполнения программы в режиме реального времени контроллер получал прерывание от FIFO1 (проверял светодиодами). Спасибо всем большое за советы! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться