2626#include "hal.h"
2727#include "hal/stm32h5.h"
2828
29+ #define PLL_SRC_HSE 1
30+
2931static void RAMFUNCTION flash_set_waitstates (unsigned int waitstates )
3032{
3133 uint32_t reg = FLASH_ACR ;
@@ -230,14 +232,30 @@ static void clock_pll_on(void)
230232 uint32_t reg32 ;
231233 uint32_t plln , pllm , pllq , pllp , pllr , hpre , apb1pre , apb2pre , apb3pre , flash_waitstates ;
232234
233- /* Select clock parameters (CPU Speed = 125 MHz) */
235+
236+ #if PLL_SRC_HSE
234237 pllm = 4 ;
235- plln = 125 ; /* TODO: increase to 250 MHz */
238+ plln = 250 ;
236239 pllp = 2 ;
237240 pllq = 2 ;
238241 pllr = 2 ;
242+ #else
243+ pllm = 1 ;
244+ plln = 129 ;
245+ pllp = 2 ;
246+ pllq = 2 ;
247+ pllr = 2 ;
248+ #endif
239249 flash_waitstates = 5 ;
240250
251+ /* Set voltage scaler */
252+ reg32 = PWR_VOSCR & (~PWR_VOS_MASK );
253+ PWR_VOSCR = reg32 | PWR_VOS_SCALE_0 ;
254+
255+ /* Wait until scale has changed */
256+ while ((PWR_VOSSR & PWR_VOSRDY ) == 0 )
257+ ;
258+
241259 /* Disable PLL1 */
242260 RCC_CR &= ~RCC_CR_PLL1ON ;
243261
@@ -248,8 +266,9 @@ static void clock_pll_on(void)
248266 /* Set flash wait states */
249267 flash_set_waitstates (flash_waitstates );
250268
269+ #if PLL_SRC_HSE
251270 /* PLL Oscillator configuration */
252- RCC_CR |= RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_HSEEXT ;
271+ RCC_CR |= RCC_CR_HSEON | RCC_CR_HSEBYP ;
253272
254273 /* Wait until HSE is Ready */
255274 while ((RCC_CR & RCC_CR_HSERDY ) == 0 )
@@ -260,6 +279,26 @@ static void clock_pll_on(void)
260279 reg32 &= ~((0x3F << RCC_PLLCFGR_PLLM_SHIFT ) | (0x03 ));
261280 reg32 |= (pllm << RCC_PLLCFGR_PLLM_SHIFT ) | RCC_PLLCFGR_PLLSRC_HSE ;
262281 RCC_PLL1CFGR = reg32 ;
282+ #else
283+ RCC_CR |= RCC_CR_HSION ;
284+
285+ /* Wait until HSI is Ready */
286+ while ((RCC_CR & RCC_CR_HSIRDY ) == 0 )
287+ ;
288+
289+ RCC_CR |= RCC_CR_CSION ;
290+
291+ /* Wait until CSI is Ready */
292+ while ((RCC_CR & RCC_CR_HSIRDY ) == 0 )
293+ ;
294+
295+ /* Configure PLL1 div/mul factors */
296+ reg32 = RCC_PLL1CFGR ;
297+ reg32 &= ~((0x3F << RCC_PLLCFGR_PLLM_SHIFT ) | (0x03 ));
298+ reg32 |= (pllm << RCC_PLLCFGR_PLLM_SHIFT ) | RCC_PLLCFGR_PLLSRC_CSI ;
299+ RCC_PLL1CFGR = reg32 ;
300+
301+ #endif
263302 DMB ();
264303
265304 RCC_PLL1DIVR = ((plln - 1 ) << RCC_PLLDIVR_DIVN_SHIFT ) | ((pllp - 1 ) << RCC_PLLDIVR_DIVP_SHIFT ) |
@@ -281,7 +320,7 @@ static void clock_pll_on(void)
281320 DMB ();
282321
283322 /* Select PLL1 Input frequency range: VCI */
284- RCC_PLL1CFGR |= RCC_PLLCFGR_RGE_1_2 << RCC_PLLCFGR_PLLRGE_SHIFT ;
323+ RCC_PLL1CFGR |= RCC_PLLCFGR_RGE_2_4 << RCC_PLLCFGR_PLLRGE_SHIFT ;
285324
286325 /* Select PLL1 Output frequency range: VCO = 0 */
287326 RCC_PLL1CFGR &= ~RCC_PLLCFGR_PLLVCOSEL ;
@@ -321,47 +360,8 @@ static void clock_pll_on(void)
321360 while ((RCC_CFGR1 & (RCC_CFGR1_SW_PLL1 << RCC_CFGR1_SWS_SHIFT )) == 0 )
322361 ;
323362
324- /* Configure PLL2 div/mul factors */
325- reg32 = RCC_PLL2CFGR ;
326- reg32 &= ~((0x3F << RCC_PLLCFGR_PLLM_SHIFT ) | (0x03 ));
327- reg32 |= (pllm << RCC_PLLCFGR_PLLM_SHIFT ) | RCC_PLLCFGR_PLLSRC_HSE ;
328- RCC_PLL2CFGR = reg32 ;
329- DMB ();
330-
331- RCC_PLL2DIVR = ((plln - 1 ) << RCC_PLLDIVR_DIVN_SHIFT ) | ((pllp - 1 ) << RCC_PLLDIVR_DIVP_SHIFT ) |
332- ((pllq - 1 ) << RCC_PLLDIVR_DIVQ_SHIFT ) | ((pllr - 1 ) << RCC_PLLDIVR_DIVR_SHIFT );
333- DMB ();
334-
335-
336- /* Disable Fractional PLL */
337- RCC_PLL2CFGR &= ~RCC_PLLCFGR_PLLFRACEN ;
338- DMB ();
339-
340-
341- /* Configure Fractional PLL factor */
342- RCC_PLL2FRACR = 0x00000000 ;
343- DMB ();
344-
345- /* Enable Fractional PLL */
346- RCC_PLL2CFGR |= RCC_PLLCFGR_PLLFRACEN ;
347- DMB ();
348-
349- /* Select PLL2 Input frequency range: VCI */
350- RCC_PLL2CFGR |= RCC_PLLCFGR_RGE_1_2 << RCC_PLLCFGR_PLLRGE_SHIFT ;
351-
352- /* Select PLL2 Output frequency range: VCO = 0 */
353- RCC_PLL2CFGR &= ~RCC_PLLCFGR_PLLVCOSEL ;
354- DMB ();
355-
356- /* Enable PLL2 system clock out (DIV: P) */
357- RCC_PLL2CFGR |= RCC_PLLCFGR_PLLPEN ;
358-
359- /* Enable PLL2 */
360- RCC_CR |= RCC_CR_PLL2ON ;
361-
362- /* Wait until PLL2 is Ready */
363- while ((RCC_CR & RCC_CR_PLL2RDY ) == 0 )
364- ;
363+ /* Set PLL1 as system clock */
364+ RCC_PLL1CFGR |= RCC_PLLCFGR_PLL1PEN ;
365365
366366}
367367
@@ -374,6 +374,12 @@ static void periph_unsecure(void)
374374 /*Enable clock for User LED GPIOs */
375375 RCC_AHB2_CLOCK_ER |= LED_AHB2_ENABLE ;
376376
377+ /* Enable GPIO clock for accessing SECCFGR registers */
378+ RCC_AHB2_CLOCK_ER |= GPIOA_AHB2_CLOCK_ER ;
379+ RCC_AHB2_CLOCK_ER |= GPIOB_AHB2_CLOCK_ER ;
380+ RCC_AHB2_CLOCK_ER |= GPIOC_AHB2_CLOCK_ER ;
381+ RCC_AHB2_CLOCK_ER |= GPIOD_AHB2_CLOCK_ER ;
382+
377383 /* Enable clock for LPUART1 */
378384 RCC_APB2_CLOCK_ER |= UART1_APB2_CLOCK_ER_VAL ;
379385
@@ -406,6 +412,15 @@ static void periph_unsecure(void)
406412 TZSC_SECCFGR1 = reg ;
407413 }
408414
415+ /* Disable GPIOs clock used previously for accessing SECCFGR registers */
416+ #if 0
417+ RCC_AHB2_CLOCK_ER &= ~GPIOA_AHB2_CLOCK_ER ;
418+ RCC_AHB2_CLOCK_ER &= ~GPIOB_AHB2_CLOCK_ER ;
419+ RCC_AHB2_CLOCK_ER &= ~GPIOC_AHB2_CLOCK_ER ;
420+ RCC_AHB2_CLOCK_ER &= ~GPIOD_AHB2_CLOCK_ER ;
421+ #endif
422+
423+
409424}
410425#endif
411426
@@ -500,9 +515,12 @@ void hal_init(void)
500515
501516void hal_prepare_boot (void )
502517{
503- clock_pll_off ();
518+
519+ /* Keep clock settings when staging a NS-application */
504520#if (TZ_SECURE ())
505521 periph_unsecure ();
522+ #else
523+ clock_pll_off ();
506524#endif
507525}
508526
0 commit comments