Я вижу, что HAL предоставляет следующую функцию для приема последовательных данных с прерываниями: HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
, который в основном устанавливает rx прерывания и возвращает.
HAL_UART_RxCpltCallback()
будет вызываться, как только количество полученных байтов достигнет Size
.
HAL отключает RX прерывания непосредственно перед выполнением этого обратного вызова
Проблемы:
Количество входящих байт будет переменным (от 1 до ~ 100), и мне нужно, чтобы поместить их в кольцевом буфер.
Поэтому я Size
1 и вызвать HAL_UART_Receive_IT()
снова внутри обратного вызова для повторного включения прерываний, и она хорошо работает, если плата отправляется 1 или 2 байта каждый сейчас и потом, но байты пропустили за пределы этогоКак сохранить прерывание UART RX навсегда, используя библиотеку HAL на STM32F1
Я предполагаю, что они пропущены из-за того, что они прибывают между отключением прерывания - включение
Есть ли способ, чтобы прерывания выполнялись навсегда без перезаписи кода сгенерированного кода HAL Cube?
Если нет, то какой будет чистый способ перезаписи задействованных функций?
Есть ли что-то, что мне не хватает, что бы избежать необходимости найти это решение?
Это, кажется, известная проблема без легкого решения: http://stackoverflow.com/questions/24875873/stm32f4-uart-hal-driver –
Похоже DMA это вещь для записи данных из любого периферийного устройства в любой буфер памяти, включая кольцевой буфер (настройки DMA). И прерывания DMA - это простой способ обработки всех данных или даже их половины в момент получения. – Yuriy
Это не зависит от вашего вопроса. Но я думаю, что было бы достойно попробовать драйверы keil io. Вот ссылка, где вы можете найти их для своего mcu https://www.keil.com/dd2/pack/ –