Перейти к содержанию
    

почему USB?

 

volatile - возможно, но почему в дебагере работает?

Может в отладчике используется Debug, а прошивается Release?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Количество странностей заставило меня все таки открыть доку и проектик.

 

и так список векторов прерываний

в файлике

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

ИМХО имеет смысл ознакомиться!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну тогда вы просто не выпадаете из прерывания в основной цикл где можете по флажку включить диод.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну тогда вы просто не выпадаете из прерывания в основной цикл где можете по флажку включить диод.

 

Спасибо большое за советы! Поставил включение светодиода в прерывание - все-равно не включается. Прерывания включил и 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) доступны только в дебаге или как? Помогите расшифровать эту запись, пожалуйста.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Наконец-то удалось подружить два устройства по СAN-интерфейсу. Основной момент был в том, что во время дебага при приеме сообщения я влетал в прерывание по FIFO0, а во время выполнения программы в режиме реального времени контроллер получал прерывание от FIFO1 (проверял светодиодами). Спасибо всем большое за советы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...