Поиск
Показаны результаты для тегов 'rcc'.
-
Есть проект (код) для STM32H7, стало интересно разобраться с настройками тактирования шин и CPU на примере настройки тактирования в CubeMX- то есть сопоставить код настройки тактовой частоты МК со схемой настройки тактирования в Кубе. Контроллер тактируется от внешнего источника 50 МГц. Причина- по коду не понятно с какой частотой тактируются шины и ЦПУ. Очевидным решением моего вопроса было бы открыть reference manual на контроллер и сопоставлять схему тактирования с функцией инициализации из HAL-библиотеки и схемой в CubeMX. Но вот тут у меня проблема: я не могу найти соответствие между ними. Более конкретно о написанном выше. Код инициализации, сгенерированный CubeMX (но проекта, из которого генерили, нет): Схема тактирования из Куба (дефолтный проект, обвел то, частоту чего мне интересно узнать): Схема тактирования из мануала на контроллер: Со строчками RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; все понятно. Но вот что за синтезаторы в коде PLLM, PLLN ... PLLR, что за делители уже есть вопросы. Такое название фигурирует только в коде. Тоже и про куб можно сказать: D1CPRE prescaler, HPRE prescaler встречаются только в схеме куба. Посоветуйте, пожалуйста, как в этом разобраться? Мануал может какой-нибудь или апнота
-
STM32F030K6 RCC PLL
ozforester опубликовал тема в STM
Не могу разобраться. МК не хочет работать на скорости более 12 МГц (PLL множитель 3 и HSE 4 МГц). Даташит и референс вроде бы просмотрел и основные моменты проверил. К тому же для F030 примеры в RM имеются. Для проверки подключил олед и вывел на него RCC_CR. ( до 12 МГц PLL out) Сначала подаю питание без кварца - установлены биты 1:0, втыкаю на ходу кварц - устанавливаются 17:16 и 25:24. То есть при 12 МГц переключение на PLL происходит. Далее упростил конфигурацию до светодида. Включаю питание без кварца - мигает медленно (HSI), втыкаю кварц - мигание ускоряется (PLL). После вытаскивания кварца скорость снова уменьшается и далее уже не меняется после манипуляций с кварцем (CSS отработал и вырубил HSE с PLL). Это чтобы установить, что сам механизм переключения в принципе работает. Далее прошиваю с множителем PLL на единичку больше, и светодиод перестает мигать (а заодно и подключаться stlink). Дёргание кварца восстанавливает работу светодиода и обмен с stlink-ом. Думаю, если бы влетал в эксепшен по умолчанию, то вряд ли диод мигал после вытаскивания кварца. Прошу совета. На что здесь следует обратить внимание? /* * * STM32F030K6T6 (TQFP32) * LED - PB1 (15) * Crystal 4 MHz * */ static void delay (unsigned int time) { for (unsigned int i = 0; i < time; i++) for (volatile unsigned int j = 0; j < 500; j++); } void led_on(void){ RCC->AHBENR |= RCC_AHBENR_GPIOBEN; GPIOB->MODER |= GPIO_MODER_MODER1_0; GPIOB->BSRR = GPIO_BSRR_BS_1; while(1); } void Switch_to_PLL(void){ if ((RCC->CFGR & RCC_CFGR_SWS) == RCC_CFGR_SWS_PLL){ // Test if PLL is used as System clock RCC->CFGR &= (uint32_t) (~RCC_CFGR_SW); // Select HSI as system clock while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI); // Wait for HSI switched } RCC->CR &= (uint32_t)(~RCC_CR_PLLON); // Disable the PLL RCC->CFGR |= RCC_PLLSOURCE_HSE; // select HSE as PLL input while((RCC->CR & RCC_CR_PLLRDY) != 0); // Wait until PLLRDY is cleared RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_PLLMUL)) | (RCC_CFGR_PLLMUL12); // Set the PLL multiplier RCC->CR |= RCC_CR_PLLON; // Enable the PLL while((RCC->CR & RCC_CR_PLLRDY) == 0); // Wait until PLLRDY is set RCC->CFGR |= (uint32_t) (RCC_CFGR_SW_PLL); // Select PLL as system clock while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); // Wait until the PLL is switched on } void RCC_IRQHandler(void) // HSE running { if ((RCC->CIR & RCC_CIR_HSERDYF) != 0) // Check the flag HSE ready { RCC->CIR |= RCC_CIR_HSERDYC; // Clear the flag HSE ready FLASH->ACR |= FLASH_ACR_LATENCY; // 24 < if systemclock < 48 Mhz FLASH->ACR |= FLASH_ACR_PRFTBE; // Pref //RCC->CFGR = ((RCC->CFGR & (~RCC_CFGR_SW)) | RCC_CFGR_SW_0); // Switch the system clock to HSE Switch_to_PLL(); // Switch the system clock to PLL } else { // error led PB1 led_on(); } } void HAL_RCC_CSSCallback(void){ // reset clock sec flag RCC->CIR |= RCC_CIR_CSSC; // clear CSSF } int main( void ){ HAL_Init(); NVIC_EnableIRQ(RCC_CRS_IRQn); // interrupt NVIC_SetPriority(RCC_CRS_IRQn,0); // priority RCC->CIR |= RCC_CIR_HSERDYIE; // isr when HSE redy RCC->CR |= RCC_CR_CSSON | RCC_CR_HSEON; // enable HSE and CSS // blinking led RCC->AHBENR |= RCC_AHBENR_GPIOBEN; GPIOB->MODER |= GPIO_MODER_MODER1_0; while (1) { GPIOB->BSRR = GPIO_BSRR_BR_1; delay(500); GPIOB->BSRR = GPIO_BSRR_BS_1; delay(500); } return 0; }