Перейти к содержанию
    

STM32F1xx, UART на 10МБит - осуществимо?

Всем привет.

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:

 

Такое впечатление, что обмен по DMA становится слишком интенсивным, и полностью забивает шину.

Поэтому у меня вопрос: это я натолкнулся на ограничения железа? Или я что-то делаю не так?

Кто-нибудь имел дело с такими скоростями UART, и насколько успешно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык у F1 у UART1 потолок 4.5Мбит, у 2 и 3 - 2.25МБит

36000000/16 (при единичке в BRR) и будет 2.25, откуда 10?

PS 10МБит достижимо для F4 только

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я конечно давно не использовал STM32.

Но практически везде максимальную скорость можно при кинуть по формуле Freq/16. Т.е. при 36 MHZ выше 2.25 мбита не получить.

Да и в даташите указано что уарт максимум на 4.5 мбита, как раз при 72 mhz и получается (но это на старые STM32, с новыми я не работал)

 

А эта запись:

 

 USART3->BRR = 36000000 / BAUDRATE;

вообще странна!

потому что в этом регистре же не только целая часть делителя но и дробная!

 

примерная формула должна быть такая

(36000000*16) / (BAUDRATE*16)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

примерная формула должна быть такая

(36000000*16) / (BAUDRATE*16)

Забавная формула, учитывая, что 16 в числителе и знаменателе сокращаются :-)

Это уже обсуждалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык у F1 у UART1 потолок 4.5Мбит, у 2 и 3 - 2.25МБит

36000000/16 (при единичке в BRR) и будет 2.25, откуда 10?

Да, проглядел про 4.5Мбит.

Про единичку в BRR - не понял, при скорости 3 600 000 в BRR будет 10.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забавная формула, учитывая, что 16 в числителе и знаменателе сокращаются :-)

Это уже обсуждалось.

что то я туплю там действительно все сокращается.

но есть ограничения.

 

Про единичку в BRR - не понял, при скорости 3 600 000 в BRR будет 10.

BRR не может быть меньше 16

там фиксед поинт. но число не может быть меньше 1.0

а 10 это 10/16

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да один множитель лишний

(36000000*16) / BAUDRATE

Всё-таки посетите ссылку.

Кстати, в STM32F2xx есть режим OVER8 (то есть oversampling 8, а не 16), там макс. битовая скорость Fbus/8.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

BRR не может быть меньше 16

там фиксед поинт. но число не может быть меньше 1.0

а 10 это 10/16

Насчёт фиксед поинт - это бредни маркетологов ST.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, в STM32F2xx есть режим OVER8 (то есть oversampling 8, а не 16), там макс. битовая скорость Fbus/8.

В старых, которые 72Mhz вроде не было еще! (по крайней которые я использовал)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, в STM32F2xx есть режим OVER8 (то есть oversampling 8, а не 16), там макс. битовая скорость Fbus/8.

О, вот это ценно, спасибо! То есть, при 120 МГц это будет уже 15 Мбит. Это меня вполне устроит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчёт фиксед поинт - это бредни маркетологов ST.

Это реальный фиксед поинт!

UART на 1 бит требуется 16 клоков.

там все сокращается из за того что 4 бита после точки! Вот формула и кривая.

 

Обычно делитель считается как: Частота/16/Скорость в битах

Но у STM32 дробный делитель.

Регистр = Частота/16/Скорость в битах*16

16 сокращается.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О, вот это ценно, спасибо! То есть, при 120 МГц это будет уже 15 Мбит. Это меня вполне устроит.

К сожалению, шину, на которой сидит UART, нельзя разгонять выше 60 МГц.

Тогда уж STM32F4xx. Там 168 МГц, т.е. макс. скорость UART 10,5 Мбит/с.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это реальный фиксед поинт!

UART на 1 бит требуется 16 клоков.

там все сокращается из за того что 4 бита после точки! Вот формула и кривая.

Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-ов:)

Конечно, это звучит не так маркетологически круто, как "fractional baudrate generator":)

ЗЫ. Я в своё время даже составил табличку в экселе, с двумя колонками. В одной - формула из даташита, в другой - F_BUS/BAUDRATE. И колонки совпали полностью:)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-ов:)

Интересная интерпретация, но формула BRR = Fbus / BaudRate говорит о том, что регистр всё-таки задаёт частоту битов UART. Поэтому какая-та заморочка с тактированием там должна быть, чтобы получить дробные частоты. Сигма-дельта или что-то такое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-ов:)

Она там и задается!

с дробной частью.

потому что если туда записать 16

то клоки на UART пойдут 1 к 1 (в Вашем примере 36 Mhz и скорость UART будет 2.25 мбит)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...