Skip to content

Commit 8d26b44

Browse files
committed
[H7] Update the system source file
Base on system_stm32h7xx_singlecore.c Signed-off-by: Frederic Pillon <[email protected]>
1 parent 2afbbc4 commit 8d26b44

File tree

1 file changed

+57
-30
lines changed

1 file changed

+57
-30
lines changed

system/STM32H7xx/system_stm32h7xx.c

Lines changed: 57 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
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 */
@@ -79,11 +80,14 @@
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
/******************************************************************************/
@@ -140,9 +144,13 @@
140144
*/
141145
void 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
*/
246263
void 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

Comments
 (0)