AHTOXA 18 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Всем привет. 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х) секунд. При дальнейшем увеличении скорости отправка вообще перестаёт завершаться. Такое впечатление, что обмен по DMA становится слишком интенсивным, и полностью забивает шину. Поэтому у меня вопрос: это я натолкнулся на ограничения железа? Или я что-то делаю не так? Кто-нибудь имел дело с такими скоростями UART, и насколько успешно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Дык у F1 у UART1 потолок 4.5Мбит, у 2 и 3 - 2.25МБит 36000000/16 (при единичке в BRR) и будет 2.25, откуда 10? PS 10МБит достижимо для F4 только Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Я конечно давно не использовал STM32. Но практически везде максимальную скорость можно при кинуть по формуле Freq/16. Т.е. при 36 MHZ выше 2.25 мбита не получить. Да и в даташите указано что уарт максимум на 4.5 мбита, как раз при 72 mhz и получается (но это на старые STM32, с новыми я не работал) А эта запись: USART3->BRR = 36000000 / BAUDRATE; вообще странна! потому что в этом регистре же не только целая часть делителя но и дробная! примерная формула должна быть такая (36000000*16) / (BAUDRATE*16) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба примерная формула должна быть такая (36000000*16) / (BAUDRATE*16) Забавная формула, учитывая, что 16 в числителе и знаменателе сокращаются :-) Это уже обсуждалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Дык у F1 у UART1 потолок 4.5Мбит, у 2 и 3 - 2.25МБит 36000000/16 (при единичке в BRR) и будет 2.25, откуда 10? Да, проглядел про 4.5Мбит. Про единичку в BRR - не понял, при скорости 3 600 000 в BRR будет 10. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Забавная формула, учитывая, что 16 в числителе и знаменателе сокращаются :-) Это уже обсуждалось. что то я туплю там действительно все сокращается. но есть ограничения. Про единичку в BRR - не понял, при скорости 3 600 000 в BRR будет 10. BRR не может быть меньше 16 там фиксед поинт. но число не может быть меньше 1.0 а 10 это 10/16 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба да один множитель лишний (36000000*16) / BAUDRATE Всё-таки посетите ссылку. Кстати, в STM32F2xx есть режим OVER8 (то есть oversampling 8, а не 16), там макс. битовая скорость Fbus/8. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба BRR не может быть меньше 16 там фиксед поинт. но число не может быть меньше 1.0 а 10 это 10/16 Насчёт фиксед поинт - это бредни маркетологов ST. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Кстати, в STM32F2xx есть режим OVER8 (то есть oversampling 8, а не 16), там макс. битовая скорость Fbus/8. В старых, которые 72Mhz вроде не было еще! (по крайней которые я использовал) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Кстати, в STM32F2xx есть режим OVER8 (то есть oversampling 8, а не 16), там макс. битовая скорость Fbus/8. О, вот это ценно, спасибо! То есть, при 120 МГц это будет уже 15 Мбит. Это меня вполне устроит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Насчёт фиксед поинт - это бредни маркетологов ST. Это реальный фиксед поинт! UART на 1 бит требуется 16 клоков. там все сокращается из за того что 4 бита после точки! Вот формула и кривая. Обычно делитель считается как: Частота/16/Скорость в битах Но у STM32 дробный делитель. Регистр = Частота/16/Скорость в битах*16 16 сокращается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба О, вот это ценно, спасибо! То есть, при 120 МГц это будет уже 15 Мбит. Это меня вполне устроит. К сожалению, шину, на которой сидит UART, нельзя разгонять выше 60 МГц. Тогда уж STM32F4xx. Там 168 МГц, т.е. макс. скорость UART 10,5 Мбит/с. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Это реальный фиксед поинт! UART на 1 бит требуется 16 клоков. там все сокращается из за того что 4 бита после точки! Вот формула и кривая. Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-ов:) Конечно, это звучит не так маркетологически круто, как "fractional baudrate generator":) ЗЫ. Я в своё время даже составил табличку в экселе, с двумя колонками. В одной - формула из даташита, в другой - F_BUS/BAUDRATE. И колонки совпали полностью:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-ов:) Интересная интерпретация, но формула BRR = Fbus / BaudRate говорит о том, что регистр всё-таки задаёт частоту битов UART. Поэтому какая-та заморочка с тактированием там должна быть, чтобы получить дробные частоты. Сигма-дельта или что-то такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-ов:) Она там и задается! с дробной частью. потому что если туда записать 16 то клоки на UART пойдут 1 к 1 (в Вашем примере 36 Mhz и скорость UART будет 2.25 мбит) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться