ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ°ΠΊΡΠΎΠ²ΡΡ
ΡΠΈΠ³Π½Π°Π»ΠΎΠ² (clock configuration) β ΠΎΡΠ½ΠΎΠ²Π° ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° STM32. ΠΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π½ΠΎ ΠΈ ΡΠ½Π΅ΡΠ³ΠΎΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅, ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠΈΡΠ΅ΡΠΈΠΈ ΠΈ Π΄Π°ΠΆΠ΅ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ ΠΊ ΡΠ±ΠΎΡΠΌ. ΠΠΎΠ²ΠΈΡΠΊΠΈ ΡΠ°ΡΡΠΎ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ: ΠΏΠΎΡΠ΅ΠΌΡ STM32F4 Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΎΡΠ΅? ΠΠΎΡΠ΅ΠΌΡ HAL_RCC_ClockConfig() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ? ΠΠ»ΠΈ ΠΊΠ°ΠΊ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ APB1 ΠΈ APB2 Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ TIM ΠΈ USART?
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°Π·Π±Π΅ΡΡΠΌ Π²ΡΡ ΡΠ΅ΠΏΠΎΡΠΊΡ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ β ΠΎΡ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΊΠ²Π°ΡΡΠ° Π΄ΠΎ Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠΈΠ½Ρ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΈΠΏΠΈΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ² PLL ΠΈ HSI), ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΡΠ°Π±ΠΎΡΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π° Π΄Π»Ρ STM32CubeMX, HAL ΠΈ LL. ΠΡΠΎΠ±ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»ΠΈΠΌ ΡΠΊΡΡΡΡΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌ Π² Π΄Π°ΡΠ°ΡΠΈΡΠ°Ρ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΠΌΠ΅Π»ΠΊΠΈΠΌ ΡΡΠΈΡΡΠΎΠΌ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡΠ΅ΠΌΡ Π½Π° STM32H7 Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ HSE Π²ΡΡΠ΅ 50 ΠΠΡ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ CSS.
1. ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ STM32: Π±Π»ΠΎΠΊ-ΡΡ Π΅ΠΌΠ° ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ
ΠΡΠ΅ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ STM32 ΠΏΠΎΡΡΡΠΎΠ΅Π½Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΌΠΎΠ΄ΡΠ»Ρ RCC (Reset and Clock Control), ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°ΠΌΠΈ ΡΠ°ΠΊΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°, Π΄Π΅Π»ΠΈΡΠ΅Π»ΡΠΌΠΈ ΠΈ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΎΡΠ°ΠΌΠΈ. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:
- πΉ ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ:
HSI(Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ 16/64 ΠΠΡ),HSE(Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΊΠ²Π°ΡΡ/ΡΠ΅Π·ΠΎΠ½Π°ΡΠΎΡ),LSI(40 ΠΊΠΡ Π΄Π»Ρ RTC),LSE(32.768 ΠΊΠΡ Π΄Π»Ρ RTC). - πΉ PLL: ΡΠ°Π·ΠΎΠ²ΡΠΉ Π°Π²ΡΠΎΠΏΠΎΠ΄ΡΡΡΠΎΠΉΡΠΈΠΊ ΡΠ°ΡΡΠΎΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΡΡΠΎΠΊΠΈΠ΅ ΡΠ°ΡΡΠΎΡΡ (Π΄ΠΎ 480 ΠΠΡ Π½Π° STM32H7) ΠΈΠ· Π½ΠΈΠ·ΠΊΠΎΡΠ°ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°.
- πΉ ΠΠ΅Π»ΠΈΡΠ΅Π»ΠΈ:
AHB,APB1/2,RTCβ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΡΠ°ΡΡΠΎΡΡ Π΄Π»Ρ ΡΠ΄ΡΠ°, ΠΏΠ΅ΡΠΈΡΠ΅ΡΠΈΠΈ ΠΈ ΡΠ°ΠΉΠΌΠ΅ΡΠΎΠ². - πΉ ΠΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΎΡΡ: Π²ΡΠ±ΠΈΡΠ°ΡΡ Π°ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π΄Π»Ρ
SYSCLK,HCLK,PCLK1/2.
ΠΡΠΈΠΌΠ΅Ρ ΡΠΏΡΠΎΡΡΠ½Π½ΠΎΠΉ Π±Π»ΠΎΠΊ-ΡΡ Π΅ΠΌΡ Π΄Π»Ρ STM32F4:
HSI (16 MHz) β /M β PLL β ΓN β SYSCLK (Π΄ΠΎ 180 MHz)
β
HSE (8 MHz) β /P β PLL β ΓQ β 48 MHz (USB, RNG)
ΠΠ»ΡΡΠ΅Π²ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ: Π½Π΅ Π²ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΡΠ°ΡΡΠΎΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° STM32F1 ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΠΎΡΠ° SYSCLK β 72 ΠΠΡ, Π° Π½Π° STM32F7 β 216 ΠΠΡ. ΠΡΠ΅Π²ΡΡΠ΅Π½ΠΈΠ΅ Π²Π΅Π΄ΡΡ ΠΊ Π½Π΅ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ ΠΈΠ»ΠΈ ΠΎΡΠΊΠ°Π·Ρ.
- HSI (Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ)
- HSE (Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΊΠ²Π°ΡΡ)
- PLL (Ρ Π°Π²ΡΠΎΠΏΠΎΠ΄ΡΡΡΠΎΠΉΠΊΠΎΠΉ)
- ΠΡΡΠ³ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ
2. ΠΠΎΡΠ°Π³ΠΎΠ²Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Clock Configuration Π² STM32CubeMX
STM32CubeMX Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ ΡΠ»Π΅ΠΏΠΎΠ΅ Π΄ΠΎΠ²Π΅ΡΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΡΠ΅Π²Π°ΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ STM32F407G-DISC1:
- ΠΡΠ±ΠΎΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°: Π²ΠΊΠ»Π°Π΄ΠΊΠ°
Clock Configurationβ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅HSEΠ½Π° 8 ΠΠΡ (ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΏΠ»Π°Ρ). - ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° PLL:
- π§ ΠΡΡΠΎΡΠ½ΠΈΠΊ:
HSE(Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΊΠ²Π°ΡΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½Π΅Π΅HSI). - π§
PLLM(Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΡΡΠΎΡΡ): 8 (ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ 1 ΠΠΡ). - π§
PLLN(ΡΠΌΠ½ΠΎΠΆΠΈΡΠ΅Π»Ρ): 336 (Π΄Π»Ρ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΡΡΠΎΡΡ 336 ΠΠΡ). - π§
PLLP(Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ Π΄Π»ΡSYSCLK): 2 β 168 ΠΠΡ. - π§
PLLQ(Π΄Π»Ρ USB/RNG): 7 β 48 ΠΠΡ.
- π§ ΠΡΡΠΎΡΠ½ΠΈΠΊ:
AHB = 1 (168 ΠΠΡ), APB1 = 4 (42 ΠΠΡ), APB2 = 2 (84 ΠΠΡ).ΠΠΎΡΠ»Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° Π² main.c ΠΏΠΎΡΠ²ΠΈΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ SystemClock_Config(). ΠΠ°ΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΅Ρ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌ:
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° PLL Ρ HSE
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
Error_Handler();
}
}
βοΈ ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ΅ΠΉ ΠΊΠΎΠ΄Π°
3. Π’ΠΈΠΏΠΈΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΈΡ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ
ΠΠ°ΠΆΠ΅ ΠΎΠΏΡΡΠ½ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΏΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΡ ΡΠ°ΠΌΡΠ΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½Π½ΡΠ΅:
| ΠΡΠΈΠ±ΠΊΠ° | ΠΡΠΈΡΠΈΠ½Π° | Π Π΅ΡΠ΅Π½ΠΈΠ΅ |
|---|---|---|
| ΠΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π½Π΅ ΡΡΠ°ΡΡΡΠ΅Ρ | ΠΠ΅Π²Π΅ΡΠ½Π°Ρ ΡΠ°ΡΡΠΎΡΠ° HSE Π² STM32CubeMX (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΊΠ°Π·Π°Π½ΠΎ 25 ΠΠΡ, Π° Π½Π° ΠΏΠ»Π°ΡΠ΅ 8 ΠΠΡ) | ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΡ
Π΅ΠΌΡ ΠΏΠ»Π°ΡΡ ΠΈ Π½Π°ΡΡΡΠΎΠΉΡΠ΅ HSE Value Π² Project Manager β Advanced Settings |
HAL_RCC_ClockConfig Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ HAL_ERROR | ΠΠΎΠ½ΡΠ»ΠΈΠΊΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ² PLL ΠΈΠ»ΠΈ Π½Π΅Π²Π΅ΡΠ½ΡΠ΅ Π΄Π΅Π»ΠΈΡΠ΅Π»ΠΈ | Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ PLLP ΠΈ PLLQ Π΄Π°ΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ ΡΠ°ΡΡΠΎΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, USB ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΎΠ²Π½ΠΎ 48 ΠΠΡ) |
| ΠΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ USB ΠΈΠ»ΠΈ Ethernet | Π§Π°ΡΡΠΎΡΠ° PLLQ Π½Π΅ ΡΠ°Π²Π½Π° 48 ΠΠΡ | ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ PLLQ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ VCO / PLLQ = 48 ΠΠΡ |
| Π‘Π±ΠΎΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ SDIO ΠΈΠ»ΠΈ DMA | Π‘Π»ΠΈΡΠΊΠΎΠΌ Π²ΡΡΠΎΠΊΠ°Ρ ΡΠ°ΡΡΠΎΡΠ° APB1/2 (ΠΌΠ°ΠΊΡ. 42 ΠΠΡ Π΄Π»Ρ APB1 Π½Π° STM32F4) | Π£Π²Π΅Π»ΠΈΡΡΡΠ΅ Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, APB1CLKDivider = RCC_HCLK_DIV4) |
β οΈ ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΠ° STM32H7 ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈHSE> 26 ΠΠΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΠ΅Clock Security System (CSS)Π²RCC_CR. ΠΠ½Π°ΡΠ΅ ΠΏΡΠΈ ΡΠ±ΠΎΠ΅ ΠΊΠ²Π°ΡΡΠ° ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π·Π°Π²ΠΈΡΠ½Π΅Ρ Π±Π΅Π· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ.
ΠΡΡ ΠΎΠ΄Π½Π° ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° β Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ FLASH. ΠΡΠ»ΠΈ SYSCLK ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ 30 ΠΠΡ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ FLASH_LATENCY (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, FLASH_LATENCY_5 Π΄Π»Ρ 168 ΠΠΡ). ΠΠ½Π°ΡΠ΅ Π±ΡΠ΄ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΈΠ· ΠΏΠ°ΠΌΡΡΠΈ.
4. Π ΡΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π΅Π· STM32CubeMX (HAL ΠΈ LL)
ΠΠ»Ρ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄ Π²ΡΡΡΠ½ΡΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° STM32G4 Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ HAL ΠΈ LL.
ΠΡΠΈΠΌΠ΅Ρ Π½Π° HAL:
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ HSE ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ PLL
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 1; // ΠΠ΅Π»ΠΈΡΠ΅Π»Ρ HSE (8 ΠΠΡ β 8 ΠΠΡ)
RCC_OscInitStruct.PLL.PLLN = 20; // Π£ΠΌΠ½ΠΎΠΆΠΈΡΠ΅Π»Ρ (8 Γ 20 = 160 ΠΠΡ)
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // SYSCLK = 80 ΠΠΡ
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; // 48 ΠΠΡ Π΄Π»Ρ USB
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; // ΠΠ»Ρ ADC/DAC
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΉ
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // Max 80 ΠΠΡ Π΄Π»Ρ APB1
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
ΠΡΠΈΠΌΠ΅Ρ Π½Π° LL (Low Layer):
LL_RCC_HSE_Enable();
while(!LL_RCC_HSE_IsReady());
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° PLL
LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 20, LL_RCC_PLLP_DIV_2);
LL_RCC_PLL_ConfigDomain_48M(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 20, LL_RCC_PLLQ_DIV_2);
LL_RCC_PLL_Enable();
while(!LL_RCC_PLL_IsReady());
// ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° PLL ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΉ
LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);
LL Π΄Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΠΈ ΠΌΠ΅Π½ΡΡΠΈΠΉ ΠΎΠ²Π΅ΡΡ
Π΅Π΄, Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠ΅Ρ
ΡΠ΅Π³ΠΈΡΡΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° STM32L4 ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ MSI (ΠΌΡΠ»ΡΡΠΈΡΠΊΠΎΡΠΎΡΡΠ½ΠΎΠ³ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°) Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡΡΠ½ΡΡ Π½Π°ΡΡΡΠΎΠΈΡΡ RCC_CR Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΡΠ°ΡΡΠΎΡ.
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΊΠ²Π°ΡΡ (HSE) Ρ Clock Security System (CSS). ΠΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ ~1 ΠΌΠ ΠΊ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΡΠΈΡΠΈΡ ΠΎΡ Π·Π°Π²ΠΈΡΠ°Π½ΠΈΠΉ ΠΏΡΠΈ ΡΠ±ΠΎΡΡ
Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°.
5. ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ½Π΅ΡΠ³ΠΎΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ: ΡΠ΅ΠΆΠΈΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΈ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π°ΠΏΡΡΠΌΡΡ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΡΠ½Π΅ΡΠ³ΠΎΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Ρ HSI (16 ΠΠΡ) Π½Π° MSI (4 ΠΠΡ) Π½Π° STM32L4 ΡΠ½ΠΈΠΆΠ°Π΅Ρ ΡΠΎΠΊ ΠΏΠΎΠΊΠΎΡ Ρ 5 ΠΌΠ Π΄ΠΎ 1.5 ΠΌΠ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ:
- π ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ²: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
HSIΠ΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΠ΅ Π½Π°PLLΡHSEΠ΄Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ. - π ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅Π½ΡΠΆΠ½ΡΡ
ΡΠ°ΠΊΡΠΎΠ²ΡΡ
ΡΠΈΠ³Π½Π°Π»ΠΎΠ²: Π²ΡΠΊΠ»ΡΡΠ°ΠΉΡΠ΅
MCO(Master Clock Output) ΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΏΠ΅ΡΠΈΡΠ΅ΡΠΈΠΉΠ½ΡΠ΅ ΡΠ°ΠΊΡΠΎΠ²ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ ΡΠ΅ΡΠ΅Π·RCC_AHB1ENR,RCC_APB1ENR. - π ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌΠΎΠ² ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ½Π΅ΡΠ³ΠΎΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ: Π²
SleepΠΈΠ»ΠΈStopΡΠ΅ΠΆΠΈΠΌΠ°Ρ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠΈΡΠ΅ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ, ΠΎΡΡΠ°Π²ΠΈΠ² ΡΠΎΠ»ΡΠΊΠΎLSIΠ΄Π»ΡRTC.
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π° Π² Stop ΡΠ΅ΠΆΠΈΠΌ Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ RTC:
HAL_PWREx_EnableUltraLowPower();
HAL_PWREx_EnableLowPowerRunMode();
__HAL_RCC_PWR_CLK_ENABLE();
// ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° LSI Π΄Π»Ρ RTC
__HAL_RCC_LSI_ENABLE();
while(!__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY));
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
// ΠΡ
ΠΎΠ΄ Π² Stop ΡΠ΅ΠΆΠΈΠΌ
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
β οΈ ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΠ° STM32H7 ΠΏΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ ΠΈΠ·StopΡΠ΅ΠΆΠΈΠΌΠ°PLLΠΎΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡWakeup.
6. ΠΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ: ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ΄Π΅Ρ ΠΈ PLLSAI
ΠΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ STM32H7 ΠΈ STM32MP1 ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΄Π΅Ρ (Cortex-M7 + Cortex-M4) ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ PLLSAI Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ
ΡΠ°ΠΊΡΠΎΠ²ΡΡ
ΡΠΈΠ³Π½Π°Π»ΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ LTDC ΠΈΠ»ΠΈ SAI). Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ:
- ποΈ PLLSAI: ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΎΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 100 ΠΠΡ Π΄Π»Ρ
LTDC) Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎPLL. - ποΈ Π‘ΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΡΠ΄Π΅Ρ: Π½Π° STM32H7
Cortex-M7ΠΈCortex-M4ΠΌΠΎΠ³ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΡΠ°Π·Π½ΡΡ ΡΠ°ΡΡΠΎΡΠ°Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 480 ΠΠΡ ΠΈ 240 ΠΠΡ). - ποΈ Clock Gating: ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ
ΠΏΠ΅ΡΠΈΡΠ΅ΡΠΈΠΉΠ½ΡΡ
ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΠ΅ΡΠ΅Π·
RCC_AHBxENR.
ΠΡΠΈΠΌΠ΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ PLLSAI Π΄Π»Ρ LTDC Π½Π° STM32H743:
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° PLLSAI Π΄Π»Ρ LTDC (ΠΏΠΈΠΊΡΠ΅Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΠΎΡΠ° 50 ΠΠΡ)
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
PeriphClkInit.PLLSAI.PLLSAIState = RCC_PLLSAI_ON;
PeriphClkInit.PLLSAI.PLLSAISource = RCC_PLLSOURCE_HSE;
PeriphClkInit.PLLSAI.PLLSAIM = 4; // HSE = 25 ΠΠΡ β 25/4 = 6.25 ΠΠΡ
PeriphClkInit.PLLSAI.PLLSAIN = 160; // 6.25 Γ 160 = 1000 ΠΠΡ (VCO)
PeriphClkInit.PLLSAI.PLLSAIQ = 2; // 1000/2 = 500 ΠΠΡ (Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ)
PeriphClkInit.PLLSAI.PLLSAIR = 20; // 1000/20 = 50 ΠΠΡ Π΄Π»Ρ LTDC
PeriphClkInit.PLLSAIDivQ = 1;
PeriphClkInit.PLLSAIDivR = RCC_PLLSAIDIVR_2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
ΠΠ»Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΄Π΅Ρ Π½Π° STM32H7 ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ RCC_D1CFGR ΠΈ RCC_D2CFGR:
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° D1 Π΄ΠΎΠΌΠ΅Π½Π° (Cortex-M7 Π½Π° 480 ΠΠΡ)
MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1CPRE, RCC_D1CFGR_D1CPRE_DIV1);
MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_HPRE, RCC_D1CFGR_HPRE_DIV1);
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° D2 Π΄ΠΎΠΌΠ΅Π½Π° (Cortex-M4 Π½Π° 240 ΠΠΡ)
MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE1, RCC_D2CFGR_D2PPRE1_DIV2);
MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE2, RCC_D2CFGR_D2PPRE2_DIV2);
ΠΠ° STM32H7 ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ PLL ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΡΠΌΠΌΠ°ΡΠ½ΠΎΠΌΡ ΡΠΎΠΊΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ (ΠΌΠ°ΠΊΡ. 300 ΠΌΠ Π΄Π»Ρ VDD).
7. ΠΡΠ»Π°Π΄ΠΊΠ° ΠΈ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
ΠΡΠ»ΠΈ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ Π½Π΅ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎ (Π·Π°Π²ΠΈΡΠ°Π½ΠΈΡ, ΡΠ±ΡΠΎΡΡ, ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΠ΅ΡΠΈΡΠ΅ΡΠΈΠΈ),ι¦ε ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ:
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°ΡΡΠΎΡ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
HAL_RCC_GetSysClockFreq(),HAL_RCC_GetHCLKFreq()ΠΈ Ρ.Π΄., ΡΡΠΎΠ±Ρ ΡΡΠ°Π²Π½ΠΈΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΡΡΠΎΡΡ Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΌΠΈ. - ΠΠ½Π°Π»ΠΈΠ· ΡΠ΅Π³ΠΈΡΡΡΠΎΠ² RCC: ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅
RCC_CR(ΡΠ»Π°Π³ΠΈ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠ²),RCC_CFGR(ΠΈΡΡΠΎΡΠ½ΠΈΠΊSYSCLK),RCC_PLLCFGR(ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ PLL). - ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ MCO: Π²ΡΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠ°ΠΊΡΠΎΠ²ΡΠΉ ΡΠΈΠ³Π½Π°Π» Π½Π° Π½ΠΎΠΆΠΊΡ
MCO(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,PA8) ΠΈ ΠΈΠ·ΠΌΠ΅ΡΡΡΠ΅ ΠΎΡΡΠΈΠ»Π»ΠΎΠ³ΡΠ°ΡΠΎΠΌ. - ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ»Π°Π³ΠΎΠ² ΠΎΡΠΈΠ±ΠΎΠΊ:
RCC_CIR(ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΡΠ±ΠΎΡΠΌ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ),RCC_CSR(ΠΏΡΠΈΡΠΈΠ½Ρ ΡΠ±ΡΠΎΡΠ°).
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° Π΄Π»Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ:
uint32_t sysclk = HAL_RCC_GetSysClockFreq();
uint32_t hclk = HAL_RCC_GetHCLKFreq();
uint32_t pclk1 = HAL_RCC_GetPCLK1Freq();
uint32_t pclk2 = HAL_RCC_GetPCLK2Freq();
printf("SYSCLK: %lu Hz\n", sysclk);
printf("HCLK: %lu Hz\n", hclk);
printf("PCLK1: %lu Hz\n", pclk1);
printf("PCLK2: %lu Hz\n", pclk2);
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ»Π°Π³ΠΎΠ² ΡΠ±ΡΠΎΡΠ°
if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST)) {
printf("Low-Power reset detected\n");
__HAL_RCC_CLEAR_RESET_FLAGS();
}
ΠΡΠ»ΠΈ ΡΠ°ΡΡΠΎΡΠ° SYSCLK Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΉ, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅:
- π ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ
PLLM/N/P/Q(ΠΎΡΠΈΠ±ΠΊΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ Π±ΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π΄Π°ΡΡ ΠΊΡΠ°ΡΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡΡΡ ΡΠ°ΡΡΠΎΡΡ). - π Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ»Π°Π³Π°
PLLRDYΠ²RCC_CR(Π΅ΡΠ»ΠΈ Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½, PLL Π½Π΅ Π·Π°ΠΏΡΡΡΠΈΠ»ΡΡ). - π ΠΠ°Π»ΠΈΡΠΈΠ΅ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΊΠ²Π°ΡΡΠ° (ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΎΡΡΠΈΠ»Π»ΠΎΠ³ΡΠ°ΡΠΎΠΌ ΡΠΈΠ³Π½Π°Π» Π½Π° Π½ΠΎΠΆΠΊΠ°Ρ
OSC_IN/OUT).
Π§ΡΠΎ Π΄Π΅Π»Π°ΡΡ Π΅ΡΠ»ΠΈ PLL Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ?
1. ΠΡΠΎΠ²Π΅ΡΡΡΠ΅, ΡΡΠΎ ΡΠ°ΡΡΠΎΡΠ° VCO (PLLN Γ HSE / PLLM) Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 100β432 ΠΠΡ Π΄Π»Ρ STM32F4).
2. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ PLLM Π½Π΅ ΠΎΠ±Π½ΡΠ»ΡΠ΅Ρ ΡΠ°ΡΡΠΎΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, PLLM=8 Π΄Π»Ρ HSE=8 ΠΠΡ Π΄Π°ΡΡ 1 ΠΠΡ Π½Π° Π²Ρ ΠΎΠ΄Π΅ PLL).
3. ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΏΠΈΡΠ°Π½ΠΈΠ΅: PLL ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΡ (ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π½Π° STM32H7 Ρ ΡΠ΄ΡΠΎΠΌ Π½Π° 480 ΠΠΡ).
4. ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ HSE, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΠ΅ΠΏΡ ΠΊΠ²Π°ΡΡΠ°: ΠΊΠΎΠ½Π΄Π΅Π½ΡΠ°ΡΠΎΡΡ Π½Π°Π³ΡΡΠ·ΠΊΠΈ (ΠΎΠ±ΡΡΠ½ΠΎ 10β22 ΠΏΠ€) ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΊΠΎΠ³ΠΎ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ.
FAQ: Π§Π°ΡΡΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ ΠΏΠΎ Clock Configuration Π² STM32
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ HSI Π²ΠΌΠ΅ΡΡΠΎ HSE Π΄Π»Ρ PLL?
ΠΠ°, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. HSI ΠΈΠΌΠ΅Π΅Ρ Π½ΠΈΠ·ΠΊΡΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ (Β±1β2%) ΠΈ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ/Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΡ. ΠΠ»Ρ USB, Ethernet ΠΈΠ»ΠΈ Π²ΡΡΠΎΠΊΠΎΡΠΊΠΎΡΠΎΡΡΠ½ΡΡ
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½ HSE (ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ Β±0.005% Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΠΊΠ²Π°ΡΡΠ΅ΠΌ).
ΠΠΎΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π½Π΅ ΡΡΠ°ΡΡΡΠ΅Ρ?
Π§Π°ΡΡΠ°Ρ ΠΏΡΠΈΡΠΈΠ½Π° β Π½Π΅Π²Π΅ΡΠ½Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Π΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π² STM32CubeMX ΡΠΊΠ°Π·Π°Π½ HSE=25 ΠΠΡ, Π° Π½Π° ΠΏΠ»Π°ΡΠ΅ ΡΡΠΎΠΈΡ ΠΊΠ²Π°ΡΡ Π½Π° 8 ΠΠΡ, PLL Π½Π΅ Π·Π°ΠΏΡΡΡΠΈΡΡΡ. ΠΡΠ΅Π³Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π² ΠΊΠΎΠ΄Π΅ ΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ.
ΠΠ°ΠΊ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ Π΄ΠΆΠΈΡΡΠ΅Ρ ΡΠ°ΠΊΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° Π΄Π»Ρ ADC?
ΠΠ»Ρ ΡΠΎΡΠ½ΡΡ
ADC ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ dedicated PLL (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, PLLSAI Π½Π° STM32H7) Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠΌ Π΄Π΅Π»Π΅Π½ΠΈΡ. Π’Π°ΠΊΠΆΠ΅ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΡΠ°ΡΡΠΎΡΠ° ADC_CLK Π½Π΅ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ Π΄Π»Ρ Π²Π°ΡΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 36 ΠΠΡ Π΄Π»Ρ STM32F3).
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Clock Security System (CSS) ΠΈ ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΡ?
CSS ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΡΠ°Π±ΠΎΡΠΎΠΉ HSE ΠΈ ΠΏΡΠΈ Π΅Π³ΠΎ ΡΠ±ΠΎΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π° HSI. ΠΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ CSS Π²ΡΠ΅Π³Π΄Π°, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ HSE Π² ΠΊΡΠΈΡΠΈΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠΌΡΡΠ»Π΅Π½Π½ΠΎΠ΅ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅). ΠΠ°ΡΡΡΠΎΠΉΠΊΠ°: RCC->CR |= RCC_CR_CSSON.
ΠΠ°ΠΊ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ Dual-Core STM32 (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, STM32H7)?
ΠΠ° STM32H7 ΡΠ΄ΡΠ° Cortex-M7 ΠΈ Cortex-M4 ΠΌΠΎΠ³ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΡΠ°Π·Π½ΡΡ
ΡΠ°ΡΡΠΎΡΠ°Ρ
. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ RCC_D1CFGR Π΄Π»Ρ M7 ΠΈ RCC_D2CFGR Π΄Π»Ρ M4. ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΉ ΠΏΠ΅ΡΠΈΡΠ΅ΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, DMA) ΡΠ΅ΡΠ΅Π· HSEM (Hardware Semaphore).