distortos  v0.7.0
object-oriented C++ RTOS for microcontrollers
clocks.hpp
Go to the documentation of this file.
1 
12 #ifndef SOURCE_CHIP_STM32_STM32F4_INCLUDE_DISTORTOS_CHIP_CLOCKS_HPP_
13 #define SOURCE_CHIP_STM32_STM32F4_INCLUDE_DISTORTOS_CHIP_CLOCKS_HPP_
14 
16 
17 #include <cstdint>
18 
19 namespace distortos
20 {
21 
22 namespace chip
23 {
24 
25 /*---------------------------------------------------------------------------------------------------------------------+
26 | global constants
27 +---------------------------------------------------------------------------------------------------------------------*/
28 
30 constexpr uint32_t hsiFrequency {16000000};
31 
33 constexpr uint32_t minVcoInFrequency {1000000};
34 
36 constexpr uint32_t maxVcoInFrequency {2000000};
37 
39 #if defined(DISTORTOS_CHIP_STM32F401)
40 constexpr uint32_t minVcoOutFrequency {192000000};
41 #else // !defined(DISTORTOS_CHIP_STM32F401)
42 constexpr uint32_t minVcoOutFrequency {100000000};
43 #endif // !defined(DISTORTOS_CHIP_STM32F401)
44 
46 constexpr uint32_t maxVcoOutFrequency {432000000};
47 
54 #if defined(DISTORTOS_CHIP_STM32F401)
55 constexpr uint32_t maxPllOutFrequencies[3][2]
56 {
57  {84000000, 84000000},
58  {84000000, 84000000},
59  {60000000, 60000000},
60 };
61 #elif defined(DISTORTOS_CHIP_STM32F405) || defined(DISTORTOS_CHIP_STM32F407) || defined(DISTORTOS_CHIP_STM32F415) || \
62  defined(DISTORTOS_CHIP_STM32F417)
63 constexpr uint32_t maxPllOutFrequencies[3][2]
64 {
65  {168000000, 168000000},
66  {144000000, 144000000},
67  {144000000, 144000000},
68 };
69 #elif defined(DISTORTOS_CHIP_STM32F410) || defined(DISTORTOS_CHIP_STM32F411) || defined(DISTORTOS_CHIP_STM32F412) || \
70  defined(DISTORTOS_CHIP_STM32F413) || defined(DISTORTOS_CHIP_STM32F423)
71 constexpr uint32_t maxPllOutFrequencies[3][2]
72 {
73  {100000000, 100000000},
74  {84000000, 84000000},
75  {64000000, 64000000},
76 };
77 #else // !defined(DISTORTOS_CHIP_STM32F401) && !defined(DISTORTOS_CHIP_STM32F405) &&
78  // !defined(DISTORTOS_CHIP_STM32F407) && !defined(DISTORTOS_CHIP_STM32F410) &&
79  // !defined(DISTORTOS_CHIP_STM32F411) && !defined(DISTORTOS_CHIP_STM32F412) &&
80  // !defined(DISTORTOS_CHIP_STM32F413) && !defined(DISTORTOS_CHIP_STM32F415) &&
81  // !defined(DISTORTOS_CHIP_STM32F417) && !defined(DISTORTOS_CHIP_STM32F423)
82 constexpr uint32_t maxPllOutFrequencies[3][2]
83 {
84  {168000000, 180000000},
85  {144000000, 144000000},
86  {120000000, 120000000},
87 };
88 #endif // !defined(DISTORTOS_CHIP_STM32F401) && !defined(DISTORTOS_CHIP_STM32F405) &&
89  // !defined(DISTORTOS_CHIP_STM32F407) && !defined(DISTORTOS_CHIP_STM32F410) &&
90  // !defined(DISTORTOS_CHIP_STM32F411) && !defined(DISTORTOS_CHIP_STM32F412) &&
91  // !defined(DISTORTOS_CHIP_STM32F413) && !defined(DISTORTOS_CHIP_STM32F415) &&
92  // !defined(DISTORTOS_CHIP_STM32F417) && !defined(DISTORTOS_CHIP_STM32F423)
93 
95 constexpr uint32_t maxPllqOutFrequency {48000000};
96 
100 #if defined(DISTORTOS_CHIP_STM32F401) || defined(DISTORTOS_CHIP_STM32F405) || defined(DISTORTOS_CHIP_STM32F407) || \
101  defined(DISTORTOS_CHIP_STM32F415) || defined(DISTORTOS_CHIP_STM32F417)
102 constexpr uint32_t maxApb1Frequencies[2] {42000000, 42000000};
103 #elif defined(DISTORTOS_CHIP_STM32F410) || defined(DISTORTOS_CHIP_STM32F411) || defined(DISTORTOS_CHIP_STM32F412) || \
104  defined(DISTORTOS_CHIP_STM32F413) || defined(DISTORTOS_CHIP_STM32F423)
105 constexpr uint32_t maxApb1Frequencies[2] {50000000, 50000000};
106 #else // !defined(DISTORTOS_CHIP_STM32F401) && !defined(DISTORTOS_CHIP_STM32F405) &&
107  // !defined(DISTORTOS_CHIP_STM32F407) && !defined(DISTORTOS_CHIP_STM32F410) &&
108  // !defined(DISTORTOS_CHIP_STM32F411) && !defined(DISTORTOS_CHIP_STM32F412) &&
109  // !defined(DISTORTOS_CHIP_STM32F413) && !defined(DISTORTOS_CHIP_STM32F415) &&
110  // !defined(DISTORTOS_CHIP_STM32F417) && !defined(DISTORTOS_CHIP_STM32F423)
111 constexpr uint32_t maxApb1Frequencies[2] {42000000, 45000000};
112 #endif // !defined(DISTORTOS_CHIP_STM32F401) && !defined(DISTORTOS_CHIP_STM32F405) &&
113  // !defined(DISTORTOS_CHIP_STM32F407) && !defined(DISTORTOS_CHIP_STM32F410) &&
114  // !defined(DISTORTOS_CHIP_STM32F411) && !defined(DISTORTOS_CHIP_STM32F412) &&
115  // !defined(DISTORTOS_CHIP_STM32F413) && !defined(DISTORTOS_CHIP_STM32F415) &&
116  // !defined(DISTORTOS_CHIP_STM32F417) && !defined(DISTORTOS_CHIP_STM32F423)
117 
121 #if defined(DISTORTOS_CHIP_STM32F401) || defined(DISTORTOS_CHIP_STM32F405) || defined(DISTORTOS_CHIP_STM32F407) || \
122  defined(DISTORTOS_CHIP_STM32F415) || defined(DISTORTOS_CHIP_STM32F417)
123 constexpr uint32_t maxApb2Frequencies[2] {84000000, 84000000};
124 #elif defined(DISTORTOS_CHIP_STM32F410) || defined(DISTORTOS_CHIP_STM32F411) || defined(DISTORTOS_CHIP_STM32F412) || \
125  defined(DISTORTOS_CHIP_STM32F413) || defined(DISTORTOS_CHIP_STM32F423)
126 constexpr uint32_t maxApb2Frequencies[2] {100000000, 100000000};
127 #else // !defined(DISTORTOS_CHIP_STM32F401) && !defined(DISTORTOS_CHIP_STM32F405) &&
128  // !defined(DISTORTOS_CHIP_STM32F407) && !defined(DISTORTOS_CHIP_STM32F410) &&
129  // !defined(DISTORTOS_CHIP_STM32F411) && !defined(DISTORTOS_CHIP_STM32F412) &&
130  // !defined(DISTORTOS_CHIP_STM32F413) && !defined(DISTORTOS_CHIP_STM32F415) &&
131  // !defined(DISTORTOS_CHIP_STM32F417) && !defined(DISTORTOS_CHIP_STM32F423)
132 constexpr uint32_t maxApb2Frequencies[2] {84000000, 90000000};
133 #endif // !defined(DISTORTOS_CHIP_STM32F401) && !defined(DISTORTOS_CHIP_STM32F405) &&
134  // !defined(DISTORTOS_CHIP_STM32F407) && !defined(DISTORTOS_CHIP_STM32F410) &&
135  // !defined(DISTORTOS_CHIP_STM32F411) && !defined(DISTORTOS_CHIP_STM32F412) &&
136  // !defined(DISTORTOS_CHIP_STM32F413) && !defined(DISTORTOS_CHIP_STM32F415) &&
137  // !defined(DISTORTOS_CHIP_STM32F417) && !defined(DISTORTOS_CHIP_STM32F423)
138 
139 #ifdef DISTORTOS_CHIP_STANDARD_CLOCK_CONFIGURATION_ENABLE
140 
141 #if (defined(DISTORTOS_CHIP_STM32F427) || defined(DISTORTOS_CHIP_STM32F429) || defined(DISTORTOS_CHIP_STM32F43) || \
142  defined(DISTORTOS_CHIP_STM32F446) || defined(DISTORTOS_CHIP_STM32F469) || \
143  defined(DISTORTOS_CHIP_STM32F479)) && defined(DISTORTOS_CHIP_PWR_OVER_DRIVE_ENABLE)
144 
145 static_assert(DISTORTOS_CHIP_PWR_VOLTAGE_SCALE_MODE == 1, "Over-drive mode requires voltage scale 1 mode!");
146 static_assert(DISTORTOS_CHIP_VDD_MV >= 2100, "Over-drive mode must not be enabled when supply voltage is below 2.1 V!");
147 
149 constexpr uint8_t overDriveIndex {1};
150 
151 #else // !(defined(DISTORTOS_CHIP_STM32F427) || defined(DISTORTOS_CHIP_STM32F429) ||
152  // defined(DISTORTOS_CHIP_STM32F43) || defined(DISTORTOS_CHIP_STM32F446) || defined(DISTORTOS_CHIP_STM32F469) ||
153  // defined(DISTORTOS_CHIP_STM32F479)) || !defined(DISTORTOS_CHIP_PWR_OVER_DRIVE_ENABLE)
154 
156 constexpr uint8_t overDriveIndex {0};
157 
158 #endif // !(defined(DISTORTOS_CHIP_STM32F427) || defined(DISTORTOS_CHIP_STM32F429) ||
159  // defined(DISTORTOS_CHIP_STM32F43) || defined(DISTORTOS_CHIP_STM32F446) || defined(DISTORTOS_CHIP_STM32F469) ||
160  // defined(DISTORTOS_CHIP_STM32F479)) || !defined(DISTORTOS_CHIP_PWR_OVER_DRIVE_ENABLE)
161 
163 constexpr uint8_t voltageScaleIndex {DISTORTOS_CHIP_PWR_VOLTAGE_SCALE_MODE - 1};
164 
167 
170 
173 
174 #ifdef DISTORTOS_CHIP_RCC_PLL_ENABLE
175 
177 #if defined(DISTORTOS_CHIP_RCC_PLLSRC_HSI)
178 constexpr uint32_t pllInFrequency {hsiFrequency};
179 #elif defined(DISTORTOS_CHIP_RCC_PLLSRC_HSE)
180 constexpr uint32_t pllInFrequency {DISTORTOS_CHIP_RCC_HSE_FREQUENCY};
181 #endif
182 
184 constexpr uint32_t vcoInFrequency {pllInFrequency / DISTORTOS_CHIP_RCC_PLLM};
185 
187  "Invalid VCO input frequency!");
188 
190 constexpr uint32_t vcoOutFrequency {vcoInFrequency * DISTORTOS_CHIP_RCC_PLLN};
191 
193  "Invalid VCO output frequency!");
194 
196 constexpr uint32_t pllOutFrequency {vcoOutFrequency / DISTORTOS_CHIP_RCC_PLLP};
197 
198 static_assert(pllOutFrequency <= maxPllOutFrequency, "Invalid PLL output frequency!");
199 
201 constexpr uint32_t pllqOutFrequency {vcoOutFrequency / DISTORTOS_CHIP_RCC_PLLQ};
202 
203 static_assert(pllqOutFrequency <= maxPllqOutFrequency, "Invalid PLL \"/Q\" output frequency!");
204 
205 #if defined(DISTORTOS_CHIP_STM32F412) || defined(DISTORTOS_CHIP_STM32F413) || defined(DISTORTOS_CHIP_STM32F423) || \
206  defined(DISTORTOS_CHIP_STM32F446) || defined(DISTORTOS_CHIP_STM32F469) || defined(DISTORTOS_CHIP_STM32F479)
207 
209 constexpr uint32_t pllrOutFrequency {vcoOutFrequency / DISTORTOS_CHIP_RCC_PLLR};
210 
211 #endif // defined(DISTORTOS_CHIP_STM32F412) || defined(DISTORTOS_CHIP_STM32F413) ||
212  // defined(DISTORTOS_CHIP_STM32F423) || defined(DISTORTOS_CHIP_STM32F446) ||
213  // defined(DISTORTOS_CHIP_STM32F469) || defined(DISTORTOS_CHIP_STM32F479)
214 
215 #endif // def DISTORTOS_CHIP_RCC_PLL_ENABLE
216 
218 #if defined(DISTORTOS_CHIP_RCC_SYSCLK_HSI)
219 constexpr uint32_t sysclkFrequency {hsiFrequency};
220 #elif defined(DISTORTOS_CHIP_RCC_SYSCLK_HSE)
221 constexpr uint32_t sysclkFrequency {DISTORTOS_CHIP_RCC_HSE_FREQUENCY};
222 #elif defined(DISTORTOS_CHIP_RCC_SYSCLK_PLL)
223 constexpr uint32_t sysclkFrequency {pllOutFrequency};
224 #elif defined(DISTORTOS_CHIP_RCC_SYSCLK_PLLR)
225 constexpr uint32_t sysclkFrequency {pllrOutFrequency};
226 #endif // defined(DISTORTOS_CHIP_RCC_SYSCLK_PLLR)
227 
228 #else // !def DISTORTOS_CHIP_STANDARD_CLOCK_CONFIGURATION_ENABLE
229 
231 constexpr uint32_t sysclkFrequency {DISTORTOS_CHIP_RCC_SYSCLK_FREQUENCY};
232 
234 constexpr uint32_t maxApb1Frequency {maxApb1Frequencies[1]};
235 
237 constexpr uint32_t maxApb2Frequency {maxApb2Frequencies[1]};
238 
239 #endif // !def DISTORTOS_CHIP_STANDARD_CLOCK_CONFIGURATION_ENABLE
240 
242 constexpr uint32_t ahbFrequency {sysclkFrequency / DISTORTOS_CHIP_RCC_HPRE};
243 
245 constexpr uint32_t apb1Frequency {ahbFrequency / DISTORTOS_CHIP_RCC_PPRE1};
246 
247 static_assert(apb1Frequency <= maxApb1Frequency, "Invalid APB1 (low speed) frequency!");
248 
250 constexpr uint32_t apb2Frequency {ahbFrequency / DISTORTOS_CHIP_RCC_PPRE2};
251 
252 static_assert(apb2Frequency <= maxApb2Frequency, "Invalid APB2 (high speed) frequency!");
253 
254 } // namespace chip
255 
256 } // namespace distortos
257 
258 #endif // SOURCE_CHIP_STM32_STM32F4_INCLUDE_DISTORTOS_CHIP_CLOCKS_HPP_
constexpr uint32_t minVcoInFrequency
minimum allowed value for VCO input frequency, Hz
Definition: clocks.hpp:33
constexpr uint32_t pllOutFrequency
PLL output frequency, Hz.
Definition: clocks.hpp:196
constexpr uint32_t maxApb1Frequency
maximum allowed APB1 (low speed) frequency, Hz
Definition: clocks.hpp:169
constexpr uint32_t pllqOutFrequency
PLL "Q" output frequency, Hz.
Definition: clocks.hpp:201
constexpr uint32_t maxPllqOutFrequency
maximum allowed value for PLL "Q" output frequency, Hz
Definition: clocks.hpp:95
constexpr uint32_t maxPllOutFrequencies[3][2]
Definition: clocks.hpp:64
constexpr uint32_t vcoOutFrequency
VCO output frequency, Hz.
Definition: clocks.hpp:190
constexpr uint32_t maxPllOutFrequency
maximum allowed value for PLL output frequency, Hz
Definition: clocks.hpp:166
constexpr uint32_t apb1Frequency
APB1 frequency, Hz.
Definition: clocks.hpp:245
constexpr uint32_t apb2Frequency
APB2 frequency, Hz.
Definition: clocks.hpp:250
distortos configuration
constexpr uint32_t vcoInFrequency
VCO input frequency, Hz.
Definition: clocks.hpp:184
constexpr uint32_t maxApb2Frequencies[2]
Definition: clocks.hpp:123
Top-level namespace of distortos project.
Definition: buttons.hpp:33
constexpr uint32_t minVcoOutFrequency
minimum allowed value for VCO output frequency, Hz
Definition: clocks.hpp:42
constexpr uint32_t ahbFrequency
AHB frequency, Hz.
Definition: clocks.hpp:242
constexpr uint32_t hsiFrequency
HSI clock frequency, Hz.
Definition: clocks.hpp:30
constexpr uint32_t maxVcoInFrequency
maximum allowed value for VCO input frequency, Hz
Definition: clocks.hpp:36
constexpr uint32_t maxApb1Frequencies[2]
Definition: clocks.hpp:102
constexpr uint32_t maxVcoOutFrequency
maximum allowed value for VCO output frequency, Hz
Definition: clocks.hpp:46
constexpr uint8_t voltageScaleIndex
voltage scale index for maxPllOutFrequencies array (maxPllOutFrequencies[voltageScaleIndex][overDrive...
Definition: clocks.hpp:163
constexpr uint32_t sysclkFrequency
SYSCLK frequency, Hz.
Definition: clocks.hpp:223
constexpr uint8_t overDriveIndex
over-drive index for maxPllOutFrequencies array (maxPllOutFrequencies[voltageScaleIndex][overDriveInd...
Definition: clocks.hpp:156
constexpr uint32_t maxApb2Frequency
maximum allowed APB2 (high speed) frequency, Hz
Definition: clocks.hpp:172
constexpr uint32_t pllInFrequency
PLL input frequency, Hz.
Definition: clocks.hpp:180