Skip to content

Commit 910a563

Browse files
committed
AT32F415: Increase clock speed to 144MHz
1 parent 5f05d8f commit 910a563

2 files changed

Lines changed: 50 additions & 16 deletions

File tree

inc/mcu/at32/f4_regs.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,12 @@
77
#define RCC_CFGR_APB2PSC_2 (4u<<11)
88
#define RCC_CFGR_APB1PSC_2 (4u<< 8)
99

10+
#define RCC_PLL (&rcc->cfgr2)
11+
#define RCC_PLL_PLLCFGEN (1u<<31)
12+
#define RCC_PLL_FREF_MASK (7u<<24)
13+
#define RCC_PLL_FREF_8M (2u<<24)
14+
15+
static volatile uint32_t * const RCC_MISC2 = (uint32_t *)(RCC_BASE + 0x54);
16+
#define RCC_MISC2_AUTOSTEP_EN (3u<< 4)
17+
1018
#define TIM_CR1_PMEN (1u<<10)

src/mcu/at32f4/stm32.c

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,43 +14,69 @@ unsigned int at32f4_series;
1414

1515
static 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

Comments
 (0)