11.05.2022, 13:43
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Перезагрузка UART_RX на HAL
Добрый день.
Виснет прием данных через какое то время. Как перезагрузить?
Код:
|
if(fPCReload==1){
fPCReload=0;
//1 вариант
HAL_UART_Abort_IT(&huart1); //не работает
//2 вариант
//HAL_NVIC_DisableIRQ(UART7_IRQn); // не понятно название прерывания для UART1
//HAL_NVIC_EnableIRQ(UART7_IRQn);
//3 вариант
/*__disable_irq();
huart1-›RxState= HAL_UART_STATE_READY; // тут ошибку пишет
__enable_irq();*/
//запустить прерывание по-новой
HAL_UART_Receive_IT(&huart1, RX_data10, 8); //
} |
|
|
|
|
11.05.2022, 16:37
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Перезагрузка UART_RX на HAL
Нашел номер ошибки: error = 8
Код:
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart){
if(huart == &huart1){
uint32_t error = HAL_UART_GetError(&huart1);
}
} |
Как сбросить эту ошибку?
|
|
|
|
11.05.2022, 17:03
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,416
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
|
Re: Перезагрузка UART_RX на HAL
что значит виснет? как вообще уарт может зависнуть???
может виснуть чтото уже на более высоком уровне и это уже у тебя а не у уарта.
напиши все на уровне почти ассемблера и все те будет.
небось буфер какойто програмный цикличный не очищаешь вовремя вот и виснет программа. или тупо данные новые не пишутся или не считываются. но это все программное.
__________________
кагмаподэ магмаподэ
|
|
|
|
11.05.2022, 17:06
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,416
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
|
Re: Перезагрузка UART_RX на HAL
прием уарта состоит из 2 строк в прерывании и работы с 2-3 регистрами(и то не всегда). там виснуть нечему на низком уровне кода)))
ну в дма посложнее - там как раз важны размеры программных буферов.
завязывайте вы с этим калом вобщем
индусы вас с ума сведут
__________________
кагмаподэ магмаподэ
|
|
|
|
11.05.2022, 17:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,509
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Перезагрузка UART_RX на HAL
А разобраться с причиной зависания? Обработать ошибку кадра, ошибку переполнения приемника из-за несвоевременного чтения регистра приема, ошибку повышенного шума приема.
Ошибки в приеме сбрасываются чтением регистра SR и последующим чтением регистра приема DR.
Сообщение от sanstan
|
(UART7_IRQn); // не понятно название прерывания для UART1
|
Ну так там 7, а там 1. Цифры визуально хоть и похожие, но, блин, разные как... Для UART1 принято написание как U SART1, двухрежимный синхронный/асинхронный. А седьмой уарт - только асинхронный, потому и UART7. Хотя, эти мудохоания с запретом прерываний - это совсем из другой оперы. Как в анекдоте: "Ты че по полу ползаешь? --- Да я вон там в корридоре ключи потерял. --- Так там и ищи! --- А тут светлее..."
Иногда мануалы то хоть иногда полезно читать.
Сообщение от sanstan
|
номер ошибки: error = 8
|
Мануал прочитать? Даже на этот $#%чий HAL - и то есть мануал. На тыщщи две страниц.
Перейдите по функции обработки ошибки, посмотрите в её недрах, чему соотвествует цифра 8. Там будут текстовые определения:
UART Error Definition
HAL_UART_ERROR_NONE No error
HAL_UART_ERROR_PE Parity error
HAL_UART_ERROR_NE Noise error
HAL_UART_ERROR_FE frame error
HAL_UART_ERROR_ORE Overrun error
HAL_UART_ERROR_DMA DMA transfer error
__________________
Убейте шизофреника Вовку Стогова!
Последний раз редактировалось NewWriter; 11.05.2022 в 18:05.
|
|
|
|
11.05.2022, 18:00
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,416
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
|
Re: Перезагрузка UART_RX на HAL
жертва егэ цифры путает.... понятно.........
__________________
кагмаподэ магмаподэ
|
|
|
|
11.05.2022, 18:48
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Перезагрузка UART_RX на HAL
Спасибо всем.
нашел такие костыли, вроде заработало:
Код:
|
uint8_t UART_ERR=0;
if(HAL_UART_Receive_IT(&huart1,RX_data10,8) == HAL_BUSY)// Открываем последовательный порт 1 для приема прерывания
{
UART_ERR = 1;
}
if(UART_ERR==8){
UART_ERR = 0;
//printf("\r\nUart2 is BUSY!--------------------›\r\n");
while(HAL_UART_Receive_IT(&huart1,RX_data10,8) == HAL_BUSY);// Открываем последовательный порт 1 для приема прерывания
} |
error:8 - ошибка переполнения.
|
|
|
|
11.05.2022, 18:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,509
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Перезагрузка UART_RX на HAL
Ошибка переполнения? Невовремя читаете данные с регистра приема. Скорость приема высокая, а вовремя не обрабатывается прерывание по приему. Надо перераспределить приоритеты прерываний. У остальных прерываний понизить приоритет через NVIC_SetPriority(). (чем больше число, тем ниже приоритет. числа от 0 до 15). А у этого уарта оставить высокий приоритет (0)
__________________
Убейте шизофреника Вовку Стогова!
|
|
|
|
11.05.2022, 19:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Перезагрузка UART_RX на HAL
Если выкинуть кал, то получится компактный понятный код.
А еще советую на передачу использовать DMA. Если МК умеет прерывание по заданному символу, а максимальная длина сообщения фиксирована, можно и на прием DMA запилить!
И да, блокирующий прием по UART — это уж вообще ни в какие ворота не лезет! Получается, пока пользователь будет обед готовить и кота чесать, МК будет ожидать приема, вообще ничего не делая (кроме, разве что, какой-нибудь мелочи, которую через DMA с прерываниями выполняет).
__________________
Смерть бандеровской мразоте!
|
|
|
|
11.05.2022, 21:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,509
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Перезагрузка UART_RX на HAL
Там приём по прерыванию, не блокирующий. По прерыванию нормально работает, особенно при большой разнице между скоростью уарта и скоростью МК.
__________________
Убейте шизофреника Вовку Стогова!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:01.
|
|