|
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, и насколько успешно?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
 |
Ответов
|
Oct 24 2012, 13:24
|

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

|
Цитата(scifi @ Oct 24 2012, 16:26)  К сожалению, шину, на которой сидит UART, нельзя разгонять выше 60 МГц. То есть, максимум 7.5 МБит? Это хуже чем 15, но лучше, чем 2.25  Цитата(scifi @ Oct 24 2012, 16:35)  Интересная интерпретация, но формула BRR = Fbus / BaudRate говорит о том, что регистр всё-таки задаёт частоту битов UART. Поэтому какая-та заморочка с тактированием там должна быть, чтобы получить дробные частоты. Сигма-дельта или что-то такое. Скорее, там где-то есть неявное предварительное умножение F_BUS на 16. Дробные - сильно сомневаюсь. (Нечто похожее на дробные скорости встречал только у MSP430, и то, там это надо было задавать руками в виде битовой маски добавочных тактов по битам.)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 24 2012, 19:30
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(AHTOXA @ Oct 24 2012, 20:24)  То есть, максимум 7.5 МБит? Это хуже чем 15, но лучше, чем 2.25  Скорее, там где-то есть неявное предварительное умножение F_BUS на 16. Дробные - сильно сомневаюсь. (Нечто похожее на дробные скорости встречал только у MSP430, и то, там это надо было задавать руками в виде битовой маски добавочных тактов по битам.) максимум 4.5 на 72МГц. нет там умножения, просто при делении на 16 разрешили выбирать скорость не как обычно после деления на 16: F/16/N, а просто как F/N, при N>16. что позволяет более гибкую настройку частоты.
если надо только передавать, а с другой стороны принимать будет кто-нибудь с УАРТом по-быстрее, то можно передатчик от SPI задействовать, только буфер нужен будет в два раза больше под 16ти разрядные данные и руками надо будет по нему пробежаться и стартовые биты в каждый байт добавить. из него тогда и 72/2/2 = 18МБит вроде выжать можно.
|
|
|
|
|
Oct 24 2012, 20:06
|

фанат дивана
     
Группа: Свой
Сообщений: 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)  если надо только передавать Нет, к сожалению, принимать тоже нужно.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 24 2012, 20:35
|
Гуру
     
Группа: Свой
Сообщений: 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Мбит.
|
|
|
|
|
Oct 24 2012, 21:12
|

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

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

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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. Может, вы уже подобрались к скоростям, когда дробную часть от деления просто отбрасывать нельзя?
|
|
|
|
|
Oct 25 2012, 05:20
|

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

|
Цитата(ViKo @ Oct 25 2012, 10:50)  Но сейчас вы экспериментируете без помех? Да, сейчас помех нет. Скорость падала потому, что я заносил в BRR значение меньше 16. Я не смотрел осциллографом, но, по всей видимости, скорость стала какая-то ооооочень маленькая от этого  Цитата(ViKo @ Oct 25 2012, 10:50)  Не просто F/N, а (F + N/2)/N. Да, у меня именно (F + N/2)/N. В примере упростил для большей прозрачности. Цитата(ViKo @ Oct 25 2012, 10:50)  Может, вы уже подобрались к скоростям, когда дробную часть от деления просто отбрасывать нельзя? Не только подобрался, но и перебрался  )) Цитата(Aner @ Oct 25 2012, 04:22)  Однозначно, без проблем - Ethernet 100M. Да нет, проблема есть, и очень серъёзная. Я не уверен, что смогу быстро подобрать быстроразъёмные соединения и кабеля IP65 для Ethernet. (У меня ещё и агрессивная среда)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 25 2012, 06:14
|

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

|
Цитата(AHTOXA @ Oct 25 2012, 08:20)  Скорость падала потому, что я заносил в BRR значение меньше 16. Я не смотрел осциллографом, но, по всей видимости, скорость стала какая-то ооооочень маленькая от этого  Когда посмотрите осциллографом, расскажите. Наверное, скорость передачи будет той, что задали. Но биты не смогут читаться, потому что нарушается механизм выборок, которых нужно 16 на бит.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|