STM32H7 - рдПрдЪрдПрдПрд▓ рдХреЗ рдмрд┐рдирд╛ рдШрдбрд╝реА рдХреА рд╕реЗрдЯрд┐рдВрдЧ

рдЕрднреА рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдХрдВрдкрдиреА STM рдиреЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕, рдХреНрд░рд┐рд╕реНрдЯрд▓ STM32H7 рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдорд╛рдирдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдмрд╛рдЬрд╛рд░ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛:

  • 400 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рддрдХ рдХреЛрд░ рдЖрд╡реГрддреНрддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐
  • 1 рдПрдордмреА рддрдХ рд░реИрдо рдмрдврд╝реА
  • 16 рдмрд┐рдЯ рдПрдбреАрд╕реА
  • рдкрд┐рди-рдЯреВ-рдкрд┐рди рд╕рдВрдЧрддрддрд╛ F7 рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде

рдореИрдВрдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрд╛, рдореИрдВрдиреЗ STM32H743IIT6 рдХреНрд░рд┐рд╕реНрдЯрд▓ рдХреЛ STM32F746IGT6 рдХреЗ рдмрдЬрд╛рдп рдмреЛрд░реНрдб рдкрд░ рдЯрд╛рдБрдХрд╛ рдФрд░ SW4STM32 рдореЗрдВ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХреАред

рдпрд╣ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рдШрдбрд╝реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдбрд┐рд╡рд╛рдЗрдбрд░ рдФрд░ рдХрд╛рд░рдХреЛрдВ рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП STM32CubeMX рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдХреНрд▓реЙрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЯреИрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдШрдбрд╝реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕:

  • рдмрд╛рд╣рд░реА рдХреНрд╡рд╛рд░реНрдЯреНрдЬ - 8 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ
  • PLL1 рдХреЗ рд▓рд┐рдП рдЖрд╡реГрддреНрддрд┐ рд╕реНрд░реЛрдд - рдмрд╛рд╣рд░реА рдХреНрд╡рд╛рд░реНрдЯреНрдЬ (HSE)
  • PLL1 рдХреЗ рд▓рд┐рдП рд╡рд┐рднрдХреНрдд - 4 (DIVM1)
  • рдЧреБрдгрдХ PLL1 - 400 (DIVN1)
  • рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрдбрд░ - 2 (DIVP1, DIVQ1, DIVR1)

рддрджрдиреБрд╕рд╛рд░, рдХреЛрд░ рдЖрд╡реГрддреНрддрд┐ (SYSCLK) 400 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рд╣реИред



STM32CubeMX рдХреЗ рдЕрд▓рд╛рд╡рд╛, STM32CubeH7 рдлрд░реНрдорд╡реЗрдпрд░ рдкреИрдХреЗрдЬ рднреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ STM32H7 рдХреЗ рд▓рд┐рдП рдмрд╛рд╣реНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдпрд╣ рдЙрдирд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рдШрдбрд╝реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХрд╛ рдЕрдиреБрдХреНрд░рдо рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╕реВрдЪрдирд╛ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд▓реА рдЧрдИ рд╣реИрдВ:

  • SystemMlock_Config STM32CubeH7 рдлрд░реНрдорд╡реЗрдпрд░ рдкреИрдХреЗрдЬ рд╕реЗ
  • рд╕рдВрджрд░реНрдн рдореИрдиреБрдЕрд▓ STM32H743 / 753 рдФрд░ STM32H750 рдПрдЖрд░рдПрдо-рдЖрдзрд╛рд░рд┐рдд 32-рдмрд┐рдЯ MCUs
  • - рдбреЗрдЯрд╢реАрдЯ STM32H743xI

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

1. рдмрд╛рд╣рд░реА рдХреНрд╡рд╛рд░реНрдЯреНрдЬ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдФрд░ рддрддреНрдкрд░рддрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ред

// Enable HSE RCC->CR |= RCC_CR_HSEON; // Wait till HSE is ready while((RCC->CR & RCC_CR_HSERDY) == 0); 

2. PLL1 рдХреЗ рд▓рд┐рдП рдЖрд╡реГрддреНрддрд┐ рд╕реНрд░реЛрдд рдХрд╛ рд╕рдВрдХреЗрдд - рдмрд╛рд╣рд░реА рдХреНрд╡рд╛рд░реНрдЯреНрдЬред

 //RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC -> PLLCKSELR |= RCC_PLLCKSELR_PLLSRC_HSE; 

3. рд╡рд┐рднрд╛рдЬрдХ рдорд╛рди 4 рдкрд░ рд╕реЗрдЯ рд╣реИред

 //PLLM = 4 RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_5; //0 RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_4; //0 RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_3; //0 RCC -> PLLCKSELR |= RCC_PLLCKSELR_DIVM1_2; //1 RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_1; //0 RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_0; //0 

4. рдХрд╛рд░рдХ рдПрди рдФрд░ рднрд╛рдЬрдХ рдкреА, рдХреНрдпреВ, рдЖрд░

  //PLL1DIVR bits //DIVN1[8:0] 0 - 8 PLLN = 400 //DIVP1[6:0] 9 - 15 PLLP = 2 //DIVQ1[6:0] 16 - 22 PLLQ = 2 //DIVR1[6:0] 24 - 30 PLLR = 2 RCC -> PLL1DIVR |= 0x0101038F; 

5. рдЖрдВрд╢рд┐рдХ рдЖрд╡реГрддреНрддрд┐ рд╡рд┐рднрдХреНрдд PLL (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)

 // /* Configure PLL PLL1FRACN */ //__HAL_RCC_PLLFRACN_CONFIG(RCC_OscInitStruct->PLL.PLLFRACN); RCC -> PLL1FRACR = 0; 

6. рдЗрдирдкреБрдЯ рдЖрд╡реГрддреНрддрд┐ рд░реЗрдВрдЬ PLL1 рдХрд╛ рд╕рдВрдХреЗрдд

  /* Select PLL1 input reference frequency range: VCI */ //__HAL_RCC_PLL_VCIRANGE(RCC_OscInitStruct->PLL.PLLRGE) ; RCC->PLLCFGR |= RCC_PLLCFGR_PLL1RGE_3; 

7. рдЙрддреНрдкрд╛рджрди рдЖрд╡реГрддреНрддрд┐ рд░реЗрдВрдЬ PLL1 рдХрд╛ рд╕рдВрдХреЗрдд

  /* Select PLL1 output frequency range : VCO */ //__HAL_RCC_PLL_VCORANGE(RCC_OscInitStruct->PLL.PLLVCOSEL) ; RCC->PLLCFGR &= ~RCC_PLLCFGR_PLL1VCOSEL; 

8. рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрдбрд░ рдкрд░ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ PLL1: P, Q, R

  /* Enable PLL System Clock output. */ // __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVP); //Bit 16 DIVP1EN: PLL1 DIVP divider output enable RCC->PLLCFGR |= RCC_PLLCFGR_DIVP1EN; /* Enable PLL1Q Clock output. */ //__HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ); RCC->PLLCFGR |= RCC_PLLCFGR_DIVQ1EN; /* Enable PLL1R Clock output. */ // __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVR); RCC->PLLCFGR |= RCC_PLLCFGR_DIVR1EN; 

9. рднрд┐рдиреНрдирд╛рддреНрдордХ рд╡рд┐рднрдХреНрдд рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ред

  /* Enable PLL1FRACN . */ //__HAL_RCC_PLLFRACN_ENABLE(); RCC->PLLCFGR |= RCC_PLLCFGR_PLL1FRACEN; 

10. PLL1 рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рддрддреНрдкрд░рддрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ

  /* Enable the main PLL. */ //__HAL_RCC_PLL_ENABLE(); RCC->CR |= RCC_CR_PLLON; while((RCC->CR & RCC_CR_PLL1RDY) == 0); 

PLL1 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдЕрдм SYSCLK рдЖрд╡реГрддреНрддрд┐ рд╕реНрд░реЛрдд рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдмрд╕ рдбрд┐рд╡рд╛рдЗрдбрд░ рд╕реЗрдЯ рдХрд░реЗрдВред

11. 2 рдПрдЪрдкреАрдЖрд░рдИ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрдХреНрдд

  //RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; // MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); //HPRE[3:0]: D1 domain AHB prescaler //1000: rcc_hclk3 = sys_d1cpre_ck / 2 RCC -> D1CFGR |= RCC_D1CFGR_HPRE_3; //1 RCC -> D1CFGR &= ~RCC_D1CFGR_HPRE_2; //0 RCC -> D1CFGR &= ~RCC_D1CFGR_HPRE_1; //0 RCC -> D1CFGR &= ~RCC_D1CFGR_HPRE_0; //0 

12. рдмрд┐рдирд╛ рд╡рд┐рднрд╛рдЬрди рдХреЗ D1CPRE

  //RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; //MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1CPRE, RCC_ClkInitStruct->SYSCLKDivider); //D1CPRE[3:0]: D1 domain Core prescaler //0xxx: sys_ck not divided (default after reset) RCC -> D1CFGR &= ~RCC_D1CFGR_D1CPRE_3; //0 RCC -> D1CFGR &= ~RCC_D1CFGR_D1CPRE_2; //0 RCC -> D1CFGR &= ~RCC_D1CFGR_D1CPRE_1; //0 RCC -> D1CFGR &= ~RCC_D1CFGR_D1CPRE_0; //0 

13. PLL1 рдХреЛ SYSCLK рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рддрддреНрдкрд░рддрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ

  //RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_ClkInitStruct->SYSCLKSource); //SW[2:0]: System clock switch //011: PLL1 selected as system clock (pll1_p_ck) RCC->CFGR &= ~RCC_CFGR_SW_2; //0 RCC->CFGR |= RCC_CFGR_SW_1; //1 RCC->CFGR |= RCC_CFGR_SW_0; //1 while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL1); 

14. рдбрд┐рд╡рд╛рдЗрдбрд░ 2 D1PPRE рджреНрд╡рд╛рд░рд╛

  //D1PCLK1 Configuration //RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; //MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1PPRE, RCC_ClkInitStruct->APB3CLKDivider); //Bits 6:4 D1PPRE[2:0]: D1 domain APB3 prescaler //100: rcc_pclk3 = rcc_hclk3 / 2 RCC -> D1CFGR |= RCC_D1CFGR_D1PPRE_2; RCC -> D1CFGR &= ~RCC_D1CFGR_D1PPRE_1; RCC -> D1CFGR &= ~RCC_D1CFGR_D1PPRE_0; 

15. 2 D2PPRE1 рджреНрд╡рд╛рд░рд╛ рдбрд┐рд╡рд╛рдЗрдбрд░

  //PCLK1 Configuration //RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; //MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE1, (RCC_ClkInitStruct->APB1CLKDivider)); //Bits 6:4 D2PPRE1[2:0]: D2 domain APB1 prescaler //100: rcc_pclk1 = rcc_hclk1 / 2 RCC -> D2CFGR |= RCC_D2CFGR_D2PPRE1_2; RCC -> D2CFGR &= ~RCC_D2CFGR_D2PPRE1_1; RCC -> D2CFGR &= ~RCC_D2CFGR_D2PPRE1_0; 

16. рдбрд┐рд╡рд╛рдЗрдбрд░ 2 D2PPRE2 рджреНрд╡рд╛рд░рд╛

  //PCLK2 Configuration //RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; //MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE2, (RCC_ClkInitStruct->APB2CLKDivider)); //Bits 10:8 D2PPRE2[2:0]: D2 domain APB2 prescaler //100: rcc_pclk2 = rcc_hclk1 / 2 RCC -> D2CFGR |= RCC_D2CFGR_D2PPRE2_2; RCC -> D2CFGR &= ~RCC_D2CFGR_D2PPRE2_1; RCC -> D2CFGR &= ~RCC_D2CFGR_D2PPRE2_0; 

17. 2 рдбреАрдмреАрдкреАрдЖрд░рдИ рджреНрд╡рд╛рд░рд╛ рдбрд┐рд╡рд╛рдЗрдбрд░

  //D3PCLK1 Configuration //RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; //MODIFY_REG(RCC->D3CFGR, RCC_D3CFGR_D3PPRE, (RCC_ClkInitStruct->APB4CLKDivider) ); //Bits 6:4 D3PPRE[2:0]: D3 domain APB4 prescaler //100: rcc_pclk4 = rcc_hclk4 / 2 RCC -> D3CFGR |= RCC_D3CFGR_D3PPRE_2; RCC -> D3CFGR &= ~RCC_D3CFGR_D3PPRE_1; RCC -> D3CFGR &= ~RCC_D3CFGR_D3PPRE_0; 

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдкреНрд░рд╛рд░рдВрдн рд╕рдлрд▓ рд░рд╣реЗ, рд╣рдо MCO2 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ 15 рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдкреНрд▓рд┐рдЯрд░ рдХреЗ рд╕рд╛рде 26.666 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред



рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ред рдЖрд╡реГрддреНрддрд┐ рдореМрдЬреВрдж рд╣реИ, рдлрд┐рд░ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi427435/


All Articles