Skip to content

Commit 035c8d3

Browse files
bcostmadbridge
authored andcommitted
Correct system clock configuration
1 parent 51000a3 commit 035c8d3

File tree

1 file changed

+56
-28
lines changed

1 file changed

+56
-28
lines changed

targets/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F412ZG/device/system_stm32f4xx.c

Lines changed: 56 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@
2727
* | 2- PLL_HSE_XTAL |
2828
* | (external 8 MHz xtal) |
2929
*-----------------------------------------------------------------------------
30-
* SYSCLK(MHz) | 96 | 96
30+
* SYSCLK(MHz) | 100 | 96
3131
*-----------------------------------------------------------------------------
32-
* AHBCLK (MHz) | 96 | 96
32+
* AHBCLK (MHz) | 100 | 96
3333
*-----------------------------------------------------------------------------
34-
* APB1CLK (MHz) | 48 | 48
34+
* APB1CLK (MHz) | 50 | 48
3535
*-----------------------------------------------------------------------------
36-
* APB2CLK (MHz) | 96 | 96
36+
* APB2CLK (MHz) | 100 | 96
3737
*-----------------------------------------------------------------------------
3838
* USB capable (48 MHz precise clock) | YES | YES
3939
*-----------------------------------------------------------------------------
@@ -821,7 +821,7 @@ void SetSysClock(void)
821821
}
822822

823823
/* Output clock on MCO2 pin(PC9) for debugging purpose */
824-
//HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4); // 100 MHz / 4 = 25 MHz
824+
//HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4);
825825
}
826826

827827
#if (USE_PLL_HSE_XTAL != 0) || (USE_PLL_HSE_EXTC != 0)
@@ -832,12 +832,15 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
832832
{
833833
RCC_ClkInitTypeDef RCC_ClkInitStruct;
834834
RCC_OscInitTypeDef RCC_OscInitStruct;
835-
835+
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
836+
837+
/* Enable Power Control clock */
838+
__HAL_RCC_PWR_CLK_ENABLE();
839+
836840
/* The voltage scaling allows optimizing the power consumption when the device is
837841
clocked below the maximum system frequency, to update the voltage scaling value
838842
regarding system frequency refer to product datasheet. */
839-
__PWR_CLK_ENABLE();
840-
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
843+
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
841844

842845
/* Enable HSE oscillator and activate PLL with HSE as source */
843846
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
@@ -851,30 +854,40 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
851854
}
852855
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
853856
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
854-
//RCC_OscInitStruct.PLL.PLLM = 8; // VCO input clock = 1 MHz (8 MHz / 8)
855-
//RCC_OscInitStruct.PLL.PLLN = 384; // VCO output clock = 384 MHz (1 MHz * 384)
856-
RCC_OscInitStruct.PLL.PLLM = 4; // VCO input clock = 2 MHz (8 MHz / 4)
857-
RCC_OscInitStruct.PLL.PLLN = 192; // VCO output clock = 384 MHz (2 MHz * 192)
858-
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 96 MHz (384 MHz / 4)
859-
RCC_OscInitStruct.PLL.PLLQ = 8; // USB clock = 48 MHz (384 MHz / 8) --> Good for USB
857+
858+
RCC_OscInitStruct.PLL.PLLM = 8; // VCO input clock = 1 MHz (8 MHz / 8)
859+
RCC_OscInitStruct.PLL.PLLN = 200; // VCO output clock = 200 MHz (1 MHz * 200)
860+
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLLCLK = 100 MHz (200 MHz / 2)
861+
RCC_OscInitStruct.PLL.PLLQ = 7;
862+
RCC_OscInitStruct.PLL.PLLR = 2;
863+
860864
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
861865
{
862866
return 0; // FAIL
863867
}
864868

869+
/* Select PLLSAI output as USB clock source */
870+
PeriphClkInitStruct.PLLI2S.PLLI2SM = 8;
871+
PeriphClkInitStruct.PLLI2S.PLLI2SQ = 4;
872+
PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;
873+
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CK48;
874+
PeriphClkInitStruct.Clk48ClockSelection = RCC_CK48CLKSOURCE_PLLI2SQ;
875+
876+
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
877+
865878
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */
866879
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
867-
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 96 MHz
868-
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 96 MHz
869-
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // 48 MHz
870-
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 96 MHz
880+
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
881+
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
882+
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
883+
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
884+
871885
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
872886
{
873887
return 0; // FAIL
874888
}
875889

876890
/* Output clock on MCO1 pin(PA8) for debugging purpose */
877-
878891
//if (bypass == 0)
879892
// HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz with xtal
880893
//else
@@ -891,37 +904,52 @@ uint8_t SetSysClock_PLL_HSI(void)
891904
{
892905
RCC_ClkInitTypeDef RCC_ClkInitStruct;
893906
RCC_OscInitTypeDef RCC_OscInitStruct;
894-
907+
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
908+
909+
/* Enable Power Control clock */
910+
__HAL_RCC_PWR_CLK_ENABLE();
911+
895912
/* The voltage scaling allows optimizing the power consumption when the device is
896913
clocked below the maximum system frequency, to update the voltage scaling value
897914
regarding system frequency refer to product datasheet. */
898-
__PWR_CLK_ENABLE();
899-
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
915+
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
900916

901917
/* Enable HSI oscillator and activate PLL with HSI as source */
902918
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;
903919
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
904920
RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
905921
RCC_OscInitStruct.HSICalibrationValue = 16;
906922
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
907-
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
923+
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
924+
908925
//RCC_OscInitStruct.PLL.PLLM = 16; // VCO input clock = 1 MHz (16 MHz / 16)
909926
//RCC_OscInitStruct.PLL.PLLN = 384; // VCO output clock = 384 MHz (1 MHz * 384)
910927
RCC_OscInitStruct.PLL.PLLM = 8; // VCO input clock = 2 MHz (16 MHz / 8)
911928
RCC_OscInitStruct.PLL.PLLN = 192; // VCO output clock = 384 MHz (2 MHz * 192)
912929
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 96 MHz (384 MHz / 4)
913-
RCC_OscInitStruct.PLL.PLLQ = 8; // USB clock = 48 MHz (384 MHz / 8) --> Good for USB
930+
RCC_OscInitStruct.PLL.PLLQ = 8;
931+
RCC_OscInitStruct.PLL.PLLQ = 2;
932+
914933
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
915934
{
916935
return 0; // FAIL
917936
}
918937

938+
/* Select PLLSAI output as USB clock source */
939+
PeriphClkInitStruct.PLLI2S.PLLI2SM = 8;
940+
PeriphClkInitStruct.PLLI2S.PLLI2SQ = 4;
941+
PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;
942+
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CK48;
943+
PeriphClkInitStruct.Clk48ClockSelection = RCC_CK48CLKSOURCE_PLLI2SQ;
944+
945+
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
946+
919947
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */
920948
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
921-
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 96 MHz
922-
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 96 MHz
923-
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // 48 MHz
924-
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 96 MHz
949+
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
950+
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
951+
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
952+
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
925953
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
926954
{
927955
return 0; // FAIL

0 commit comments

Comments
 (0)