2016-04-15 2 views
2

Я вижу, что 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?
Если нет, то какой будет чистый способ перезаписи задействованных функций?
Есть ли что-то, что мне не хватает, что бы избежать необходимости найти это решение?

+1

Это, кажется, известная проблема без легкого решения: http://stackoverflow.com/questions/24875873/stm32f4-uart-hal-driver –

+0

Похоже DMA это вещь для записи данных из любого периферийного устройства в любой буфер памяти, включая кольцевой буфер (настройки DMA). И прерывания DMA - это простой способ обработки всех данных или даже их половины в момент получения. – Yuriy

+0

Это не зависит от вашего вопроса. Но я думаю, что было бы достойно попробовать драйверы keil io. Вот ссылка, где вы можете найти их для своего mcu https://www.keil.com/dd2/pack/ –

ответ

0

Вы можете попробовать вытащить UART вместо прерывания. Путь: UART не будет возвращаться до получения данных о количестве, указанных параметром «Размер».

+1

Проблема: «Размер» является переменной, и мое приложение имеет решающее значение для времени, поэтому я пошел с прерываниями в первом место. Получил эту работу, отредактировав функцию HAL 'UART_Receive_IT', так что входящие байты поступают непосредственно в кольцевой буфер, а прерывания не отключаются –

0

Я думаю, вам нужно указать специальный символ, указывающий конец сеанса массажа, или вы сделаете свой собственный протокол, например. заголовок сообщения, длину сообщения, содержимое, контрольную сумму , и вы делаете прерывание включенным для одного байта, а в обработчике прерываний вы храните полученный буфер до тех пор, пока вы не найдете последний байт в сообщении, а затем вы отправите основную задачу в случае RTOS , или установите глобальный флаг. Кстати, не забудьте установить размер соответствующих получать байты в

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); 

внутри

HAL_UART_RxCpltCallback 

пожалуйста, проверьте возвращение HAL_UART_Receive_IT может вернуть ошибку, а также реализовать

void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle); 

и проверьте, есть ли ошибка в шине UART.

0

Попробуйте

__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); 
Смежные вопросы