Skip to content

Commit

Permalink
stm32/system_stm32f0: Add support for using HSE and PLL as SYSCLK.
Browse files Browse the repository at this point in the history
To configure the SYSCLK on an F0 enable one of:

    MICROPY_HW_CLK_USE_HSI48
    MICROPY_HW_CLK_USE_HSE
    MICROPY_HW_CLK_USE_BYPASS
  • Loading branch information
dpgeorge committed Apr 18, 2019
1 parent f1774fa commit 11657f2
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 3 deletions.
1 change: 1 addition & 0 deletions ports/stm32/boards/NUCLEO_F091RC/mpconfigboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#define MICROPY_HW_HAS_SWITCH (1)

// For system clock, board uses internal 48MHz, HSI48
#define MICROPY_HW_CLK_USE_HSI48 (1)

// The board has an external 32kHz crystal
#define MICROPY_HW_RTC_USE_LSE (1)
Expand Down
31 changes: 28 additions & 3 deletions ports/stm32/system_stm32f0.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
******************************************************************************
*/

#include STM32_HAL_H
#include "py/mphal.h"

#ifndef HSE_VALUE
#define HSE_VALUE (8000000)
Expand Down Expand Up @@ -135,12 +135,37 @@ void SystemClock_Config(void) {
// Set flash latency to 1 because SYSCLK > 24MHz
FLASH->ACR = (FLASH->ACR & ~0x7) | 0x1;

#if MICROPY_HW_CLK_USE_HSI48
// Use the 48MHz internal oscillator

RCC->CR2 |= RCC_CR2_HSI48ON;
while ((RCC->CR2 & RCC_CR2_HSI48RDY) == 0) {
}
RCC->CFGR |= 3 << RCC_CFGR_SW_Pos;
while (((RCC->CFGR >> RCC_CFGR_SWS_Pos) & 0x3) != 0x03) {
const uint32_t sysclk_src = 3;

#else
// Use HSE and the PLL to get a 48MHz SYSCLK

#if MICROPY_HW_CLK_USE_BYPASS
RCC->CR |= RCC_CR_HSEBYP;
#endif
RCC->CR |= RCC_CR_HSEON;
while ((RCC->CR & RCC_CR_HSERDY) == 0) {
// Wait for HSE to be ready
}
RCC->CFGR = ((48000000 / HSE_VALUE) - 2) << RCC_CFGR_PLLMUL_Pos | 2 << RCC_CFGR_PLLSRC_Pos;
RCC->CFGR2 = 0; // Input clock not divided
RCC->CR |= RCC_CR_PLLON; // Turn PLL on
while ((RCC->CR & RCC_CR_PLLRDY) == 0) {
// Wait for PLL to lock
}
const uint32_t sysclk_src = 2;

#endif

// Select SYSCLK source
RCC->CFGR |= sysclk_src << RCC_CFGR_SW_Pos;
while (((RCC->CFGR >> RCC_CFGR_SWS_Pos) & 0x3) != sysclk_src) {
// Wait for SYSCLK source to change
}

Expand Down

0 comments on commit 11657f2

Please sign in to comment.