@@ -14,43 +14,69 @@ unsigned int at32f4_series;
1414
1515static void clock_init (void )
1616{
17+ uint32_t cfgr ;
18+
1719 if (at32f4_series == AT32F415 ) {
18- /* Flash controller: reads require 2 wait states at 72MHz . */
19- flash -> acr = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY (2 );
20+ /* Flash controller: reads require 4 wait states at 144MHz . */
21+ flash -> acr = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY (4 );
2022 }
2123
2224 /* Start up the external oscillator. */
2325 rcc -> cr |= RCC_CR_HSEON ;
2426 while (!(rcc -> cr & RCC_CR_HSERDY ))
2527 cpu_relax ();
2628
27- if (at32f4_series == AT32F403 )
28- delay_ms (2 );
29-
3029 /* PLLs, scalers, muxes. */
31- rcc -> cfgr = (RCC_CFGR_PLLRANGE_GT72MHZ |
32- RCC_CFGR_PLLMUL_18 | /* PLL = 18*8MHz = 144MHz */
33- RCC_CFGR_USBPSC_3 | /* USB = 144/3MHz = 48MHz */
34- RCC_CFGR_PLLSRC_PREDIV1 |
35- RCC_CFGR_ADCPRE_DIV8 |
36- RCC_CFGR_APB2PSC_2 | /* APB2 = 144/2MHz = 72MHz */
37- RCC_CFGR_APB1PSC_2 ); /* APB1 = 144/2MHz = 72MHz */
30+ cfgr = (RCC_CFGR_PLLMUL_18 | /* PLL = 18*8MHz = 144MHz */
31+ RCC_CFGR_USBPSC_3 | /* USB = 144/3MHz = 48MHz */
32+ RCC_CFGR_PLLSRC_PREDIV1 |
33+ RCC_CFGR_ADCPRE_DIV8 |
34+ RCC_CFGR_APB2PSC_2 | /* APB2 = 144/2MHz = 72MHz */
35+ RCC_CFGR_APB1PSC_2 ); /* APB1 = 144/2MHz = 72MHz */
36+
37+ switch (at32f4_series ) {
38+ case AT32F403 :
39+ cfgr |= RCC_CFGR_PLLRANGE_GT72MHZ ;
40+ early_delay_ms (2 );
41+ break ;
42+ case AT32F415 : {
43+ uint32_t rcc_pll = * RCC_PLL ;
44+ rcc_pll &= ~(RCC_PLL_PLLCFGEN | RCC_PLL_FREF_MASK );
45+ rcc_pll |= RCC_PLL_FREF_8M ;
46+ * RCC_PLL = rcc_pll ;
47+ break ;
48+ }
49+ }
50+
51+ rcc -> cfgr = cfgr ;
3852
3953 /* Enable and stabilise the PLL. */
4054 rcc -> cr |= RCC_CR_PLLON ;
4155 while (!(rcc -> cr & RCC_CR_PLLRDY ))
4256 cpu_relax ();
4357
44- if (at32f4_series == AT32F403 )
45- delay_us (200 );
58+ switch (at32f4_series ) {
59+ case AT32F403 :
60+ early_delay_us (200 );
61+ break ;
62+ case AT32F415 :
63+ * RCC_MISC2 |= RCC_MISC2_AUTOSTEP_EN ;
64+ break ;
65+ }
4666
4767 /* Switch to the externally-driven PLL for system clock. */
4868 rcc -> cfgr |= RCC_CFGR_SW_PLL ;
4969 while ((rcc -> cfgr & RCC_CFGR_SWS_MASK ) != RCC_CFGR_SWS_PLL )
5070 cpu_relax ();
5171
52- if (at32f4_series == AT32F403 )
53- delay_us (200 );
72+ switch (at32f4_series ) {
73+ case AT32F403 :
74+ early_delay_us (200 );
75+ break ;
76+ case AT32F415 :
77+ * RCC_MISC2 &= ~RCC_MISC2_AUTOSTEP_EN ;
78+ break ;
79+ }
5480
5581 /* Internal oscillator no longer needed. */
5682 rcc -> cr &= ~RCC_CR_HSION ;
0 commit comments