-
- Ну вот по UARTу вопрос. Есть у куба функция передачи массива в UART: HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size). Ну тут всё понятно. И есть аналогичная функция приёма: HAL_UART_Receive_IT(UART_HandleTypeDef Звероящер(459 знак., 30.01.2018 10:30)
- У меня все принимаемые пакеты - нерегулярной длины. Командой HAL_UART_Receive_IT я всегда принимаю по 1 байту, складываю в отдельный буфер и включаю счетчик. При прекращении байт считаю, что пакет поступил. Понятно, что у меня скорости совсем не Лагунов(17 знак., 30.01.2018 10:48)
- получается что формально у Вас HAL, а фактически нет, так как не используется. - Nikolay801_(30.01.2018 11:37)
- ну зато одни и те же строки кода одинаковые и в F030, F446, L476. Причем и в USART, и в LPUART :-) - Лагунов(30.01.2018 13:49)
- Вы знаете толк в извращениях. Заведите два канала DMA, конец пакета фиксируйте по IDLE. Количество байт DMA сама посчитает, в подарок получите почти аппаратную защиту от переполнения буфера приёмника. - Evgeniy1294(30.01.2018 11:25)
- Ну вот так в конце-концов и сделал. Один канал на передачу, другой на приём. Приём оканчивается по IDLE, а передача - по TC. После флага ТС в обработчике ногу переключения драйвера дёргаю. Красота. Ни таймеров, ни промежуточных прерываний. Принял Звероящер(61 знак., 30.01.2018 14:37)
- "Приём оканчивается по IDLE" - в DMA? Учту. - Лагунов(30.01.2018 18:09)
- Нет, не так. IDLE надо в обработчике UART пасти. Словил IDLE залез в DMA регистр DMA_CNDTR и поглядел, сколько данных пришло. Прерывания от DMA вообще можно не использовать. Сделал буфер с запасом и крути его по кругу. - Звероящер(30.01.2018 20:56)
- Некоторые особо упорные, я слышал, связывали прием по UART со взводом таймера, который по состоянию тишины добегал до нуля и генерил прерывания. lloyd(53 знак., 30.01.2018 21:57)
- у меня еще в 8-битнике импульсы от приема UART перезапускали таймер. Как только он переставал перезапускаться и досчитывал до конца - прием окончен. - Лагунов(31.01.2018 08:16)
- Это не упорные :) Это стандартный способ. Например, стек freemodbus примерно так работает. Это уже в угоду кроссплатформенности написано, ибо тупой таймер и уарт у всех есть, а вот уарт определяющий свободную линию и дма - не у всех. - Звероящер(31.01.2018 05:45)
- Некоторые особо упорные, я слышал, связывали прием по UART со взводом таймера, который по состоянию тишины добегал до нуля и генерил прерывания. lloyd(53 знак., 30.01.2018 21:57)
- Нет, не так. IDLE надо в обработчике UART пасти. Словил IDLE залез в DMA регистр DMA_CNDTR и поглядел, сколько данных пришло. Прерывания от DMA вообще можно не использовать. Сделал буфер с запасом и крути его по кругу. - Звероящер(30.01.2018 20:56)
- "Приём оканчивается по IDLE" - в DMA? Учту. - Лагунов(30.01.2018 18:09)
- думаю, что когда припрет - так и сделаю. Пока периода кручения в штатном while() мне хватает на обработку одного байта . :-) - Лагунов(30.01.2018 11:32)
- Честно сказать, там делов минут на 10) Могу поделится примером, если нужно. - Evgeniy1294(30.01.2018 11:35)
- ага, перевел проекты на дма и круговой буфер (на прием), красиво получается :) - 0men(30.01.2018 12:52)
- Я в чем красивость? Все равно по байту вычерпывать? Я на передачу ДМА ставлю - обычно пакет передаешь и только по окончанию DTR надо опустить. - Andreas(30.01.2018 14:03)
- красивость в том, что не нужно улетать в прерывание каждый раз и тратить на связанное с этим кучу времени. А вычерпывать из буфера в основном теле - 0men(30.01.2018 14:06)
- Вот в этом часто тупость. Я до сих пор совместно с МК мучаюсь, ворочаюсь, натужно перелопачиваю байты. Такое напряжение! А потом посмотрел, что делает МК за 10 мксек (Карл!!! :-))) и понял - ни фига он (МК) там не перетруждается. :-) Ага, куча Лагунов(25 знак., 30.01.2018 18:13)
- я вот не стал маяться с дма, в прерывании принятые байты собираю в пакет с контролем заголовка и хвоста, очередь приемная из уже готовых пакетов. Передача наоборот, формирую очередь из байт которая выгребается в прерывании. И не каких сожалений. Nikolay801_(35 знак., 31.01.2018 09:54)
- кстати у меня у меня АЦП изначально только в DMA по кольцу. - Лагунов(31.01.2018 15:09)
- очень часто есть масса других прерываний, гораздо более важных. - 0men(30.01.2018 18:29)
- верно, есть. Я специально смотрел осциллографом. Аж до 7-8 мксек! И это с L476, который на 80МГЦ. А если F446, который на 180МГЦ? Я вот сейчас ломаю все свои старые заморочки в голове, когда у меня МК работал на 4-12 МГц... - Лагунов(30.01.2018 18:51)
- поэтому стоит различать "просто работает" и "красиво работает" :) - 0men(30.01.2018 18:54)
- это типа из авиастроительских баек? "Некрасивый самолет не полетит..." :-) - Лагунов(30.01.2018 19:13)
- я с этой байкой полностью согласен :) - 0men(30.01.2018 19:20)
- это типа из авиастроительских баек? "Некрасивый самолет не полетит..." :-) - Лагунов(30.01.2018 19:13)
- поэтому стоит различать "просто работает" и "красиво работает" :) - 0men(30.01.2018 18:54)
- верно, есть. Я специально смотрел осциллографом. Аж до 7-8 мксек! И это с L476, который на 80МГЦ. А если F446, который на 180МГЦ? Я вот сейчас ломаю все свои старые заморочки в голове, когда у меня МК работал на 4-12 МГц... - Лагунов(30.01.2018 18:51)
- я вот не стал маяться с дма, в прерывании принятые байты собираю в пакет с контролем заголовка и хвоста, очередь приемная из уже готовых пакетов. Передача наоборот, формирую очередь из байт которая выгребается в прерывании. И не каких сожалений. Nikolay801_(35 знак., 31.01.2018 09:54)
- А точно можно так? Насколько помню, там то ли счетчик обновляется в конце транзакции, то ли еще что-то остановило меня, когда рассматривал этот вариант. - Andreas(30.01.2018 14:13)
- точно - 0men(30.01.2018 14:21, ссылка)
- Спасибо, надо глянуть внимательней будет. Пару лет назад почему-то отверг этот вариант. - Andreas(30.01.2018 14:25)
- точно - 0men(30.01.2018 14:21, ссылка)
- Вот в этом часто тупость. Я до сих пор совместно с МК мучаюсь, ворочаюсь, натужно перелопачиваю байты. Такое напряжение! А потом посмотрел, что делает МК за 10 мксек (Карл!!! :-))) и понял - ни фига он (МК) там не перетруждается. :-) Ага, куча Лагунов(25 знак., 30.01.2018 18:13)
- красивость в том, что не нужно улетать в прерывание каждый раз и тратить на связанное с этим кучу времени. А вычерпывать из буфера в основном теле - 0men(30.01.2018 14:06)
- я держу в голове круговой буфер DMA для UART. :-) Один раз уже почти вставил. - Лагунов(30.01.2018 13:51)
- нужно себя заставить )) - 0men(30.01.2018 13:56)
- Я в чем красивость? Все равно по байту вычерпывать? Я на передачу ДМА ставлю - обычно пакет передаешь и только по окончанию DTR надо опустить. - Andreas(30.01.2018 14:03)
- ага, перевел проекты на дма и круговой буфер (на прием), красиво получается :) - 0men(30.01.2018 12:52)
- Честно сказать, там делов минут на 10) Могу поделится примером, если нужно. - Evgeniy1294(30.01.2018 11:35)
- Ну вот так в конце-концов и сделал. Один канал на передачу, другой на приём. Приём оканчивается по IDLE, а передача - по TC. После флага ТС в обработчике ногу переключения драйвера дёргаю. Красота. Ни таймеров, ни промежуточных прерываний. Принял Звероящер(61 знак., 30.01.2018 14:37)
- получается что формально у Вас HAL, а фактически нет, так как не используется. - Nikolay801_(30.01.2018 11:37)
- У меня все принимаемые пакеты - нерегулярной длины. Командой HAL_UART_Receive_IT я всегда принимаю по 1 байту, складываю в отдельный буфер и включаю счетчик. При прекращении байт считаю, что пакет поступил. Понятно, что у меня скорости совсем не Лагунов(17 знак., 30.01.2018 10:48)
- может потому что HAL, а не LL? - IBAH(29.01.2018 19:40)
- Ну если честно, то LL мне как-то не нужен был. Вполне HAL-а хватало. - Лагунов(30.01.2018 07:21)
- на самом деле хватало бы и LL, HAL это оверкил. но 1)LL запрятана в кубе. 2)взаимодействие Куба и LL совершенно не тестировано - IBAH(30.01.2018 08:58)
- ну и зачем тогда? Из принципа? Такая дикая аллергия на HAL? :-) - Лагунов(30.01.2018 10:44)
- на самом деле хватало бы и LL, HAL это оверкил. но 1)LL запрятана в кубе. 2)взаимодействие Куба и LL совершенно не тестировано - IBAH(30.01.2018 08:58)
- Ну если честно, то LL мне как-то не нужен был. Вполне HAL-а хватало. - Лагунов(30.01.2018 07:21)
- Ну вот по UARTу вопрос. Есть у куба функция передачи массива в UART: HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size). Ну тут всё понятно. И есть аналогичная функция приёма: HAL_UART_Receive_IT(UART_HandleTypeDef Звероящер(459 знак., 30.01.2018 10:30)