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

Флейм в чистом виде - все что угодно...
Но - в рамках закона :)
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

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;
nahimovv
Нашел транзистор. Понюхал.
Сообщения: 180
Зарегистрирован: Чт янв 23, 2014 01:51:35

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

Сообщение nahimovv »

Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Леонид Иванович писал(а): Интересно было бы узнать, что там не так?


Вместо простыни магических вычисления, все телодвижения выполняет препроцессор. :)))

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

USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; 
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

Это не является аналогом, так как не позволяет в ран-тайме менять 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
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Леонид Иванович писал(а):Это не является аналогом, так как не позволяет в ран-тайме менять baudrate.


Не проще набить необходимые Вам скорости в хэдере ?

Ну если Вы собираетесь использовать нестандартные скорости и на ходу так же менять тактовую ,
то можно и вычислять - только не с SPL извращениями и не с Вашей такой же фигней.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

dosikus писал(а):Вместо простыни магических вычисления, все телодвижения выполняет препроцессор. :)))

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

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


Более лютого быдлокода мне еще не приходилось видеть. Погрешности не пытались посчитать?
nahimovv
Нашел транзистор. Понюхал.
Сообщения: 180
Зарегистрирован: Чт янв 23, 2014 01:51:35

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

Сообщение nahimovv »

Более лютого говнопоста я тоже не видел! Считайте в столбик!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Леонид Иванович писал(а):Это не является аналогом, так как не позволяет в ран-тайме менять baudrate.


С чего такие ляповатые выводы? Константы заменить на переменные - никак нельзя? :)))

a5021 писал(а):Более лютого быдлокода мне еще не приходилось видеть. Погрешности не пытались посчит..


Продолжаешь смешить окружающих... :)))
У тебя это лучше всего выходит, а в эбедд тебе категорически нельзя...
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 952
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

Леонид Иванович писал(а):
dosikus писал(а):SPL, скопипасти сюда вычисление скорости USART - поржем всем форумом над тобой и "программистами" STM.


Скопипастил. Интересно было бы узнать, что там не так?

Леонид Иванович, как не странно, но при постоянной тактовой частоте процессора и скорости передачи приведённая однострочная формула полностью верна. Для нескольких частот и скоростей её можно вычислить заранее и представить в константах. Я проверял в железе, всё работает.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

dosikus писал(а):и не с Вашей такой же фигней.


Да, действительно, не работает. Вот и получается, что SPL нужна, там хоть функции работают. А написать их самостоятельно не каждому по силам.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

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


Не работает что ?
Вы там часом в BRR не при включенном UART пишете? :)))
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

GARMIN писал(а):Леонид Иванович, как не странно, но при постоянной тактовой частоте процессора и скорости передачи приведённая однострочная формула полностью верна.
Я проверял в железе, всё работает.

Верна-верна, еще как верна... На 921600 бодах уход скорости по формуле имени dosikus-а составит ~18%. А вот у SPL потери точности нет. Там 0.16% ухода дает само железо из за недостатка разрядности представления значения после запятой.

Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

Вот так работает. Только пока не знаю, где добыть значения 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 ), потери точности нет.
Последний раз редактировалось Леонид Иванович Пн янв 27, 2014 20:45:19, всего редактировалось 1 раз.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение 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 молятся...
Последний раз редактировалось dosikus Пн янв 27, 2014 21:00:20, всего редактировалось 1 раз.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

Я всего лишь за корректное сравнение. Если утверждается, что библиотечная функция написано плохо, то нужно представить ее функциональный аналог, а не одно выражение из констант.

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

А когда тактирование может быть не от APB1 или APB2?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Леонид Иванович писал(а):дело в том, что значение делителя масштабируется в 16 раз (или в 8 раз, если оверсемплинг на 8 ), потери точности нет.

Оверсемплинг это только прием. С передачей то что делать? Уход больше процента это уже много.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

С передачей будет все нормально - делитель частоты USART имеет дробный коэффициент деления. Размерность дробной части случайно (почти :) совпадает с оверсемплингом на приеме.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение 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
Последний раз редактировалось dosikus Пн янв 27, 2014 21:18:59, всего редактировалось 2 раза.
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

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

Сообщение menzoda »

a5021 писал(а):Уход больше процента это уже много.

Вот как раз для UART это не много.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Да и до кучи , в F0 и F3 есть еще и Auto baud rate detection .
Так что и вычислялка не понадобится ... :)))
Ответить

Вернуться в «МЯЯЯУ!»