Turgenev 1 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба Есть проект (код) для 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(); } } Схема тактирования из Куба (дефолтный проект, обвел то, частоту чего мне интересно узнать): Спойлер Схема тактирования из мануала на контроллер: Спойлер Со строчками RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; все понятно. Но вот что за синтезаторы в коде PLLM, PLLN ... PLLR, что за делители уже есть вопросы. Такое название фигурирует только в коде. Тоже и про куб можно сказать: D1CPRE prescaler, HPRE prescaler встречаются только в схеме куба. Посоветуйте, пожалуйста, как в этом разобраться? Мануал может какой-нибудь или апнота Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 41 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба Все регистры описаны в RM. Код от Куба доступен вниз до записи в оегистры. Все регистры доступны для просмотра в любой IDE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба 3 часа назад, Turgenev сказал: PLLM, PLLN ... PLLR, что за делители уже есть вопросы. На приведённых вами картинках DIVMx, DIVNx, ... это оно и есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Turgenev 1 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба 1 час назад, VladislavS сказал: На приведённых вами картинках DIVMx, DIVNx, ... это оно и есть. Похоже на то. Но в коде есть настройка синтезатора с буквами M, N, P... без номера, хотя на схемах нет синтезатора без номера. В коде настраивается только один синтезатор с номером (номер 2), т.е. например PeriphClkInitStruct.PLL2.PLL2M = 4... и т.д. 3й синтезатор может не использоваться, но первый, судя по схемам, не может не использоваться- он тактирует ЦПУ. Правильно ли полагать, что синтезатор без номера в коде (RCC_OscInitStruct.PLL. ...) это первый синтезатор на схемах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться