Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32F401 при вызове фунций с прерываниями слетает RXEIE

Чт мар 07, 2024 10:28:28

С STM32 и Cube IDE знаком всего пару недель, есть задача которую нужно решить, пришлось окунуться в эту тему, пока все на HAL. Моё устройство состоит из трех STM32F401, одно из них шлёт пакеты из 26 байтов, 1 байт синхра, второй длинна тела, и 24 байта тела пакета. Второй контроль должен это всё принимать, разбирать, перекладывать в массив и отправлять дальше по тому же uart. Первый узел отправки работает без проблем, пакеты всегда идут. А вот со вторым узлом (приёма) мучаюсь уже несколько дней, после того как ввёл в код обработку однонаправленной отправки SPI и HAL_ADCEx_InjectedStart_IT, стал слетать флаг RXEIE и перестаёт входить в callback. Алгоритм приёма такой: Запрос через прерывание одного байта, если он синхра то принимаем второй, если он меньше допустимой длинны пакета, то запрос тела. В момент отправки проверяю HAL_OK и если всё норм, то вешаю флаг callback false, в обработчике ничего кроме callback true, так же никаких delay в коде нет. В какой момент написания проги начались эти проблемы не знаю, но начали активно проявляться после использования SPI и ADC. Несколько минут и приём отваливается. Пробовал приём тела в режиме IDLE DMA, слетает флаг IDLEIE. Пытался пошагово найти в какой момент флаг слетает, пару раз увидел что это происходит при переходе в HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef* hadc), закоментил переход, всё равно приём через какое то время останавливается. Если закоментить обращение к SPI то работает, правда не знаю насколько долго, минут 10 точно работает. Приоритет прерывания приёма 0, остальные 1.
Скорость UART 420000, пакеты идут 500Гц. Из периферии задействовано: приём без DMA и передача по DMA uart1 с прерыванием; spi2 master только передача с прерыванием; tim2 с прерыванием; три пина injected adc с прерыванием, пока задействован один; четыре gpio на выход + три пина gpio на ss spi.
Подскажите пожалуйста направление поиска проблемы.
Ответить