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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> 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
Flexz
сообщение Oct 24 2012, 09:44
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Дык у F1 у UART1 потолок 4.5Мбит, у 2 и 3 - 2.25МБит
36000000/16 (при единичке в BRR) и будет 2.25, откуда 10?
PS 10МБит достижимо для F4 только
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 24 2012, 09:48
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Я конечно давно не использовал STM32.
Но практически везде максимальную скорость можно при кинуть по формуле Freq/16. Т.е. при 36 MHZ выше 2.25 мбита не получить.
Да и в даташите указано что уарт максимум на 4.5 мбита, как раз при 72 mhz и получается (но это на старые STM32, с новыми я не работал)

А эта запись:

Код
USART3->BRR = 36000000 / BAUDRATE;

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

примерная формула должна быть такая
(36000000*16) / (BAUDRATE*16)
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 24 2012, 10:00
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(KRS @ Oct 24 2012, 13:48) *
примерная формула должна быть такая
(36000000*16) / (BAUDRATE*16)

Забавная формула, учитывая, что 16 в числителе и знаменателе сокращаются :-)
Это уже обсуждалось.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 24 2012, 10:04
Сообщение #5


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

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



Цитата(Flexz @ Oct 24 2012, 15:44) *
Дык у F1 у UART1 потолок 4.5Мбит, у 2 и 3 - 2.25МБит
36000000/16 (при единичке в BRR) и будет 2.25, откуда 10?

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


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


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(scifi @ Oct 24 2012, 14:00) *
Забавная формула, учитывая, что 16 в числителе и знаменателе сокращаются :-)
Это уже обсуждалось.

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

Цитата(AHTOXA @ Oct 24 2012, 14:04) *
Про единичку в BRR - не понял, при скорости 3 600 000 в BRR будет 10.

BRR не может быть меньше 16
там фиксед поинт. но число не может быть меньше 1.0
а 10 это 10/16
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 24 2012, 10:15
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(KRS @ Oct 24 2012, 14:07) *
да один множитель лишний
(36000000*16) / BAUDRATE

Всё-таки посетите ссылку.
Кстати, в STM32F2xx есть режим OVER8 (то есть oversampling 8, а не 16), там макс. битовая скорость Fbus/8.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 24 2012, 10:16
Сообщение #8


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

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



Цитата(KRS @ Oct 24 2012, 16:07) *
BRR не может быть меньше 16
там фиксед поинт. но число не может быть меньше 1.0
а 10 это 10/16

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


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


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(scifi @ Oct 24 2012, 14:15) *
Кстати, в STM32F2xx есть режим OVER8 (то есть oversampling 8, а не 16), там макс. битовая скорость Fbus/8.

В старых, которые 72Mhz вроде не было еще! (по крайней которые я использовал)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 24 2012, 10:18
Сообщение #10


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

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



Цитата(scifi @ Oct 24 2012, 16:15) *
Кстати, в STM32F2xx есть режим OVER8 (то есть oversampling 8, а не 16), там макс. битовая скорость Fbus/8.

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


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


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(AHTOXA @ Oct 24 2012, 14:16) *
Насчёт фиксед поинт - это бредни маркетологов ST.

Это реальный фиксед поинт!
UART на 1 бит требуется 16 клоков.
там все сокращается из за того что 4 бита после точки! Вот формула и кривая.

Обычно делитель считается как: Частота/16/Скорость в битах
Но у STM32 дробный делитель.
Регистр = Частота/16/Скорость в битах*16
16 сокращается.

Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 24 2012, 10:26
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(AHTOXA @ Oct 24 2012, 14:18) *
О, вот это ценно, спасибо! То есть, при 120 МГц это будет уже 15 Мбит. Это меня вполне устроит.

К сожалению, шину, на которой сидит UART, нельзя разгонять выше 60 МГц.
Тогда уж STM32F4xx. Там 168 МГц, т.е. макс. скорость UART 10,5 Мбит/с.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 24 2012, 10:27
Сообщение #13


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

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



Цитата(KRS @ Oct 24 2012, 16:22) *
Это реальный фиксед поинт!
UART на 1 бит требуется 16 клоков.
там все сокращается из за того что 4 бита после точки! Вот формула и кривая.

Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-овsm.gif
Конечно, это звучит не так маркетологически круто, как "fractional baudrate generator":)
ЗЫ. Я в своё время даже составил табличку в экселе, с двумя колонками. В одной - формула из даташита, в другой - F_BUS/BAUDRATE. И колонки совпали полностьюsm.gif



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


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(AHTOXA @ Oct 24 2012, 14:27) *
Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-овsm.gif

Интересная интерпретация, но формула BRR = Fbus / BaudRate говорит о том, что регистр всё-таки задаёт частоту битов UART. Поэтому какая-та заморочка с тактированием там должна быть, чтобы получить дробные частоты. Сигма-дельта или что-то такое.
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 24 2012, 10:36
Сообщение #15


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(AHTOXA @ Oct 24 2012, 14:27) *
Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-овsm.gif

Она там и задается!
с дробной частью.
потому что если туда записать 16
то клоки на UART пойдут 1 к 1 (в Вашем примере 36 Mhz и скорость UART будет 2.25 мбит)

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:33
Рейтинг@Mail.ru


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