Страница 14 из 40

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 13:28:09
Леонид Иванович
dosikus писал(а):SPL, скопипасти сюда вычисление скорости USART - поржем всем форумом над тобой и "программистами" STM.
Скопипастил. Интересно было бы узнать, что там не так?
Спойлер

Код: Выделить всё

  /* Configure the USART Baud Rate */
  RCC_GetClocksFreq(&RCC_ClocksStatus);
  if (usartxbase == USART1_BASE)
  {
    apbclock = RCC_ClocksStatus.PCLK2_Frequency;
  }
  else
  {
    apbclock = RCC_ClocksStatus.PCLK1_Frequency;
  }
  
  /* Determine the integer part */
  if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
  {
    /* Integer part computing in case Oversampling mode is 8 Samples */
    integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));    
  }
  else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
  {
    /* Integer part computing in case Oversampling mode is 16 Samples */
    integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));    
  }
  tmpreg = (integerdivider / 100) << 4;

  /* Determine the fractional part */
  fractionaldivider = integerdivider - (100 * (tmpreg >> 4));

  /* Implement the fractional part in the register */
  if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
  {
    tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
  }
  else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
  {
    tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
  }
  
  /* Write to USART BRR */
  USARTx->BRR = (uint16_t)tmpreg;

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 14:01:13
nahimovv

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 14:13:18
dosikus
Леонид Иванович писал(а): Интересно было бы узнать, что там не так?
Вместо простыни магических вычисления, все телодвижения выполняет препроцессор. :)))

Код: Выделить всё

USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; 

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 14:49:53
Леонид Иванович
Это не является аналогом, так как не позволяет в ран-тайме менять baudrate. Речь идет про полный аналог библиотечной функции. Если упростить вот так, она не будет врать?

Код: Выделить всё

  if ((USARTx->CR1 & CR1_OVER8_Set) != 0) // Oversampling mode is 8 Samples
  {
      tmpreg = apbclock / (8 * USART_InitStruct->USART_BaudRate);    
  }
  else // Oversampling mode is 16 Samples
  {
      tmpreg = apbclock / (16 * USART_InitStruct->USART_BaudRate);    
  }
  USARTx->BRR = (uint16_t)tmpreg; // Write to USART BRR
Или округление еще добавить?

Код: Выделить всё

  if ((USARTx->CR1 & CR1_OVER8_Set) != 0) // Oversampling mode is 8 Samples
  {
      tmpreg = 8 * USART_InitStruct->USART_BaudRate;
      tmpreg = (apbclock  + tmpreg / 2) / tempreg;    
  }
  else // Oversampling mode is 16 Samples
  {
      tmpreg = 16 * USART_InitStruct->USART_BaudRate;
      tmpreg = (apbclock  + tmpreg / 2) / tempreg;    
  }
  USARTx->BRR = (uint16_t)tmpreg; // Write to USART BRR

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 15:01:20
dosikus
Леонид Иванович писал(а):Это не является аналогом, так как не позволяет в ран-тайме менять baudrate.
Не проще набить необходимые Вам скорости в хэдере ?

Ну если Вы собираетесь использовать нестандартные скорости и на ходу так же менять тактовую ,
то можно и вычислять - только не с SPL извращениями и не с Вашей такой же фигней.

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 15:44:53
a5021
dosikus писал(а): Вместо простыни магических вычисления, все телодвижения выполняет препроцессор. :)))

Код: Выделить всё

USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; 
Более лютого быдлокода мне еще не приходилось видеть. Погрешности не пытались посчитать?

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 15:56:53
nahimovv
Более лютого говнопоста я тоже не видел! Считайте в столбик!

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 16:36:29
dosikus
Леонид Иванович писал(а):Это не является аналогом, так как не позволяет в ран-тайме менять baudrate.
С чего такие ляповатые выводы? Константы заменить на переменные - никак нельзя? :)))
a5021 писал(а): Более лютого быдлокода мне еще не приходилось видеть. Погрешности не пытались посчит..
Продолжаешь смешить окружающих... :)))
У тебя это лучше всего выходит, а в эбедд тебе категорически нельзя...

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 19:00:16
GARMIN
Леонид Иванович писал(а):
dosikus писал(а):SPL, скопипасти сюда вычисление скорости USART - поржем всем форумом над тобой и "программистами" STM.
Скопипастил. Интересно было бы узнать, что там не так?
Леонид Иванович, как не странно, но при постоянной тактовой частоте процессора и скорости передачи приведённая однострочная формула полностью верна. Для нескольких частот и скоростей её можно вычислить заранее и представить в константах. Я проверял в железе, всё работает.

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 19:46:15
Леонид Иванович
dosikus писал(а):и не с Вашей такой же фигней.
Да, действительно, не работает. Вот и получается, что SPL нужна, там хоть функции работают. А написать их самостоятельно не каждому по силам.

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 19:49:20
dosikus
Леонид Иванович писал(а):
Да, действительно, не работает. Вот и получается, что SPL нужна, там хоть функции работают. А написать их самостоятельно не каждому по .
Не работает что ?
Вы там часом в BRR не при включенном UART пишете? :)))

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 20:18:34
a5021
GARMIN писал(а): Леонид Иванович, как не странно, но при постоянной тактовой частоте процессора и скорости передачи приведённая однострочная формула полностью верна.
Я проверял в железе, всё работает.
Верна-верна, еще как верна... На 921600 бодах уход скорости по формуле имени dosikus-а составит ~18%. А вот у SPL потери точности нет. Там 0.16% ухода дает само железо из за недостатка разрядности представления значения после запятой.


Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 20:39:34
Леонид Иванович
Вот так работает. Только пока не знаю, где добыть значения APB1_Frequency, APB2_Frequency. Единственный способ - достать через функцию RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks), но это опять библиотека.

Код: Выделить всё

void UART_SetBaud(USART_TypeDef* USARTx, uint32_t Baud)
{
  if ((USARTx == USART1) || (USARTx == USART6))
  {
    apbclock = APB2_Frequency;
  }
  else
  {
    apbclock = APB1_Frequency;
  }
  if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
    apbclock = apbclock * 2; //иначе не работает при оверсемплинге 8
  USARTx->BRR = (apbclock  + Baud / 2) / Baud;
}
a5021, дело в том, что значение делителя масштабируется в 16 раз (или в 8 раз, если оверсемплинг на 8 ), потери точности нет.

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 20:42:10
dosikus
a5021 писал(а): Верна-верна, еще как верна... На 921600 бодах уход скорости по формуле имени dosikus-а составит ~18
А теперь уеб..ок потрудись открыть даташит на F3 или F0, и найти там процедуру расчета .

To obtain 921.6 Kbaud with fCK= 48 MHz.
• In case of oversampling by 16:
USARTDIV = 48 000 000/921 600
BRR = USARTDIV = 52d = 0x34
И сравнить с тем что я выложил.


STM вовремя поняли свои ляпы и исправили, в отличии от тебя .
Только не надо пи..здеть что генератор в новых другой


Уеб..ок , расчет не мой , мне чужие лавры не нужны . Я просто умею и читать и осознавать прочитанное .

Звание почетного клоуна-аурдинщика ты уже заработал железно. :))) :))) :)))

Леонид Иванович писал(а):Вот так работает. Только пока не знаю, где добыть значения APB1_Frequency, APB2_Frequency.
Вас снова несет в дебри .
Вы так часто меняет тактовую что аж необходимо ее на лету расчитывать?
Или Вас как любого нуба так и плющит создать универсальное дерьмо ?

Кстати тактовая UART не всегда от APB1 или 2....
Единственный способ - достать через функцию RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks), но это опять библиотека.
Если уж Вам так приспичило , можно и эту функцию вытащить и упростить . И не нужна будет SPL .
На SPL пусть клоуны с порядковым номером a5021 молятся...

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 20:57:45
Леонид Иванович
Я всего лишь за корректное сравнение. Если утверждается, что библиотечная функция написано плохо, то нужно представить ее функциональный аналог, а не одно выражение из констант.

А разве расчет делителя в F1 и F4 чем-то отличается от F0 и F3?

А когда тактирование может быть не от APB1 или APB2?

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 21:02:23
a5021
Леонид Иванович писал(а):дело в том, что значение делителя масштабируется в 16 раз (или в 8 раз, если оверсемплинг на 8 ), потери точности нет.
Оверсемплинг это только прием. С передачей то что делать? Уход больше процента это уже много.

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 21:08:11
Леонид Иванович
С передачей будет все нормально - делитель частоты USART имеет дробный коэффициент деления. Размерность дробной части случайно (почти :) совпадает с оверсемплингом на приеме.

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 21:11:12
dosikus
Леонид Иванович писал(а):Я всего лишь за корректное сравнение. Если утверждается, что библиотечная функция написано плохо, то нужно представить ее функциональный аналог, а не одно выражение из констант.
В большинстве реализаций нужна только одна скорость . С этим надеюсь спорить не будете ?
В большинстве оставшихся - ряд фиксированных стандартных .
Возможен вариант , я не спорю, когда вы будете переключать и скорость и тактовую. Ну максимум 2 тактовые и стандартный ряд на них.
Причем переключаясь вы знаете какая у Вас будет тактовая и какая на ней скорость .
Все выше приведенные случаи совершенно не требуют вычислений и легко реализуются на константах.
А разве расчет делителя в F1 и F4 чем-то отличается от F0 и F3?

Физически нет, только исправленным описанием в Referense manual.

А когда тактирование может быть не от APB1 или APB2?
STM32F0-
Bits 17:16USART2SW[1:0]:USART2 clock source selection (available only on STM32F07x devices)
This bit is set and cleared by software to select the USART2 clock source.
00: PCLK selected as USART2 clock source (default)
01: System clock (SYSCLK) selected as USART2 clock
10: LSE clock selected as USART2 clock
11: HSI clock selected as USART2 clock
Bits 1:0USART1SW[1:0]:USART1 clock source selection
This bit is set and cleared by software to select the USART1 clock source.
00: PCLK selected as USART1 clock source (default)
01: System clock (SYSCLK) selected as USART1 clock
10: LSE clock selected as USART1 clock
11: HSI clock selected as USART1 clock
STM32F3-
Bits 23:22UART5SW[1:0]:UART5 clock source selection
This bit is set and cleared by software to select the UART5 clock source.
00: PCLK selected as UART5 clock source (default)
01: System clock (SYSCLK) selected as UART5 clock
10: LSE clock selected as UART5 clock
11: HSI clock selected as UART5 clock
Bits 21:20UART4SW[1:0]:UART4 clock source selection
This bit is set and cleared by software to select the UART4 clock source.
00: PCLK selected as UART4 clock source (default)
01: System clock (SYSCLK) selected as UART4 clock
10: LSE clock selected as UART4 clock
11: HSI clock selected as UART4 clock
Bits 19:18USART3SW[1:0]:USART3 clock source selection
This bit is set and cleared by softwareto select the USART3 clock source.
00: PCLK selected as USART3 clock source (default)
01: System clock (SYSCLK) selected as USART3 clock
10: LSE clock selected as USART3 clock
11: HSI clock selected as USART3 clock
Bits 17:16USART2SW[1:0]:USART2 clock source selection
This bit is set and cleared by softwareto select the USART2 clock source.
00: PCLK selected as USART2 clock source (default)
01: System clock (SYSCLK) selected as USART2 clock
10: LSE clock selected as USART2 clock
11: HSI clock selected as USART2 clock

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 21:11:57
menzoda
a5021 писал(а):Уход больше процента это уже много.
Вот как раз для UART это не много.

Re: Кто сам изучил програмирование мк?

Добавлено: Пн янв 27, 2014 21:30:29
dosikus
Да и до кучи , в F0 и F3 есть еще и Auto baud rate detection .
Так что и вычислялка не понадобится ... :)))