Количество странностей заставило меня все таки открыть доку и проектик.
и так список векторов прерываний
в файлике
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ИМХО имеет смысл ознакомиться!