реклама на сайте
подробности

 
 
> STM32F1xx, UART на 10МБит - осуществимо?
AHTOXA
сообщение Oct 24 2012, 09:25
Сообщение #1


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Всем привет.
STM32F1xx, 72МГц, UART3 (тактируется от 36 МГц). Пытаюсь достичь высоких скоростей. И что-то не получается.
Отправляю блоки ~512 байт, через DMA.
Инициализация:
Код
    RCC->APB1ENR |= RCC_APB1ENR_USART3EN;
    USART3->BRR = 36000000 / BAUDRATE;
    USART3->CR1 =  USART_CR1_TE;      // transmit enable
    USART3->CR2 = 0;
    USART3->CR3 = USART_CR3_DMAT;   // no flow control, enable TX DMA
    USART3->CR1 |= USART_CR1_UE;      // enable USART

    // UART interrupt
    NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 2));
    NVIC_EnableIRQ(USART3_IRQn);

    // DMA
    RCC->AHBENR |= RCC_AHBENR_DMA1EN;
    DMA1_Channel2->CPAR = (uint32_t)&USARTx->DR;
    DMA1_Channel2->CCR = 0
            | DMA_CCR1_MINC             // Memory increment mode
            | DMA_CCR1_DIR               // Read from memory
            | DMA_CCR1_PL_0             // Channel Priority level
        ;

Отправка блока:
Код
void sendBuf(const void* buf, size_t size)
{
    // clear all interrupts on DMA TX channel
    DMA1_Channel2->IFCR = DMA_ISR_GIF2;
    // set memory address and size
    DMA1_Channel2->CMAR = (uint32_t)buf;
    DMA1_Channel2->CNDTR = size;

    // Clear USART transmission complete flag:
    USART3->SR &= ~USART_SR_TC;
    // enable DMA channel
    DMA1_Channel2->CCR |= DMA_CCR1_EN;;
    // enable UART TC interrupt
    USART3->CR1 |= USART_CR1_TCIE;

    // wait for transfer complete
    txDmaDone_.wait();
    // disable DMA channel
    DMA1_Channel2->CCR &= ~DMA_CCR1_EN;;
}

Ну и прерывание от UART:
Код
void USART3_IRQHandler()
{
    uint16_t status = USART3->SR;
    if (status & USART_SR_TC)
    {
        // clear interrupt
        USART3->SR &= ~USART_SR_TC;
        // disable it
        USART3->CR1 &= ~USART_CR1_TCIE;
        // and flag transmission done
        txDmaDone_.signal_isr();
    }
}

Вот. Всё весьма незамысловато. И до скоростей порядка 2МБит это замечательно работает. А вот после - начинается нечто странное. Чем больше скорость, тем больше время отправки блока. На скорости 3.6МБит отправка блока длится несколько (около 4х) секунд. При дальнейшем увеличении скорости отправка вообще перестаёт завершаться. biggrin.gif

Такое впечатление, что обмен по DMA становится слишком интенсивным, и полностью забивает шину.
Поэтому у меня вопрос: это я натолкнулся на ограничения железа? Или я что-то делаю не так?
Кто-нибудь имел дело с такими скоростями UART, и насколько успешно?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Oct 24 2012, 13:24
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(scifi @ Oct 24 2012, 16:26) *
К сожалению, шину, на которой сидит UART, нельзя разгонять выше 60 МГц.

То есть, максимум 7.5 МБит? Это хуже чем 15, но лучше, чем 2.25 sm.gif
Цитата(scifi @ Oct 24 2012, 16:35) *
Интересная интерпретация, но формула BRR = Fbus / BaudRate говорит о том, что регистр всё-таки задаёт частоту битов UART. Поэтому какая-та заморочка с тактированием там должна быть, чтобы получить дробные частоты. Сигма-дельта или что-то такое.

Скорее, там где-то есть неявное предварительное умножение F_BUS на 16. Дробные - сильно сомневаюсь. (Нечто похожее на дробные скорости встречал только у MSP430, и то, там это надо было задавать руками в виде битовой маски добавочных тактов по битам.)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_pv
сообщение Oct 24 2012, 19:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(AHTOXA @ Oct 24 2012, 20:24) *
То есть, максимум 7.5 МБит? Это хуже чем 15, но лучше, чем 2.25 sm.gif
Скорее, там где-то есть неявное предварительное умножение F_BUS на 16. Дробные - сильно сомневаюсь. (Нечто похожее на дробные скорости встречал только у MSP430, и то, там это надо было задавать руками в виде битовой маски добавочных тактов по битам.)

максимум 4.5 на 72МГц.
нет там умножения, просто при делении на 16 разрешили выбирать скорость не как обычно после деления на 16: F/16/N, а просто как F/N, при N>16.
что позволяет более гибкую настройку частоты.
Прикрепленное изображение

если надо только передавать, а с другой стороны принимать будет кто-нибудь с УАРТом по-быстрее, то можно передатчик от SPI задействовать, только буфер нужен будет в два раза больше под 16ти разрядные данные и руками надо будет по нему пробежаться и стартовые биты в каждый байт добавить.
из него тогда и 72/2/2 = 18МБит вроде выжать можно.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 24 2012, 20:06
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(_pv @ Oct 25 2012, 01:30) *
максимум 4.5 на 72МГц.

Это мы уже про F2xx.
Цитата(_pv @ Oct 25 2012, 01:30) *
нет там умножения, просто при делении на 16 разрешили выбирать скорость не как обычно после деления на 16: F/16/N, а просто как F/N, при N>16.
что позволяет более гибкую настройку частоты.

Ну как же нет? При делении F_BUS на BRR мы получаем BAUDRATE (время одного бита). Откуда тогда берётся частота семплирования 16 раз на бит?
Цитата(_pv @ Oct 25 2012, 01:30) *
если надо только передавать

Нет, к сожалению, принимать тоже нужно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_pv
сообщение Oct 24 2012, 20:35
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(AHTOXA @ Oct 25 2012, 02:06) *
Ну как же нет? При делении F_BUS на BRR мы получаем BAUDRATE (время одного бита). Откуда тогда берётся частота семплирования 16 раз на бит?

ну меньше чем на 16 всё равно делить нельзя.
просто пользователю дали не поделенную как обычно на 16 частоту, которую дальше можно только поделить на 2,3, ... то есть baudrate будет F/16, F/32, F/48,
а позволили просто делить и на 17, 18, 19... тоже. при этом бит всё равно где-то примерно посередине сэмплируется, ну теперь не ровно по середине, а в 8/17 например, не велика разница, зато частота гораздо гибче настраивается.
Цитата(AHTOXA @ Oct 25 2012, 02:06) *
Нет, к сожалению, принимать тоже нужно.

тогда максимум 4.5Мбит.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 24 2012, 21:12
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(_pv @ Oct 25 2012, 02:35) *
ну меньше чем на 16 всё равно делить нельзя.

Ну да, вы всё очень хорошо расписали. В BRR оставили запас в 16, для того, чтобы можно было его поделить на 16 (и тем самым умножить частоту семплирования на 16 - это как раз то, о чём я и говорю sm.gif ).
Цитата(_pv @ Oct 25 2012, 02:35) *
тогда максимум 4.5Мбит.

Или 7.5 у F2xx, или 10.5 у F4xx.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aner
сообщение Oct 24 2012, 21:48
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463



QUOTE (AHTOXA @ Oct 25 2012, 00:12) *
Ну да, вы всё очень хорошо расписали. В BRR оставили запас в 16, для того, чтобы можно было его поделить на 16 (и тем самым умножить частоту семплирования на 16 - это как раз то, о чём я и говорю sm.gif ).

Или 7.5 у F2xx, или 10.5 у F4xx.

Все же ... зачем вам это нужно? ... не практично это, ... есть куча вариантов лучшиих решений по передаче данных на этих 4XX чипах.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 24 2012, 22:07
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Мне надо быстро сливать большой объём данных с одного устройства на другое, кабель - метра три, жил - желательно поменьше. Вокруг будут помехи, так что USB не катит. Какие ещё у меня варианты, кроме быстрого RS-485?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 25 2012, 04:50
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Oct 25 2012, 01:07) *
Мне надо быстро сливать большой объём данных с одного устройства на другое, кабель - метра три, жил - желательно поменьше. Вокруг будут помехи, так что USB не катит. Какие ещё у меня варианты, кроме быстрого RS-485?

Но сейчас вы экспериментируете без помех? А если не получили подтверждения о правильном приеме, передаете еще раз? Или как еще можно объяснить замедление передачи на высоких скоростях?
Что, если на время пересылки не разрешать процессору бегать по программе (обращаться к Flash программы), а оставить в цикле, проверяющем окончание передачи? Все команды будут читаться из буфера, нагрузка на шины меньше.
Там, где обсуждалось про F/N, я предлагал рассчитывать скорости с округлением результата. Не просто F/N, а (F + N/2)/N. Может, вы уже подобрались к скоростям, когда дробную часть от деления просто отбрасывать нельзя?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 25 2012, 05:20
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ViKo @ Oct 25 2012, 10:50) *
Но сейчас вы экспериментируете без помех?
Да, сейчас помех нет.
Скорость падала потому, что я заносил в BRR значение меньше 16. Я не смотрел осциллографом, но, по всей видимости, скорость стала какая-то ооооочень маленькая от этогоsm.gif
Цитата(ViKo @ Oct 25 2012, 10:50) *
Не просто F/N, а (F + N/2)/N.
Да, у меня именно (F + N/2)/N. В примере упростил для большей прозрачности.
Цитата(ViKo @ Oct 25 2012, 10:50) *
Может, вы уже подобрались к скоростям, когда дробную часть от деления просто отбрасывать нельзя?
Не только подобрался, но и перебралсяsm.gif))

Цитата(Aner @ Oct 25 2012, 04:22) *
Однозначно, без проблем - Ethernet 100M.

Да нет, проблема есть, и очень серъёзная. Я не уверен, что смогу быстро подобрать быстроразъёмные соединения и кабеля IP65 для Ethernet. (У меня ещё и агрессивная среда)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 25 2012, 06:14
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Oct 25 2012, 08:20) *
Скорость падала потому, что я заносил в BRR значение меньше 16. Я не смотрел осциллографом, но, по всей видимости, скорость стала какая-то ооооочень маленькая от этогоsm.gif

Когда посмотрите осциллографом, расскажите. Наверное, скорость передачи будет той, что задали. Но биты не смогут читаться, потому что нарушается механизм выборок, которых нужно 16 на бит.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AHTOXA   STM32F1xx, UART на 10МБит - осуществимо?   Oct 24 2012, 09:25
- - Flexz   Дык у F1 у UART1 потолок 4.5Мбит, у 2 и 3 - 2.25МБ...   Oct 24 2012, 09:44
|- - AHTOXA   Цитата(Flexz @ Oct 24 2012, 15:44) Дык у ...   Oct 24 2012, 10:04
- - KRS   Я конечно давно не использовал STM32. Но практичес...   Oct 24 2012, 09:48
|- - scifi   Цитата(KRS @ Oct 24 2012, 13:48) примерна...   Oct 24 2012, 10:00
|- - KRS   Цитата(scifi @ Oct 24 2012, 14:00) Забавн...   Oct 24 2012, 10:07
|- - scifi   Цитата(KRS @ Oct 24 2012, 14:07) да один ...   Oct 24 2012, 10:15
||- - KRS   Цитата(scifi @ Oct 24 2012, 14:15) Кстати...   Oct 24 2012, 10:18
||- - AHTOXA   Цитата(scifi @ Oct 24 2012, 16:15) Кстати...   Oct 24 2012, 10:18
||- - scifi   Цитата(AHTOXA @ Oct 24 2012, 14:18) О, во...   Oct 24 2012, 10:26
|- - AHTOXA   Цитата(KRS @ Oct 24 2012, 16:07) BRR не м...   Oct 24 2012, 10:16
|- - KRS   Цитата(AHTOXA @ Oct 24 2012, 14:16) Насчё...   Oct 24 2012, 10:22
|- - AHTOXA   Цитата(KRS @ Oct 24 2012, 16:22) Это реал...   Oct 24 2012, 10:27
|- - scifi   Цитата(AHTOXA @ Oct 24 2012, 14:27) Или в...   Oct 24 2012, 10:35
|- - KRS   Цитата(AHTOXA @ Oct 24 2012, 14:27) Или в...   Oct 24 2012, 10:36
- - Flexz   Вообще-то "дробные" частоты получить оче...   Oct 24 2012, 10:53
|- - KRS   Цитата(Flexz @ Oct 24 2012, 14:53) А если...   Oct 24 2012, 10:56
- - Flexz   Кто ж ему помешает-то? 16 клоков нужны только для ...   Oct 24 2012, 11:01
|- - scifi   Цитата(AHTOXA @ Oct 25 2012, 09:20) Да не...   Oct 25 2012, 05:25
|- - Allregia   Цитата(AHTOXA @ Oct 25 2012, 07:20) Цитат...   Oct 25 2012, 06:07
- - ViKo   А ножки на 50 MHz настроили?   Oct 24 2012, 13:52
|- - AHTOXA   Да, конечно. Не стал приводить для краткости.   Oct 24 2012, 16:43
- - MrAlex   ЦитатаДробные - сильно сомневаюсь. (Нечто похожее ...   Oct 24 2012, 18:27
- - Aner   Однозначно, без проблем - Ethernet 100M.   Oct 24 2012, 22:22
- - AHTOXA   Цитата(Allregia @ Oct 25 2012, 12:07) RJ4...   Oct 25 2012, 08:16
|- - _pv   Цитата(AHTOXA @ Oct 25 2012, 15:16) Я не ...   Oct 25 2012, 09:26
- - Major   Цитатаможет тогда просто взять езернет PHY 10мбитн...   Jun 30 2014, 03:21
|- - _pv   Цитата(Major @ Jun 30 2014, 10:21) Возник...   Jun 30 2014, 08:32
|- - Aner   QUOTE (Major @ Jun 30 2014, 06:21) Возник...   Jun 30 2014, 11:21
- - Major   У меня проблема комплексная, и цена кабеля вторичн...   Jun 30 2014, 09:39
- - Major   ЦитатаSX1276 технология Lora, манчестер аппаратный...   Jun 30 2014, 12:02
- - Aner   http://www.aliexpress.com/item/Sfm-1-l-sx1...16987...   Jun 30 2014, 12:12


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 00:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016