aboutsummaryrefslogtreecommitdiff
path: root/src/STM32F0xx_init.c
blob: 9e3c3825dc930f6d5caa88d5821a6dac70734816 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "STM32F0xx.h"
#include "common.h"

/**
 * Initialize the HSI clock source and reset the PLL configuration. This
 * function is called by the startup_common.s file, just before calling the
 * main() function.
 *
 * You can adapt this function to fit your needs, however, do not change its
 * name! It is called in the startup code.
 */
void SystemInit (void) {
  // Set HSION bit
  RCC->CR |= (uint32_t)0x00000001U;

#if defined (STM32F051x8) || \
    defined (STM32F058x8)
  // Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits
  RCC->CFGR &= (uint32_t)0xF8FFB80CU;
#else
  // Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits
  RCC->CFGR &= (uint32_t)0x08FFB80CU;
#endif

  // Reset HSEON, CSSON and PLLON bits
  RCC->CR &= (uint32_t)0xFEF6FFFFU;

  // Reset HSEBYP bit
  RCC->CR &= (uint32_t)0xFFFBFFFFU;

  // Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits
  RCC->CFGR &= (uint32_t)0xFFC0FFFFU;

  // Reset PREDIV[3:0] bits
  RCC->CFGR2 &= (uint32_t)0xFFFFFFF0U;

#if defined (STM32F072xB) || \
    defined (STM32F078xx)
  // Reset USART2SW[1:0], USART1SW[1:0], I2C1SW, CECSW, USBSW and ADCSW bits
  RCC->CFGR3 &= (uint32_t)0xFFFCFE2CU;

#elif defined (STM32F071xB)
  // Reset USART2SW[1:0], USART1SW[1:0], I2C1SW, CECSW and ADCSW bits
  RCC->CFGR3 &= (uint32_t)0xFFFFCEACU;

#elif defined (STM32F091xC) || \
      defined (STM32F098xx)
  // Reset USART3SW[1:0], USART2SW[1:0], USART1SW[1:0], I2C1SW, CECSW and ADCSW bits
  RCC->CFGR3 &= (uint32_t)0xFFF0FEACU;

#elif defined (STM32F030x6) || \
      defined (STM32F030x8) || \
      defined (STM32F031x6) || \
      defined (STM32F038xx) || \
      defined (STM32F030xC)
  // Reset USART1SW[1:0], I2C1SW and ADCSW bits
  RCC->CFGR3 &= (uint32_t)0xFFFFFEECU;

#elif defined (STM32F051x8) || \
      defined (STM32F058xx)
  // Reset USART1SW[1:0], I2C1SW, CECSW and ADCSW bits
  RCC->CFGR3 &= (uint32_t)0xFFFFFEACU;

#elif defined (STM32F042x6) || \
      defined (STM32F048xx)
  // Reset USART1SW[1:0], I2C1SW, CECSW, USBSW and ADCSW bits
  RCC->CFGR3 &= (uint32_t)0xFFFFFE2CU;

#elif defined (STM32F070x6) || \
      defined (STM32F070xB)
  // Reset USART1SW[1:0], I2C1SW, USBSW and ADCSW bits
  RCC->CFGR3 &= (uint32_t)0xFFFFFE6CU;
  // Set default USB clock to PLLCLK, since there is no HSI48
  RCC->CFGR3 |= (uint32_t)0x00000080U;

#else
  #warning "No target selected"
#endif

  // Reset HSI14 bit
  RCC->CR2 &= (uint32_t)0xFFFFFFFEU;

  // Disable all interrupts
  RCC->CIR = 0x00000000U;
}