Sep 27, 2024 09:33
Сижу, отлаживаю CAN. И таки что бы вы думали? Флаги в регистрах CAN1->RF0R, CAN1->RF1R и CAN1->MSR очищаются записью единицы! А я их по-старинке сбрасывал… Правда, почему-то в отладчике не получается очистить FOVR0:
(gdb) set CAN1->RF0R=0x10
(gdb) p /x CAN1->RF0R
$9 = 0x13
Вот и выходит: несмотря на то, что я отключаю тактирование CAN, флаг висит. Поэтому буквально через несколько шагов после выхода из прерывания получается обратный заход в это прерывание… Передача по USART1 никакого отношения к этому не имеет. Просто DMA отрабатывает последний буфер, а следующий уже не может, т.к. МК завис.
Теперь непонятный вопрос: как чертов FOVR0 очистить? Тьфу, я ж, балбес, пытался сбросить флаг при отключенном тактировании!!!
Фух, подправил код. Теперь не виснет даже при самом жестоком флуде! В режиме "сниффера" просто периодически вылезают ошибки "canerror=FIFO_OVERRUN" на сообщения с чужим ID, а на сообщения с собственным еще и всякие разные вроде "Ack error", "Error counter limit", "Bit dominant error" и т.п.
Сбросить счетчики ошибок без переинициализации всего CAN я не смог, поэтому этот момент оставил, как и было. Только в случае FIFO_OVERRUN не делаю перезагрузку - лишь вывожу сообщение об ошибке.
Теперь нужно переделать код всех имеющихся устройств с CAN и не забыть перепрошить.
рукожопие,
stm32