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

 
 
2 страниц V  < 1 2  
Closed TopicStart new topic
> Can в STM32F103RBT6
_Артём_
сообщение Mar 13 2013, 18:41
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Golikov A. @ Mar 13 2013, 18:51) *
почему USB?

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

Может в отладчике используется Debug, а прошивается Release?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 14 2013, 05:31
Сообщение #17


Гуру
******

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



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

и так список векторов прерываний
в файлике
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
ИМХО имеет смысл ознакомиться!
Go to the top of the page
 
+Quote Post
Elcarnado
сообщение Mar 14 2013, 07:03
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 27-02-13
Пользователь №: 75 819



Цитата(adnega @ Mar 13 2013, 18:30) *
Приписать volatile к переменной.

Volatile был изначально.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 14 2013, 07:35
Сообщение #19


Гуру
******

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



ну тогда вы просто не выпадаете из прерывания в основной цикл где можете по флажку включить диод.
Go to the top of the page
 
+Quote Post
Elcarnado
сообщение Mar 14 2013, 08:23
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 27-02-13
Пользователь №: 75 819



Цитата(Golikov A. @ Mar 14 2013, 09:35) *
ну тогда вы просто не выпадаете из прерывания в основной цикл где можете по флажку включить диод.


Спасибо большое за советы! Поставил включение светодиода в прерывание - все-равно не включается. Прерывания включил и 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) доступны только в дебаге или как? Помогите расшифровать эту запись, пожалуйста.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 14 2013, 15:23
Сообщение #21


Гуру
******

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



строго говоря это режим для отладки, как и сайлент мод, а вот может ли как то процессор отличить в каком он режиме в рабочем или отладке хрен знает, всегда думал что режимы не отличимы, но если может тогда понятно что происходит, без дебага к вам не возвращается ваше сообщение, его никто не принимает, и не возникает прерывания...
Go to the top of the page
 
+Quote Post
Elcarnado
сообщение Mar 18 2013, 11:02
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 27-02-13
Пользователь №: 75 819



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

2 страниц V  < 1 2
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 02:46
Рейтинг@Mail.ru


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