Перейти к содержанию
    

Тактирование HAL-Cube STM32H7

Есть проект (код) для STM32H7, стало интересно разобраться с настройками тактирования шин и CPU на примере настройки тактирования в CubeMX- то есть сопоставить код настройки тактовой частоты МК со схемой настройки тактирования в Кубе.

Контроллер тактируется от внешнего источника 50 МГц.

Причина- по коду не понятно с какой частотой тактируются шины и ЦПУ. 

Очевидным решением моего вопроса было бы открыть reference manual на контроллер и сопоставлять схему тактирования с функцией инициализации из HAL-библиотеки и схемой в CubeMX. Но вот тут у меня проблема: я не могу найти соответствие между ними. 

Более конкретно о написанном выше. Код инициализации, сгенерированный CubeMX (но проекта, из которого генерили, нет):

Спойлер

void SystemClock_Config(void)
{
  /// Включает в себя следующие операции:
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /// - обновление конфигурации питания при включении;
  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); ///- конфигурация главного внутреннего стабилизатора напряжения;
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  /// - инициализация ЦПУ, тактов шин AHB и APB;
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState       = RCC_HSE_BYPASS;
  RCC_OscInitStruct.PLL.PLLState   = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource  = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM       = 4;
  RCC_OscInitStruct.PLL.PLLN       = 64;
  RCC_OscInitStruct.PLL.PLLP       = 2;
  RCC_OscInitStruct.PLL.PLLQ       = 4;
  RCC_OscInitStruct.PLL.PLLR       = 2;
  RCC_OscInitStruct.PLL.PLLRGE     = RCC_PLL1VCIRANGE_3;
  RCC_OscInitStruct.PLL.PLLVCOSEL  = RCC_PLL1VCOWIDE;
  RCC_OscInitStruct.PLL.PLLFRACN   = 0;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|
                                RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2|
                                RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;

  RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.SYSCLKDivider  = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider  = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2)!= HAL_OK)
  {
    Error_Handler();
  }

  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  PeriphClkInitStruct.PeriphClockSelection      = RCC_PERIPHCLK_UART4|RCC_PERIPHCLK_USART1|
                                                  RCC_PERIPHCLK_SPI3|RCC_PERIPHCLK_SPI1|
                                                  RCC_PERIPHCLK_SPI2;
  PeriphClkInitStruct.Spi123ClockSelection      = RCC_SPI123CLKSOURCE_PLL;
  PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
  PeriphClkInitStruct.Usart16ClockSelection     = RCC_USART16CLKSOURCE_D2PCLK2;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)!= HAL_OK)
  {
    Error_Handler();
  }

  /// - инициализация тактов АЦП;
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInitStruct.PLL2.PLL2M           = 4;
  PeriphClkInitStruct.PLL2.PLL2N           = 64;
  PeriphClkInitStruct.PLL2.PLL2P           = 8;
  PeriphClkInitStruct.PLL2.PLL2Q           = 2;
  PeriphClkInitStruct.PLL2.PLL2R           = 2;
  PeriphClkInitStruct.PLL2.PLL2RGE         = RCC_PLL2VCIRANGE_3;
  PeriphClkInitStruct.PLL2.PLL2VCOSEL      = RCC_PLL2VCOWIDE;
  PeriphClkInitStruct.PLL2.PLL2FRACN       = 0;
  PeriphClkInitStruct.AdcClockSelection    = RCC_ADCCLKSOURCE_PLL2;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)!= HAL_OK)
  {
    Error_Handler();
  }
}

Схема тактирования из Куба (дефолтный проект, обвел то, частоту чего мне интересно узнать):

Спойлер

image.thumb.png.9fdf841ec289a75a41514b699779bf5c.png

Схема тактирования из мануала на контроллер:

Спойлер

image.thumb.png.358307908f473571cc26d8c0a60f5ea2.png

Со строчками 

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState       = RCC_HSE_BYPASS;

все понятно. 

Но вот что за синтезаторы в коде PLLM, PLLN ... PLLR, что за делители уже есть вопросы. Такое название фигурирует только в коде. Тоже и про куб можно сказать: D1CPRE prescaler, HPRE prescaler встречаются только в схеме куба.

Посоветуйте, пожалуйста, как в этом разобраться? Мануал может какой-нибудь или апнота

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все регистры описаны в RM.

Код от Куба доступен вниз до записи в оегистры.

Все регистры доступны для просмотра в любой IDE.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Turgenev сказал:

PLLM, PLLN ... PLLR, что за делители уже есть вопросы.

На приведённых вами картинках DIVMx, DIVNx, ... это оно и есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, VladislavS сказал:

На приведённых вами картинках DIVMx, DIVNx, ... это оно и есть.

Похоже на то. Но в коде есть настройка синтезатора с буквами M, N, P... без номера, хотя на схемах нет синтезатора без номера.

В коде настраивается только один синтезатор с номером (номер 2), т.е. например PeriphClkInitStruct.PLL2.PLL2M = 4... и т.д.

3й синтезатор может не использоваться, но первый, судя по схемам, не может не использоваться- он тактирует ЦПУ. Правильно ли полагать, что синтезатор без номера в коде (RCC_OscInitStruct.PLL. ...) это первый синтезатор на схемах?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...