|
STM32F1xx, UART на 10МБит - осуществимо? |
|
|
|
Oct 24 2012, 09:25
|

фанат дивана
     
Группа: Свой
Сообщений: 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х) секунд. При дальнейшем увеличении скорости отправка вообще перестаёт завершаться.  Такое впечатление, что обмен по DMA становится слишком интенсивным, и полностью забивает шину. Поэтому у меня вопрос: это я натолкнулся на ограничения железа? Или я что-то делаю не так? Кто-нибудь имел дело с такими скоростями UART, и насколько успешно?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Oct 24 2012, 09:48
|

Профессионал
    
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Oct 24 2012, 10:07
|

Профессионал
    
Группа: Модераторы
Сообщений: 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
|
|
|
|
|
Oct 24 2012, 10:22
|

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

|
Цитата(AHTOXA @ Oct 24 2012, 14:16)  Насчёт фиксед поинт - это бредни маркетологов ST. Это реальный фиксед поинт! UART на 1 бит требуется 16 клоков. там все сокращается из за того что 4 бита после точки! Вот формула и кривая. Обычно делитель считается как: Частота/16/Скорость в битах Но у STM32 дробный делитель. Регистр = Частота/16/Скорость в битах*16 16 сокращается.
|
|
|
|
|
Oct 24 2012, 10:26
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(AHTOXA @ Oct 24 2012, 14:18)  О, вот это ценно, спасибо! То есть, при 120 МГц это будет уже 15 Мбит. Это меня вполне устроит. К сожалению, шину, на которой сидит UART, нельзя разгонять выше 60 МГц. Тогда уж STM32F4xx. Там 168 МГц, т.е. макс. скорость UART 10,5 Мбит/с.
|
|
|
|
|
Oct 24 2012, 10:36
|

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

|
Цитата(AHTOXA @ Oct 24 2012, 14:27)  Или вот вам другая версия: в BRR задаётся не частота UART, а внутренняя частота семплирования UART, равная baudrate*16. И никаких fixed-point-ов  Она там и задается! с дробной частью. потому что если туда записать 16 то клоки на UART пойдут 1 к 1 (в Вашем примере 36 Mhz и скорость UART будет 2.25 мбит)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|