|
26 | 26 | *
|
27 | 27 | * This file configures the system clock as follows:
|
28 | 28 | *=============================================================================
|
29 |
| - * System clock source | 1- PLL_HSE_EXTC | 3- PLL_HSI |
30 |
| - * | (external 8 MHz clock) | (internal 16 MHz) |
31 |
| - * | 2- PLL_HSE_XTAL | or PLL_MSI |
32 |
| - * | (external 8 MHz xtal) | (internal 4 MHz) |
33 |
| - *----------------------------------------------------------------------------- |
34 |
| - * SYSCLK(MHz) | 48 | 80 |
35 |
| - *----------------------------------------------------------------------------- |
36 |
| - * AHBCLK (MHz) | 48 | 80 |
37 |
| - *----------------------------------------------------------------------------- |
38 |
| - * APB1CLK (MHz) | 48 | 80 |
39 |
| - *----------------------------------------------------------------------------- |
40 |
| - * APB2CLK (MHz) | 48 | 80 |
41 |
| - *----------------------------------------------------------------------------- |
42 |
| - * USB capable (48 MHz precise clock) | YES | NO |
43 |
| - *----------------------------------------------------------------------------- |
| 29 | + * System clock source | PLL_HSE | PLL_HSI | PLL_MSI |
| 30 | + * | (external 4 to 48 MHz xtal) | (internal 16 MHz) | (internal 100kHz to 48 MHz) |
| 31 | + *--------------------------------------------------------------------------------------------- |
| 32 | + * SYSCLK(MHz) | 48 | 80 | 80 |
| 33 | + *--------------------------------------------------------------------------------------------- |
| 34 | + * AHBCLK (MHz) | 48 | 80 | 80 |
| 35 | + *--------------------------------------------------------------------------------------------- |
| 36 | + * APB1CLK (MHz) | 48 | 80 | 80 |
| 37 | + *--------------------------------------------------------------------------------------------- |
| 38 | + * APB2CLK (MHz) | 48 | 80 | 80 |
| 39 | + *--------------------------------------------------------------------------------------------- |
| 40 | + * USB capable (48 MHz precise clock) | YES | NO | YES |
| 41 | + *--------------------------------------------------------------------------------------------- |
44 | 42 | *=============================================================================
|
45 | 43 | ******************************************************************************
|
46 | 44 | * @attention
|
|
131 | 129 | */
|
132 | 130 |
|
133 | 131 | // Select the clock sources (default is PLL_MSI) to start with (0=OFF, 1=ON)
|
134 |
| -#define USE_PLL_HSE_EXTC (1) // Use external clock |
| 132 | +#define USE_PLL_HSE_EXTC (0) // Use external clock |
135 | 133 | #define USE_PLL_HSE_XTAL (0) // Use external xtal
|
136 | 134 | #define USE_PLL_HSI (0) // Use HSI/MSI internal clock (0=MSI, 1=HSI)
|
137 | 135 | #define DEBUG_MCO (0) // Output the MCO on PA8 for debugging (0=OFF, 1=SYSCLK, 2=HSE, 3=HSI, 4=MSI)
|
@@ -530,40 +528,48 @@ uint8_t SetSysClock_PLL_MSI(void)
|
530 | 528 | {
|
531 | 529 | RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
|
532 | 530 | RCC_OscInitTypeDef RCC_OscInitStruct = {0};
|
533 |
| - |
| 531 | + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; |
| 532 | + |
534 | 533 | // Enable LSE Oscillator to automatically calibrate the MSI clock
|
535 | 534 | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
|
536 | 535 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // No PLL update
|
537 | 536 | RCC_OscInitStruct.LSEState = RCC_LSE_ON; // External 32.768 kHz clock on OSC_IN/OSC_OUT
|
538 | 537 | if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) {
|
539 | 538 | RCC->CR |= RCC_CR_MSIPLLEN; // Enable MSI PLL-mode
|
540 | 539 | }
|
541 |
| - |
542 |
| - // Enable MSI oscillator and activate PLL with MSI as source |
543 |
| - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; |
| 540 | + |
| 541 | + HAL_RCCEx_DisableLSECSS(); |
| 542 | + /* Enable MSI Oscillator and activate PLL with MSI as source */ |
| 543 | + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; |
544 | 544 | RCC_OscInitStruct.MSIState = RCC_MSI_ON;
|
545 | 545 | RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
|
546 | 546 | RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
|
547 |
| - RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; |
548 |
| - RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT; |
549 |
| - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
550 |
| - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; // 4 MHz |
551 |
| - RCC_OscInitStruct.PLL.PLLM = 1; // VCO input clock = 4 MHz (4 MHz / 1) |
552 |
| - RCC_OscInitStruct.PLL.PLLN = 40; // VCO output clock = 160 MHz (4 MHz * 40) |
553 |
| - RCC_OscInitStruct.PLL.PLLP = 7; // PLLSAI3 clock = 22.86 MHz (160 MHz / 7) |
554 |
| - RCC_OscInitStruct.PLL.PLLQ = 4; // USB clock (PLL48M1) = 40 MHz (160 MHz / 4) --> Not good for USB |
555 |
| - RCC_OscInitStruct.PLL.PLLR = 2; // PLL clock = 80 MHz (160 MHz / 2) |
| 547 | + |
| 548 | + RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT; |
| 549 | + RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; /* 48 MHz */ |
| 550 | + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
| 551 | + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; |
| 552 | + RCC_OscInitStruct.PLL.PLLM = 6; /* 8 MHz */ |
| 553 | + RCC_OscInitStruct.PLL.PLLN = 40; /* 320 MHz */ |
| 554 | + RCC_OscInitStruct.PLL.PLLP = 7; /* 45 MHz */ |
| 555 | + RCC_OscInitStruct.PLL.PLLQ = 4; /* 80 MHz */ |
| 556 | + RCC_OscInitStruct.PLL.PLLR = 4; /* 80 MHz */ |
556 | 557 | if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
|
557 | 558 | {
|
558 | 559 | return 0; // FAIL
|
559 | 560 | }
|
560 |
| - |
| 561 | + /* Enable MSI Auto-calibration through LSE */ |
| 562 | + HAL_RCCEx_EnableMSIPLLMode(); |
| 563 | + /* Select MSI output as USB clock source */ |
| 564 | + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB; |
| 565 | + PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI; /* 48 MHz */ |
| 566 | + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); |
561 | 567 | // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers
|
562 | 568 | RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
|
563 |
| - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 80 MHz |
564 |
| - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 80 MHz |
565 |
| - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // 80 MHz |
566 |
| - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 80 MHz |
| 569 | + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 80 MHz */ |
| 570 | + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* 80 MHz */ |
| 571 | + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* 80 MHz */ |
| 572 | + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; /* 40 MHz */ |
567 | 573 | if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
|
568 | 574 | {
|
569 | 575 | return 0; // FAIL
|
|
0 commit comments