aboutsummaryrefslogtreecommitdiffstats
path: root/libmaple/rcc.h
blob: 5c9591bd4ffb065dcd985e50c7f1429c0cc9a5e5 (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/**
 *  @file rcc.h
 *
 *  @brief 
 */

#ifndef _RCC_H_
#define _RCC_H_

#define RCC_BASE               0x40021000
#define RCC_CR                 (RCC_BASE + 0x0)
#define RCC_CFGR               (RCC_BASE + 0x4)
#define RCC_CIR                (RCC_BASE + 0x8)
#define RCC_APB2RSTR           (RCC_BASE + 0xC)
#define RCC_APB1RSTR           (RCC_BASE + 0x10)
#define RCC_AHBENR             (RCC_BASE + 0x14)
#define RCC_APB2ENR            (RCC_BASE + 0x18)
#define RCC_APB1ENR            (RCC_BASE + 0x1C)
#define RCC_BDCR               (RCC_BASE + 0x20)
#define RCC_CSR                (RCC_BASE + 0x24)
#define RCC_AHBSTR             (RCC_BASE + 0x28)
#define RCC_CFGR2              (RCC_BASE + 0x2C))

#define HSEON                  BIT(16)
#define HSERDY                 *(volatile uint32_t*)(BITBAND_PERI(RCC_CR + 2, 0))

#define ADCPRE                 0x0000C000
#define HPRE                   0x000000F0
#define PPRE2                  0x00003800  // apb2 high speed prescaler
#define PPRE1                  0x00000700  // apb1 low-speed prescaler

#define PLLMUL                 0x002C0000
#define PLL_MUL_9              0x001C0000
#define PLLSRC                 BIT(16)
#define SYSCLK_DIV_1           (0x0 << 4)
#define HCLK_DIV_1             0
#define HCLK_DIV_2             0x00000400
#define PCLK2_DIV_2            0x00008000

#define PLLRDY                 BIT(25)
#define PLLON                  BIT(24)
#define PLL_INPUT_CLK_HSE      BIT(16)

#define RCC_CFGR_SWS           0x00000003
#define RCC_CFGR_SWS_PLL       0x00000002

/* APB2 reset bits  */
#define RCC_APB2RSTR_USART1RST   BIT(14)
#define RCC_APB2RSTR_SPI1RST     BIT(12)
#define RCC_APB2RSTR_TIM1RST     BIT(11)
#define RCC_APB2RSTR_ADC2RST     BIT(10)
#define RCC_APB2RSTR_ADC1RST     BIT(9)
#define RCC_APB2RSTR_IOERST      BIT(6)
#define RCC_APB2RSTR_IODRST      BIT(5)
#define RCC_APB2RSTR_IOCRST      BIT(4)
#define RCC_APB2RSTR_IOBRST      BIT(3)
#define RCC_APB2RSTR_IOARST      BIT(2)
#define RCC_APB2RSTR_AFIORST     BIT(0)

/* APB2 peripheral clock enable bits  */
#define RCC_APB2ENR_USART1EN   BIT(14)
#define RCC_APB2ENR_SPI1EN     BIT(12)
#define RCC_APB2ENR_TIM1EN     BIT(11)
#define RCC_APB2ENR_ADC2EN     BIT(10)
#define RCC_APB2ENR_ADC1EN     BIT(9)
#define RCC_APB2ENR_IOEEN      BIT(6)
#define RCC_APB2ENR_IODEN      BIT(5)
#define RCC_APB2ENR_IOCEN      BIT(4)
#define RCC_APB2ENR_IOBEN      BIT(3)
#define RCC_APB2ENR_IOAEN      BIT(2)
#define RCC_APB2ENR_AFIOEN     BIT(0)

/* APB1 peripheral clock enable bits  */
#define RCC_APB1ENR_TIM2EN     BIT(0)
#define RCC_APB1ENR_TIM3EN     BIT(1)
#define RCC_APB1ENR_TIM4EN     BIT(2)
#define RCC_APB1ENR_USART2EN   BIT(17)
#define RCC_APB1ENR_USART3EN   BIT(18)

#define rcc_enable_clk_timer1()   __set_bits(RCC_APB2ENR, RCC_APB2ENR_TIM1EN)
#define rcc_enable_clk_timer2()   __set_bits(RCC_APB1ENR, RCC_APB1ENR_TIM2EN)
#define rcc_enable_clk_timer3()   __set_bits(RCC_APB1ENR, RCC_APB1ENR_TIM3EN)
#define rcc_enable_clk_timer4()   __set_bits(RCC_APB1ENR, RCC_APB1ENR_TIM4EN)

#define rcc_enable_clk_gpioa()    __set_bits(RCC_APB2ENR, RCC_APB2ENR_IOAEN)
#define rcc_enable_clk_gpiob()    __set_bits(RCC_APB2ENR, RCC_APB2ENR_IOBEN)
#define rcc_enable_clk_gpioc()    __set_bits(RCC_APB2ENR, RCC_APB2ENR_IOCEN)
#define rcc_enable_clk_gpiod()    __set_bits(RCC_APB2ENR, RCC_APB2ENR_IODEN)
#define rcc_enable_clk_afio()     __set_bits(RCC_APB2ENR, RCC_APB2ENR_AFIOEN)

#define rcc_enable_clk_usart1()   __set_bits(RCC_APB2ENR, RCC_APB2ENR_USART1EN)
#define rcc_enable_clk_usart2()   __set_bits(RCC_APB1ENR, RCC_APB1ENR_USART2EN)
#define rcc_enable_clk_usart3()   __set_bits(RCC_APB1ENR, RCC_APB1ENR_USART3EN)

#define rcc_enable_clk_adc1()     __set_bits(RCC_APB2ENR, RCC_APB2ENR_ADC1EN)

#define rcc_reset_adc1()          { __set_bits(RCC_APB2RSTR, RCC_APB2RSTR_ADC1RST);   \
                                    __clear_bits(RCC_APB2RSTR, RCC_APB2RSTR_ADC1RST); \
                                  }


void rcc_init(void);
void rcc_set_adc_prescaler(uint32_t divider);

#endif