4848 */
4949
5050#include "stm32h7xx.h"
51+ #include <math.h>
5152
5253#if !defined (HSE_VALUE )
5354#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
7980 */
8081
8182/************************* Miscellaneous Configuration ************************/
83+ /*!< Uncomment the following line if you need to use initialized data in D2 domain SRAM */
84+ /* #define DATA_IN_D2_SRAM */
85+
8286/*!< Uncomment the following line if you need to relocate your vector Table in
8387 Internal SRAM. */
8488/* #define VECT_TAB_SRAM */
8589#ifndef VECT_TAB_OFFSET
86- #define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field.
90+ #define VECT_TAB_OFFSET 0x00000000UL /*!< Vector Table base offset field.
8791 This value must be a multiple of 0x200. */
8892#endif
8993/******************************************************************************/
140144 */
141145void SystemInit (void )
142146{
147+ #if defined (DATA_IN_D2_SRAM )
148+ __IO uint32_t tmpreg ;
149+ #endif /* DATA_IN_D2_SRAM */
150+
143151 /* FPU settings ------------------------------------------------------------*/
144152 #if (__FPU_PRESENT == 1 ) && (__FPU_USED == 1 )
145- SCB -> CPACR |= ((3UL << 10 * 2 )|(3UL << 11 * 2 )); /* set CP10 and CP11 Full Access */
153+ SCB -> CPACR |= ((3UL << ( 10 * 2 )) |(3UL << ( 11 * 2 ) )); /* set CP10 and CP11 Full Access */
146154 #endif
147155 /* Reset the RCC clock configuration to the default reset state ------------*/
148156 /* Set HSION bit */
@@ -152,7 +160,7 @@ void SystemInit (void)
152160 RCC -> CFGR = 0x00000000 ;
153161
154162 /* Reset HSEON, CSSON , CSION,RC48ON, CSIKERON PLL1ON, PLL2ON and PLL3ON bits */
155- RCC -> CR &= ( uint32_t ) 0xEAF6ED7F ;
163+ RCC -> CR &= 0xEAF6ED7FU ;
156164
157165 /* Reset D1CFGR register */
158166 RCC -> D1CFGR = 0x00000000 ;
@@ -186,15 +194,24 @@ void SystemInit (void)
186194 RCC -> PLL3FRACR = 0x00000000 ;
187195
188196 /* Reset HSEBYP bit */
189- RCC -> CR &= ( uint32_t ) 0xFFFBFFFF ;
197+ RCC -> CR &= 0xFFFBFFFFU ;
190198
191199 /* Disable all interrupts */
192200 RCC -> CIER = 0x00000000 ;
193201
202+ if ((DBGMCU -> IDCODE & 0xFFFF0000U ) < 0x20000000U )
203+ {
204+ /* if stm32h7 revY*/
205+ /* Change the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */
206+ * ((__IO uint32_t * )0x51008108 ) = 0x000000001U ;
207+ }
194208
195- /* Change the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */
196- * ((__IO uint32_t * )0x51008108 ) = 0x000000001 ;
197-
209+ #if defined (DATA_IN_D2_SRAM )
210+ /* in case of initialized data in D2 SRAM , enable the D2 SRAM clock */
211+ RCC -> AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN );
212+ tmpreg = RCC -> AHB2ENR ;
213+ (void ) tmpreg ;
214+ #endif /* DATA_IN_D2_SRAM */
198215
199216 /* Configure the Vector Table location add offset address ------------------*/
200217#ifdef VECT_TAB_SRAM
@@ -245,70 +262,80 @@ void SystemInit (void)
245262 */
246263void SystemCoreClockUpdate (void )
247264{
248- uint32_t pllp = 2 , pllsource = 0 , pllm = 2 , tmp , pllfracen = 0 , hsivalue = 0 ;
249- float fracn1 , pllvco = 0 ;
265+ uint32_t pllp , pllsource , pllm , pllfracen , hsivalue , tmp ;
266+ float_t fracn1 , pllvco ;
250267
251268 /* Get SYSCLK source -------------------------------------------------------*/
252269
253270 switch (RCC -> CFGR & RCC_CFGR_SWS )
254271 {
255- case 0x00 : /* HSI used as system clock source */
256-
272+ case RCC_CFGR_SWS_HSI : /* HSI used as system clock source */
257273 SystemCoreClock = (uint32_t ) (HSI_VALUE >> ((RCC -> CR & RCC_CR_HSIDIV )>> 3 ));
258-
259274 break ;
260275
261- case 0x08 : /* CSI used as system clock source */
276+ case RCC_CFGR_SWS_CSI : /* CSI used as system clock source */
262277 SystemCoreClock = CSI_VALUE ;
263278 break ;
264279
265- case 0x10 : /* HSE used as system clock source */
280+ case RCC_CFGR_SWS_HSE : /* HSE used as system clock source */
266281 SystemCoreClock = HSE_VALUE ;
267282 break ;
268283
269- case 0x18 : /* PLL1 used as system clock source */
284+ case RCC_CFGR_SWS_PLL1 : /* PLL1 used as system clock source */
270285
271286 /* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLLM) * PLLN
272287 SYSCLK = PLL_VCO / PLLR
273288 */
274289 pllsource = (RCC -> PLLCKSELR & RCC_PLLCKSELR_PLLSRC );
275290 pllm = ((RCC -> PLLCKSELR & RCC_PLLCKSELR_DIVM1 )>> 4 ) ;
276- pllfracen = RCC -> PLLCFGR & RCC_PLLCFGR_PLL1FRACEN ;
277- fracn1 = (pllfracen * ((RCC -> PLL1FRACR & RCC_PLL1FRACR_FRACN1 )>> 3 ));
291+ pllfracen = ((RCC -> PLLCFGR & RCC_PLLCFGR_PLL1FRACEN )>>RCC_PLLCFGR_PLL1FRACEN_Pos );
292+ fracn1 = (float_t )(uint32_t )(pllfracen * ((RCC -> PLL1FRACR & RCC_PLL1FRACR_FRACN1 )>> 3 ));
293+
294+ if (pllm != 0U )
295+ {
278296 switch (pllsource )
279297 {
298+ case RCC_PLLCKSELR_PLLSRC_HSI : /* HSI used as PLL clock source */
280299
281- case 0x00 : /* HSI used as PLL clock source */
282300 hsivalue = (HSI_VALUE >> ((RCC -> CR & RCC_CR_HSIDIV )>> 3 )) ;
283- pllvco = (hsivalue / pllm ) * ((RCC -> PLL1DIVR & RCC_PLL1DIVR_N1 ) + (fracn1 /0x2000 ) + 1 );
301+ pllvco = ( (float_t )hsivalue / (float_t )pllm ) * ((float_t )(uint32_t )(RCC -> PLL1DIVR & RCC_PLL1DIVR_N1 ) + (fracn1 /(float_t )0x2000 ) + (float_t )1 );
302+
284303 break ;
285304
286- case 0x01 : /* CSI used as PLL clock source */
287- pllvco = (CSI_VALUE / pllm ) * ((RCC -> PLL1DIVR & RCC_PLL1DIVR_N1 ) + (fracn1 /0x2000 ) + 1 );
305+ case RCC_PLLCKSELR_PLLSRC_CSI : /* CSI used as PLL clock source */
306+ pllvco = (( float_t ) CSI_VALUE / ( float_t ) pllm ) * ((float_t )( uint32_t )( RCC -> PLL1DIVR & RCC_PLL1DIVR_N1 ) + (fracn1 /( float_t ) 0x2000 ) + ( float_t ) 1 );
288307 break ;
289308
290- case 0x02 : /* HSE used as PLL clock source */
291- pllvco = (HSE_VALUE / pllm ) * ((RCC -> PLL1DIVR & RCC_PLL1DIVR_N1 ) + (fracn1 /0x2000 ) + 1 );
309+ case RCC_PLLCKSELR_PLLSRC_HSE : /* HSE used as PLL clock source */
310+ pllvco = (( float_t ) HSE_VALUE / ( float_t ) pllm ) * ((float_t )( uint32_t )( RCC -> PLL1DIVR & RCC_PLL1DIVR_N1 ) + (fracn1 /( float_t ) 0x2000 ) + ( float_t ) 1 );
292311 break ;
293312
294313 default :
295- pllvco = (CSI_VALUE / pllm ) * ((RCC -> PLL1DIVR & RCC_PLL1DIVR_N1 ) + (fracn1 /0x2000 ) + 1 );
314+ pllvco = (( float_t ) CSI_VALUE / ( float_t ) pllm ) * ((float_t )( uint32_t )( RCC -> PLL1DIVR & RCC_PLL1DIVR_N1 ) + (fracn1 /( float_t ) 0x2000 ) + ( float_t ) 1 );
296315 break ;
297316 }
298- pllp = (((RCC -> PLL1DIVR & RCC_PLL1DIVR_P1 ) >>9 ) + 1 ) ;
299- SystemCoreClock = (uint32_t ) (pllvco /pllp );
317+ pllp = (((RCC -> PLL1DIVR & RCC_PLL1DIVR_P1 ) >>9 ) + 1U ) ;
318+ SystemCoreClock = (uint32_t )(float_t )(pllvco /(float_t )pllp );
319+ }
320+ else
321+ {
322+ SystemCoreClock = 0U ;
323+ }
300324 break ;
301325
302326 default :
303327 SystemCoreClock = CSI_VALUE ;
304328 break ;
305329 }
306330
307- /* Compute HCLK frequency --------------------------------------------------*/
308- /* Get HCLK prescaler */
309- tmp = D1CorePrescTable [( RCC -> D1CFGR & RCC_D1CFGR_D1CPRE )>> POSITION_VAL ( RCC_D1CFGR_D1CPRE_0 )];
310- /* HCLK frequency */
331+ /* Compute SystemClock frequency --------------------------------------------------*/
332+ tmp = D1CorePrescTable [( RCC -> D1CFGR & RCC_D1CFGR_D1CPRE )>> RCC_D1CFGR_D1CPRE_Pos ];
333+
334+ /* SystemCoreClock frequency : CM7 CPU frequency */
311335 SystemCoreClock >>= tmp ;
336+
337+ /* SystemD2Clock frequency : AXI and AHBs Clock frequency */
338+ SystemD2Clock = (SystemCoreClock >> ((D1CorePrescTable [(RCC -> D1CFGR & RCC_D1CFGR_HPRE )>> RCC_D1CFGR_HPRE_Pos ]) & 0x1FU ));
312339}
313340
314341/**
0 commit comments