1 ////////////////////////////////////////////////////////////////////////////////
2 /// @file     hal_rcc.c
3 /// @author   AE TEAM
4 /// @brief    THIS FILE PROVIDES ALL THE RCC FIRMWARE FUNCTIONS.
5 ////////////////////////////////////////////////////////////////////////////////
6 /// @attention
7 ///
8 /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
9 /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
10 /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
11 /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
12 /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
13 /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
14 ///
15 /// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
16 ////////////////////////////////////////////////////////////////////////////////
17 
18 // Define to prevent recursive inclusion
19 #define _HAL_RCC_C_
20 
21 // Files includes
22 #include "mm32_reg.h"
23 #include "hal_rcc.h"
24 
25 
26 
27 u8 tbPresc[] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
28 
29 ////////////////////////////////////////////////////////////////////////////////
30 /// @addtogroup MM32_Hardware_Abstract_Layer
31 /// @{
32 
33 ////////////////////////////////////////////////////////////////////////////////
34 /// @addtogroup RCC_HAL
35 /// @{
36 
37 ////////////////////////////////////////////////////////////////////////////////
38 /// @addtogroup RCC_Exported_Functions
39 /// @{
40 
41 ////////////////////////////////////////////////////////////////////////////////
42 /// @brief  Resets the RCC clock configuration to default state.
43 /// @param  None.
44 /// @retval None.
45 ////////////////////////////////////////////////////////////////////////////////
RCC_DeInit()46 void RCC_DeInit()
47 {
48     SET_BIT(RCC->CR, RCC_CR_HSION);
49     CLEAR_BIT(RCC->CFGR, RCC_CFGR_SW);
50     CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_CSSON | RCC_CR_PLLON );
51     CLEAR_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLL_DN | RCC_PLLCFGR_PLL_DP);
52     CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);
53     CLEAR_REG(RCC->CFGR);
54     CLEAR_REG(RCC->CIR);
55 }
56 
57 ////////////////////////////////////////////////////////////////////////////////
58 /// @brief  Configures the External High Speed oscillator (HSE).
59 /// @param  state: specifies the new state of HSE.
60 ///         This parameter can be one of the following values:
61 /// @arg    RCC_HSE_OFF: HSE oscillator OFF
62 /// @arg    RCC_HSE_ON: HSE oscillator ON
63 /// @arg    RCC_HSE_Bypass: HSE oscillator bypassed with external clock
64 /// @retval None.
65 ////////////////////////////////////////////////////////////////////////////////
RCC_HSEConfig(RCCHSE_TypeDef state)66 void RCC_HSEConfig(RCCHSE_TypeDef state)
67 {
68     RCC->CR &= ~(RCC_CR_HSEBYP | RCC_CR_HSEON);
69     switch (state) {
70         case RCC_HSE_Bypass:
71             RCC->CR |= RCC_CR_HSEBYP;
72             RCC->CR |= RCC_CR_HSEON;
73             break;
74         case RCC_HSE_ON:
75             RCC->CR |= RCC_CR_HSEON;
76             break;
77         default:
78             break;
79     }
80 }
81 
82 ////////////////////////////////////////////////////////////////////////////////
83 /// @brief  Checks whether the specified RCC flag is set or not.
84 /// @param  flag: specifies the flag to check.
85 ///         This parameter can be one of the following values:
86 /// @arg    RCC_FLAG_HSIRDY: HSI oscillator clock ready
87 /// @arg    RCC_FLAG_HSERDY: HSE oscillator clock ready
88 /// @arg    RCC_FLAG_PLLRDY: PLL clock ready
89 /// @arg    RCC_FLAG_LSERDY: LSE oscillator clock ready
90 /// @arg    RCC_FLAG_LSIRDY: LSI oscillator clock ready
91 /// @arg    RCC_FLAG_PINRST: Pin reset
92 /// @arg    RCC_FLAG_PORRST: POR/PDR reset
93 /// @arg    RCC_FLAG_SFTRST: Software reset
94 /// @arg    RCC_FLAG_IWDGRST: Independent Watchdog reset
95 /// @arg    RCC_FLAG_WWDGRST: Window Watchdog reset
96 /// @arg    RCC_FLAG_LPWRRST: Low Power reset
97 /// @retval The new state of flag (SET or RESET).
98 ////////////////////////////////////////////////////////////////////////////////
RCC_GetFlagStatus(RCC_FLAG_TypeDef flag)99 FlagStatus RCC_GetFlagStatus(RCC_FLAG_TypeDef flag)
100 {
101     return ((((flag >> 5) == CR_REG_INDEX) ? RCC->CR : (((flag >> 5) == BDCR_REG_INDEX) ? RCC->BDCR : RCC->CSR)) &
102             (1 << (flag & 0x1F)))
103            ? SET : RESET;
104 }
105 
106 ////////////////////////////////////////////////////////////////////////////////
107 /// @brief  Waits for HSE start-up.
108 /// @param  None.
109 /// @retval An ErrorStatus enumuration value:
110 ///         - SUCCESS: HSE oscillator is stable and ready to use
111 ///         - ERROR: HSE oscillator not yet ready
112 ////////////////////////////////////////////////////////////////////////////////
RCC_WaitForHSEStartUp(void)113 ErrorStatus RCC_WaitForHSEStartUp(void)
114 {
115     u32 StartUpCounter = 0;
116 
117     FlagStatus HSEStatus;
118 
119     do {
120         HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY);
121         StartUpCounter++;
122     } while ((HSEStatus == RESET) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
123 
124     return (ErrorStatus)(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) ? SUCCESS : ERROR;
125 }
126 
127 ////////////////////////////////////////////////////////////////////////////////
128 /// @brief  Waits for flag start-up.
129 /// @param  flag: specifies the flag to check.
130 ///         This parameter can be one of the following values:
131 /// @arg    RCC_FLAG_HSIRDY: HSI oscillator clock ready
132 /// @arg    RCC_FLAG_HSERDY: HSE oscillator clock ready
133 /// @arg    RCC_FLAG_PLLRDY: PLL clock ready
134 /// @arg    RCC_FLAG_LSERDY: LSE oscillator clock ready
135 /// @arg    RCC_FLAG_LSIRDY: LSI oscillator clock ready
136 /// @arg    RCC_FLAG_PINRST: Pin reset
137 /// @arg    RCC_FLAG_PORRST: POR/PDR reset
138 /// @arg    RCC_FLAG_SFTRST: Software reset
139 /// @arg    RCC_FLAG_IWDGRST: Independent Watchdog reset
140 /// @arg    RCC_FLAG_WWDGRST: Window Watchdog reset
141 /// @retval An ErrorStatus enumuration value:
142 ///         - SUCCESS: HSE oscillator is stable and ready to use
143 ///         - ERROR: HSE oscillator not yet ready
144 ////////////////////////////////////////////////////////////////////////////////
RCC_WaitForFlagStartUp(RCC_FLAG_TypeDef flag)145 ErrorStatus RCC_WaitForFlagStartUp(RCC_FLAG_TypeDef flag)
146 {
147     u32 StartUpCounter = 0;
148 
149     while (RCC_GetFlagStatus(flag) == RESET) {
150         if (StartUpCounter++ > HSE_STARTUP_TIMEOUT) {
151             return ERROR;
152         }
153     }
154     return SUCCESS;
155 }
156 
157 ////////////////////////////////////////////////////////////////////////////////
158 /// @brief  Enables or disables the Internal High Speed oscillator (HSI).
159 /// @param  state: new state of the HSI.
160 ///         This parameter can be: ENABLE or DISABLE.
161 /// @retval None.
162 ////////////////////////////////////////////////////////////////////////////////
RCC_HSICmd(FunctionalState state)163 void RCC_HSICmd(FunctionalState state)
164 {
165     MODIFY_REG(RCC->CR, RCC_CR_HSION, (state << RCC_CR_HSION_Pos));
166 }
167 
168 ////////////////////////////////////////////////////////////////////////////////
169 /// @brief  Configures the system clock (SYSCLK).
170 /// @param  sys_clk_source: specifies the clock source used as system
171 ///         clock. This parameter can be one of the following values:
172 /// @arg    RCC_HSI: specifies HSI as system clock
173 /// @arg    RCC_HSE: specifies HSE as system clock
174 /// @arg    RCC_PLL: specifies PLL as system clock
175 /// @arg    RCC_LSI: specifies LSI as system clock
176 /// @retval None.
177 ////////////////////////////////////////////////////////////////////////////////
RCC_SYSCLKConfig(SYSCLK_TypeDef sys_clk_source)178 void RCC_SYSCLKConfig(SYSCLK_TypeDef sys_clk_source)
179 {
180     MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (sys_clk_source << RCC_CFGR_SW_Pos));
181 }
182 
183 ////////////////////////////////////////////////////////////////////////////////
184 /// @brief  Configures the PLL clock source and DM DN factor.
185 ///         This function must be used only when the PLL is disabled.
186 /// @param  plldn: specifies the PLL multiplication factor.
187 ///         This parameter can be RCC_PLLMul_x where x:[31:26]
188 /// @param  plldm: specifies the PLL Divsior factor.
189 ///         This parameter can be RCC_Divsior_x where x:[22:20]
190 /// @retval None.
191 ////////////////////////////////////////////////////////////////////////////////
RCC_PLLDMDNConfig(u32 plldn,u32 plldm)192 void RCC_PLLDMDNConfig(u32 plldn, u32 plldm)
193 {
194     MODIFY_REG(RCC->PLLCFGR, (RCC_PLLCFGR_PLL_DN | RCC_PLLCFGR_PLL_DP), ((plldn << RCC_PLLCFGR_PLL_DN_Pos) | (plldm << RCC_PLLCFGR_PLL_DP_Pos)));
195 }
196 
197 ////////////////////////////////////////////////////////////////////////////////
198 /// @brief  Enables or disables the PLL.
199 ///   The PLL can not be disabled if it is used as system clock.
200 /// @param  state: new state of the PLL.
201 ///   This parameter can be: ENABLE or DISABLE.
202 /// @retval None.
203 ////////////////////////////////////////////////////////////////////////////////
RCC_PLLCmd(FunctionalState state)204 void RCC_PLLCmd(FunctionalState state)
205 {
206     MODIFY_REG(RCC->CR, RCC_CR_PLLON, (state << RCC_CR_PLLON_Pos));
207 }
208 
209 ////////////////////////////////////////////////////////////////////////////////
210 /// @brief  Configures the PLL clock source and multiplication factor.
211 ///         This function must be used only when the PLL is disabled.
212 /// @param  pll_src: specifies the PLL entry clock source.
213 ///         This parameter can be one of the following values:
214 /// @arg    RCC_HSI_Div4: HSI oscillator clock divided
215 ///         by 4 selected as PLL clock entry
216 /// @arg    RCC_HSE_Div1: HSE oscillator clock selected
217 ///         as PLL clock entry
218 /// @arg    RCC_HSE_Div2: HSE oscillator clock divided
219 ///         by 2 selected as PLL clock entry
220 /// @param  pll_mul: specifies the PLL multiplication factor.
221 ///         This parameter can be RCC_PLLMul_x where x:[31:26][22:20]
222 /// @retval None.
223 ////////////////////////////////////////////////////////////////////////////////
RCC_PLLConfig(RCC_PLLSource_TypeDef pll_src,RCC_PLLMul_TypeDef pll_mul)224 void RCC_PLLConfig(RCC_PLLSource_TypeDef pll_src, RCC_PLLMul_TypeDef pll_mul)
225 {
226     const u8 DNDM_Item[] = {0x07, 0x03, 0x05, 0x01, 0x07, 0x01, 0x09, 0x01,  // Frclk*8/4 ; Frclk*6/2 ; Frclk*8/2 ; Frclk*10/2;
227                             0x0B, 0x01, 0x0D, 0x01, 0x0F, 0x01, 0x11, 0x01,  // Frclk*12/2; Frclk*14/2; Frclk*16/2; Frclk*18/2;
228                             0x13, 0x01, 0x15, 0x01, 0x17, 0x01, 0x19, 0x01,  // Frclk*20/2; Frclk*22/2; Frclk*24/2; Frclk*26/2;
229                             0x1B, 0x01, 0x1D, 0x01, 0x1F, 0x01
230                            };             // Frclk*28/2; Frclk*30/2;    // Frclk*32/2;
231     MODIFY_REG(RCC->PLLCFGR, (RCC_PLLCFGR_PLLXTPRE | RCC_PLLCFGR_PLLSRC), pll_src);
232     RCC_PLLDMDNConfig((u32)DNDM_Item[pll_mul >> 17], (u32)DNDM_Item[(pll_mul >> 17) + 1]);
233 }
234 ////////////////////////////////////////////////////////////////////////////////
235 /// @brief  Configures the USB clock (USBCLK).
236 /// @param  usb_clk_src: specifies the USB clock source.
237 ///         This clock is derived from the PLL output.
238 ///         This parameter can be one of the following values:
239 /// @arg    RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB clock source
240 /// @arg    RCC_USBCLKSource_PLLCLK_Div2: PLL clock divided by 2 selected as USB
241 ///         clock source
242 /// @arg    RCC_USBCLKSource_PLLCLK_Div3: PLL clock divided by 3 selected as USB
243 ///         clock source
244 /// @arg    RCC_USBCLKSource_PLLCLK_Div4: PLL clock divided by 4 selected as USB
245 ///         clock source
246 /// @arg    RCC_USBCLKSource_PLLCLK_Div5: PLL clock divided by 5 selected as USB
247 ///         clock source
248 /// @retval None.
249 ////////////////////////////////////////////////////////////////////////////////
RCC_USBCLKConfig(RCC_USBCLKSOURCE_TypeDef usb_clk_src)250 void RCC_USBCLKConfig(RCC_USBCLKSOURCE_TypeDef usb_clk_src)
251 {
252     MODIFY_REG(RCC->CFGR, RCC_CFGR_USBPRE, (usb_clk_src << RCC_CFGR_USBPRE_Pos));
253 }
254 ////////////////////////////////////////////////////////////////////////////////
255 /// @brief  Returns the clock source used as system clock.
256 /// @param  None.
257 /// @retval The clock source used as system clock. The returned value can
258 ///         be one of the following:
259 ///         - 0x00: HSI/6 used as system clock
260 ///         - 0x04: HSE used as system clock
261 ///         - 0x08: PLL used as system clock
262 ////////////////////////////////////////////////////////////////////////////////
RCC_GetSYSCLKSource(void)263 u8 RCC_GetSYSCLKSource(void)
264 {
265     return ((u8)READ_BIT(RCC->CFGR, RCC_CFGR_SWS));
266 }
267 
268 ////////////////////////////////////////////////////////////////////////////////
269 /// @brief  Configures the AHB clock (hclk).
270 /// @param  sys_clk: defines the AHB clock divider. This clock is derived
271 ///                    from the system clock (SYSCLK).
272 ///         This parameter can be one of the following values:
273 /// @arg    RCC_SYSCLK_Div1: AHB clock = SYSCLK
274 /// @arg    RCC_SYSCLK_Div2: AHB clock = SYSCLK/2
275 /// @arg    RCC_SYSCLK_Div4: AHB clock = SYSCLK/4
276 /// @arg    RCC_SYSCLK_Div8: AHB clock = SYSCLK/8
277 /// @arg    RCC_SYSCLK_Div16: AHB clock = SYSCLK/16
278 /// @arg    RCC_SYSCLK_Div64: AHB clock = SYSCLK/64
279 /// @arg    RCC_SYSCLK_Div128: AHB clock = SYSCLK/128
280 /// @arg    RCC_SYSCLK_Div256: AHB clock = SYSCLK/256
281 /// @arg    RCC_SYSCLK_Div512: AHB clock = SYSCLK/512
282 /// @retval None.
283 ////////////////////////////////////////////////////////////////////////////////
RCC_HCLKConfig(RCC_AHB_CLK_TypeDef sys_clk)284 void RCC_HCLKConfig(RCC_AHB_CLK_TypeDef sys_clk)
285 {
286     MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, sys_clk);
287 }
288 ////////////////////////////////////////////////////////////////////////////////
289 /// @brief  Configures the Low Speed APB clock (pclk1).
290 /// @param  hclk: defines the APB1 clock divider. This clock is derived from
291 ///                  the AHB clock (hclk).
292 ///         This parameter can be one of the following values:
293 /// @arg    RCC_HCLK_Div1: APB1 clock = hclk
294 /// @arg    RCC_HCLK_Div2: APB1 clock = hclk/2
295 /// @arg    RCC_HCLK_Div4: APB1 clock = hclk/4
296 /// @arg    RCC_HCLK_Div8: APB1 clock = hclk/8
297 /// @arg    RCC_HCLK_Div16: APB1 clock = hclk/16
298 /// @retval None.
299 ////////////////////////////////////////////////////////////////////////////////
RCC_PCLK1Config(RCC_APB1_APB2_CLK_TypeDef hclk)300 void RCC_PCLK1Config(RCC_APB1_APB2_CLK_TypeDef hclk)
301 {
302     MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, hclk);
303 }
304 ////////////////////////////////////////////////////////////////////////////////
305 /// @brief  Configures the High Speed APB clock (pclk2).
306 /// @param  hclk: defines the APB2 clock divider. This clock is derived from
307 ///                  the AHB clock (hclk).
308 ///         This parameter can be one of the following values:
309 /// @arg    RCC_HCLK_Div1: APB2 clock = hclk
310 /// @arg    RCC_HCLK_Div2: APB2 clock = hclk/2
311 /// @arg    RCC_HCLK_Div4: APB2 clock = hclk/4
312 /// @arg    RCC_HCLK_Div8: APB2 clock = hclk/8
313 /// @arg    RCC_HCLK_Div16: APB2 clock = hclk/16
314 /// @retval None.
315 ////////////////////////////////////////////////////////////////////////////////
RCC_PCLK2Config(RCC_APB1_APB2_CLK_TypeDef hclk)316 void RCC_PCLK2Config(RCC_APB1_APB2_CLK_TypeDef hclk)
317 {
318     MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (hclk << 3));
319 }
320 
321 ////////////////////////////////////////////////////////////////////////////////
322 /// @brief  Configures the ADC clock (ADCCLK).
323 /// @param  pclk2: defines the ADC clock divider. This clock is derived from
324 ///                   the APB2 clock (pclk2).
325 ///         This parameter can be one of the following values:
326 /// @arg    RCC_PCLK2_Div2: ADC clock = pclk2/2
327 /// @arg    RCC_PCLK2_Div4: ADC clock = pclk2/4
328 /// @arg    RCC_PCLK2_Div6: ADC clock = pclk2/6
329 /// @arg    RCC_PCLK2_Div8: ADC clock = pclk2/8
330 /// @retval None.
331 ////////////////////////////////////////////////////////////////////////////////
RCC_ADCCLKConfig(RCC_ADCCLKSOURCE_TypeDef pclk2)332 void RCC_ADCCLKConfig(RCC_ADCCLKSOURCE_TypeDef pclk2)
333 {
334     MODIFY_REG(RCC->CFGR, ADC_CFGR_PRE, pclk2);
335 }
336 ////////////////////////////////////////////////////////////////////////////////
337 /// @brief  Configures the External Low Speed oscillator (LSE).
338 /// @param  state: specifies the new state of the LSE.
339 ///         This parameter can be one of the following values:
340 /// @arg    RCC_LSE_OFF: LSE oscillator OFF
341 /// @arg    RCC_LSE_ON: LSE oscillator ON
342 /// @arg    RCC_LSE_Bypass: LSE oscillator bypassed with external
343 ///         clock
344 /// @retval None.
345 ////////////////////////////////////////////////////////////////////////////////
RCC_LSEConfig(RCC_LSE_TypeDef state)346 void RCC_LSEConfig(RCC_LSE_TypeDef state)
347 {
348     RCC->BDCR &= ~(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON);
349 
350     switch (state) {
351         case RCC_LSE_Bypass:
352             RCC->BDCR |= RCC_BDCR_LSEBYP;
353             RCC->BDCR |= RCC_BDCR_LSEON;
354             break;
355         case RCC_LSE_ON:
356             RCC->BDCR |= RCC_BDCR_LSEON;
357             break;
358         default:
359             break;
360     }
361 }
362 ////////////////////////////////////////////////////////////////////////////////
363 /// @brief  Configures the RTC clock (RTCCLK).
364 ///         Once the RTC clock is selected it can be changed unless the
365 ///         Backup domain is reset.
366 /// @param  rtc_clk_src: specifies the RTC clock source.
367 ///         This parameter can be one of the following values:
368 /// @arg    RCC_RTCCLKSource_LSE: LSE selected as RTC clock
369 /// @arg    RCC_RTCCLKSource_LSI: LSI selected as RTC clock
370 /// @arg    RCC_RTCCLKSource_HSE_Div128: HSE clock divided by 128
371 ///         selected as RTC clock
372 /// @retval None.
373 ////////////////////////////////////////////////////////////////////////////////
RCC_RTCCLKConfig(RCC_RTCCLKSOURCE_TypeDef rtc_clk_src)374 void RCC_RTCCLKConfig(RCC_RTCCLKSOURCE_TypeDef rtc_clk_src)
375 {
376     MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, rtc_clk_src);
377 }
378 
379 ////////////////////////////////////////////////////////////////////////////////
380 /// @brief  Enables or disables the RTC clock.
381 ///         This function must be used only after the RTC clock was
382 ///         selected using the RCC_RTCCLKConfig function.
383 /// @param  state: new state of the RTC clock.
384 ///         This parameter can be: ENABLE or DISABLE.
385 /// @retval None.
386 ////////////////////////////////////////////////////////////////////////////////
RCC_RTCCLKCmd(FunctionalState state)387 void RCC_RTCCLKCmd(FunctionalState state)
388 {
389     MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCEN, (state << RCC_BDCR_RTCEN_Pos));
390 }
391 
392 ////////////////////////////////////////////////////////////////////////////////
393 /// @brief  Enables or disables the Internal Low Speed oscillator (LSI).
394 ///         LSI can not be disabled if the IWDG is running.
395 /// @param  state: new state of the LSI.
396 ///         This parameter can be: ENABLE or DISABLE.
397 /// @retval None.
398 ////////////////////////////////////////////////////////////////////////////////
RCC_LSICmd(FunctionalState state)399 void RCC_LSICmd(FunctionalState state)
400 {
401 //    u32 j;
402     MODIFY_REG(RCC->CSR, RCC_CSR_LSION | RCC_CSR_LSIOENLV, RCC_CSR_LSIOENLV | (state << RCC_CSR_LSION_Pos));
403 }
404 
405 ////////////////////////////////////////////////////////////////////////////////
406 /// @brief  Returns the clock frequency of different on chip clocks.
407 /// @param  None.
408 /// @retval sys_clk : System clock frequency
409 ////////////////////////////////////////////////////////////////////////////////
RCC_GetSysClockFreq(void)410 u32 RCC_GetSysClockFreq(void)
411 {
412     u32 result;
413     u32 clock, mul, div;
414     switch (RCC->CFGR & RCC_CFGR_SWS) {
415         case RCC_CFGR_SWS_LSI:
416             result = LSI_VALUE;
417             break;
418 
419         case RCC_CFGR_SWS_HSE:
420             result = HSE_VALUE;
421             break;
422 
423         case RCC_CFGR_SWS_PLL:
424             clock = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC) ? (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLXTPRE) ? (HSE_VALUE >> 1) : HSE_VALUE)
425                     : HSI_VALUE_PLL_ON;
426             mul = ((RCC->PLLCFGR & (u32)RCC_PLLCFGR_PLL_DN) >> RCC_PLLCFGR_PLL_DN_Pos) + 1;
427             div = ((RCC->PLLCFGR & RCC_PLLCFGR_PLL_DP) >> RCC_PLLCFGR_PLL_DP_Pos) + 1;
428 
429             result = clock * mul / div;
430             break;
431         default:
432             result =  HSI_VALUE;
433             break;
434     }
435     return result;
436 }
437 
438 ////////////////////////////////////////////////////////////////////////////////
439 /// @brief  Returns the hclk frequency of different on chip clocks.
440 /// @param  None.
441 /// @retval hclk frequency
442 ////////////////////////////////////////////////////////////////////////////////
RCC_GetHCLKFreq(void)443 u32 RCC_GetHCLKFreq(void)
444 {
445     return (RCC_GetSysClockFreq() >> tbPresc[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]);
446 }
447 
448 ////////////////////////////////////////////////////////////////////////////////
449 /// @brief  Returns the pclk1 frequency of different on chip clocks.
450 /// @param  None.
451 /// @retval pclk1 frequency
452 ////////////////////////////////////////////////////////////////////////////////
RCC_GetPCLK1Freq(void)453 u32 RCC_GetPCLK1Freq(void)
454 {
455     return (RCC_GetHCLKFreq() >> tbPresc[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]);
456 }
457 ////////////////////////////////////////////////////////////////////////////////
458 /// @brief  Returns the pclk2 frequency of different on chip clocks.
459 /// @param  None.
460 /// @retval pclk2 frequency
461 ////////////////////////////////////////////////////////////////////////////////
RCC_GetPCLK2Freq(void)462 u32 RCC_GetPCLK2Freq(void)
463 {
464     return (RCC_GetHCLKFreq() >> tbPresc[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]);
465 }
466 ////////////////////////////////////////////////////////////////////////////////
467 /// @brief  Returns the frequency of different on chip clocks.
468 /// @param  clk: pointer to a RCC_ClocksTypeDef structure which
469 ///   will hold the clocks frequency.
470 /// @retval None.
471 ////////////////////////////////////////////////////////////////////////////////
RCC_GetClocksFreq(RCC_ClocksTypeDef * clk)472 void RCC_GetClocksFreq(RCC_ClocksTypeDef* clk)
473 {
474     u8 tbADCPresc[] = {2, 4, 6, 8};
475 
476     clk->SYSCLK_Frequency = RCC_GetSysClockFreq();
477     clk->HCLK_Frequency   = RCC_GetHCLKFreq();
478     clk->PCLK1_Frequency  = RCC_GetPCLK1Freq();
479     clk->PCLK2_Frequency  = RCC_GetPCLK2Freq();
480 
481     clk->ADCCLK_Frequency = clk->PCLK2_Frequency / tbADCPresc[(RCC->CFGR & ADC_CFGR_PRE) >> ADC_CFGR_PRE_Pos];
482 
483 }
484 
485 ////////////////////////////////////////////////////////////////////////////////
486 /// @brief  Enables or disables the AHB peripheral clock.
487 /// @param  ahb_periph: specifies the AHB peripheral to gates its clock.
488 ///   This parameter can be any combination of the following values:
489 /// @param  state: new state of the specified peripheral clock.
490 ///   This parameter can be: ENABLE or DISABLE.
491 /// @retval None.
492 ////////////////////////////////////////////////////////////////////////////////
RCC_AHBPeriphClockCmd(u32 ahb_periph,FunctionalState state)493 void RCC_AHBPeriphClockCmd(u32 ahb_periph, FunctionalState state)
494 {
495     (state) ? (RCC->AHBENR |= ahb_periph) : (RCC->AHBENR &= ~ahb_periph);
496 }
497 /// @param  state: new state of the specified peripheral clock.
498 ///   This parameter can be: ENABLE or DISABLE.
499 /// @retval None.
500 ////////////////////////////////////////////////////////////////////////////////
RCC_AHB2PeriphClockCmd(u32 ahb_periph,FunctionalState state)501 void RCC_AHB2PeriphClockCmd(u32 ahb_periph, FunctionalState state)
502 {
503     (state) ? (RCC->AHB2ENR |= ahb_periph) : (RCC->AHB2ENR &= ~ahb_periph);
504 }
505 /// @param  state: new state of the specified peripheral clock.
506 ///   This parameter can be: ENABLE or DISABLE.
507 /// @retval None.
508 ////////////////////////////////////////////////////////////////////////////////
RCC_AHB3PeriphClockCmd(u32 ahb_periph,FunctionalState state)509 void RCC_AHB3PeriphClockCmd(u32 ahb_periph, FunctionalState state)
510 {
511     (state) ? (RCC->AHB3ENR |= ahb_periph) : (RCC->AHB3ENR &= ~ahb_periph);
512 }
513 ////////////////////////////////////////////////////////////////////////////////
514 /// @brief  Enables or disables the High Speed APB (APB2) peripheral clock.
515 /// @param  apb2_periph: specifies the APB2 peripheral to gates its
516 ///   clock.
517 ///   This parameter can be any combination of the following values:
518 /// @param  state: new state of the specified peripheral clock.
519 ///   This parameter can be: ENABLE or DISABLE.
520 /// @retval None.
521 ////////////////////////////////////////////////////////////////////////////////
RCC_APB2PeriphClockCmd(u32 apb2_periph,FunctionalState state)522 void RCC_APB2PeriphClockCmd(u32 apb2_periph, FunctionalState state)
523 {
524     (state) ? (RCC->APB2ENR |= apb2_periph) : (RCC->APB2ENR &= ~apb2_periph);
525 }
526 ////////////////////////////////////////////////////////////////////////////////
527 /// @brief  Enables or disables the Low Speed APB (APB1) peripheral clock.
528 /// @param  apb1_periph: specifies the APB1 peripheral to gates its
529 ///   clock.
530 ///   This parameter can be any combination of the following values:
531 /// @param  state: new state of the specified peripheral clock.
532 ///   This parameter can be: ENABLE or DISABLE.
533 /// @retval None.
534 ////////////////////////////////////////////////////////////////////////////////
RCC_APB1PeriphClockCmd(u32 apb1_periph,FunctionalState state)535 void RCC_APB1PeriphClockCmd(u32 apb1_periph, FunctionalState state)
536 {
537     (state) ? (RCC->APB1ENR |= apb1_periph) : (RCC->APB1ENR &= ~apb1_periph);
538 }
539 ////////////////////////////////////////////////////////////////////////////////
540 /// @brief  Forces or releases High Speed APB (APB2) peripheral reset.
541 /// @param  apb2_periph: specifies the APB2 peripheral to reset.
542 ///   This parameter can be any combination of the following values:
543 /// @param  state: new state of the specified peripheral reset.
544 ///   This parameter can be: ENABLE or DISABLE.
545 /// @retval None.
546 ////////////////////////////////////////////////////////////////////////////////
RCC_APB2PeriphResetCmd(u32 apb2_periph,FunctionalState state)547 void RCC_APB2PeriphResetCmd(u32 apb2_periph, FunctionalState state)
548 {
549     (state) ? (RCC->APB2RSTR |= apb2_periph) : (RCC->APB2RSTR &= ~apb2_periph);
550 }
551 
552 ////////////////////////////////////////////////////////////////////////////////
553 /// @brief  Forces or releases Low Speed APB (APB1) peripheral reset.
554 /// @param  apb1_periph: specifies the APB1 peripheral to reset.
555 ///   This parameter can be any combination of the following values:
556 /// @param  state: new state of the specified peripheral clock.
557 ///   This parameter can be: ENABLE or DISABLE.
558 /// @retval None.
559 ////////////////////////////////////////////////////////////////////////////////
RCC_APB1PeriphResetCmd(u32 apb1_periph,FunctionalState state)560 void RCC_APB1PeriphResetCmd(u32 apb1_periph, FunctionalState state)
561 {
562     (state) ? (RCC->APB1RSTR |= apb1_periph) : (RCC->APB1RSTR &= ~apb1_periph);
563 }
564 ////////////////////////////////////////////////////////////////////////////////
565 /// @brief  Forces or releases Low Speed AHB peripheral reset.
566 /// @param  ahb_periph: specifies the AHB peripheral to reset.
567 ///   This parameter can be any combination of the following values:
568 /// @param  state: new state of the specified peripheral clock.
569 ///   This parameter can be: ENABLE or DISABLE.
570 /// @retval None.
571 ////////////////////////////////////////////////////////////////////////////////
RCC_AHBPeriphResetCmd(u32 ahb_periph,FunctionalState state)572 void RCC_AHBPeriphResetCmd(u32 ahb_periph, FunctionalState state)
573 {
574     (state) ? (RCC->AHBRSTR |= ahb_periph) : (RCC->AHBRSTR &= ~ahb_periph);
575 }
576 ////////////////////////////////////////////////////////////////////////////////
577 /// @brief  Forces or releases Low Speed AHB2 peripheral reset.
578 /// @param  ahb_periph: specifies the AHB peripheral to reset.
579 ///   This parameter can be any combination of the following values:
580 /// @param  state: new state of the specified peripheral clock.
581 ///   This parameter can be: ENABLE or DISABLE.
582 /// @retval None.
583 ////////////////////////////////////////////////////////////////////////////////
RCC_AHB2PeriphResetCmd(u32 ahb_periph,FunctionalState state)584 void RCC_AHB2PeriphResetCmd(u32 ahb_periph, FunctionalState state)
585 {
586     (state) ? (RCC->AHB2RSTR |= ahb_periph) : (RCC->AHB2RSTR &= ~ahb_periph);
587 }
588 ////////////////////////////////////////////////////////////////////////////////
589 /// @brief  Forces or releases Low Speed AHB2 peripheral reset.
590 /// @param  ahb_periph: specifies the AHB peripheral to reset.
591 ///   This parameter can be any combination of the following values:
592 /// @param  state: new state of the specified peripheral clock.
593 ///   This parameter can be: ENABLE or DISABLE.
594 /// @retval None.
595 ////////////////////////////////////////////////////////////////////////////////
RCC_AHB3PeriphResetCmd(u32 ahb_periph,FunctionalState state)596 void RCC_AHB3PeriphResetCmd(u32 ahb_periph, FunctionalState state)
597 {
598     (state) ? (RCC->AHB3RSTR |= ahb_periph) : (RCC->AHB3RSTR &= ~ahb_periph);
599 }
600 ////////////////////////////////////////////////////////////////////////////////
601 /// @brief  Forces or releases the Backup domain reset.
602 /// @param  state: new state of the Backup domain reset.
603 ///   This parameter can be: ENABLE or DISABLE.
604 /// @retval None.
605 ////////////////////////////////////////////////////////////////////////////////
RCC_BackupResetCmd(FunctionalState state)606 void RCC_BackupResetCmd(FunctionalState state)
607 {
608     MODIFY_REG(RCC->BDCR, RCC_BDCR_BDRST, (state << RCC_BDCR_BDRST_Pos));
609 }
610 
611 ////////////////////////////////////////////////////////////////////////////////
612 /// @brief  Enables or disables the Clock Security System.
613 /// @param  state: new state of the Clock Security System..
614 ///   This parameter can be: ENABLE or DISABLE.
615 /// @retval None.
616 ////////////////////////////////////////////////////////////////////////////////
RCC_ClockSecuritySystemCmd(FunctionalState state)617 void RCC_ClockSecuritySystemCmd(FunctionalState state)
618 {
619     MODIFY_REG(RCC->CR, RCC_CR_CSSON, (state << RCC_CR_CSSON_Pos));
620 }
621 
622 ////////////////////////////////////////////////////////////////////////////////
623 /// @brief  Selects the clock source to output on MCO pin.
624 /// @param  mco_src: specifies the clock source to output.
625 ///   This parameter can be one of the following values:
626 /// @arg RCC_MCO_NoClock: No clock selected
627 /// @arg RCC_MCO_LSI: LSI oscillator clock selected
628 /// @arg RCC_MCO_LSE: LSE oscillator clock selected
629 /// @arg RCC_MCO_SYSCLK: System clock selected
630 /// @arg RCC_MCO_HSI: HSI oscillator clock selected
631 /// @arg RCC_MCO_HSE: HSE oscillator clock selected
632 /// @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected
633 /// @retval None.
634 ////////////////////////////////////////////////////////////////////////////////
RCC_MCOConfig(RCC_MCO_TypeDef mco_src)635 void RCC_MCOConfig(RCC_MCO_TypeDef mco_src)
636 {
637     MODIFY_REG(RCC->CFGR, RCC_CFGR_MCO, mco_src);
638 }
639 
640 ////////////////////////////////////////////////////////////////////////////////
641 /// @brief  Clears the RCC reset flags.
642 ///   The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST,
643 ///   RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST,
644 ///   RCC_FLAG_LPWRRST
645 /// @param  None.
646 /// @retval None.
647 ////////////////////////////////////////////////////////////////////////////////
RCC_ClearFlag(void)648 void RCC_ClearFlag(void)
649 {
650     SET_BIT(RCC->CSR, RCC_CSR_RMVF);
651 }
652 
653 ////////////////////////////////////////////////////////////////////////////////
654 /// @brief  Enables or disables the specified RCC interrupts.
655 /// @param  it: specifies the RCC interrupt sources to be enabled or
656 /// disabled.
657 ///   This parameter can be any combination of the following values:
658 /// @arg RCC_IT_LSIRDY: LSI ready interrupt
659 /// @arg RCC_IT_LSERDY: LSE ready interrupt
660 /// @arg RCC_IT_HSIRDY: HSI ready interrupt
661 /// @arg RCC_IT_HSERDY: HSE ready interrupt
662 /// @arg RCC_IT_PLLRDY: PLL ready interrupt
663 /// @param  state: new state of the specified RCC interrupts.
664 ///   This parameter can be: ENABLE or DISABLE.
665 /// @retval None.
666 ////////////////////////////////////////////////////////////////////////////////
RCC_ITConfig(RCC_IT_TypeDef it,FunctionalState state)667 void RCC_ITConfig(RCC_IT_TypeDef it, FunctionalState state)
668 {
669     (state) ? SET_BIT(RCC->CIR, it << RCC_CIR_LSIRDYIE_Pos) : CLEAR_BIT(RCC->CIR, it << RCC_CIR_LSIRDYIE_Pos);
670 }
671 
672 ////////////////////////////////////////////////////////////////////////////////
673 /// @brief  Checks whether the specified RCC interrupt has occurred or not.
674 /// @param  it: specifies the RCC interrupt source to check.
675 ///   This parameter can be one of the following values:
676 /// @arg RCC_IT_LSIRDY: LSI ready interrupt
677 /// @arg RCC_IT_LSERDY: LSE ready interrupt
678 /// @arg RCC_IT_HSIRDY: HSI ready interrupt
679 /// @arg RCC_IT_HSERDY: HSE ready interrupt
680 /// @arg RCC_IT_PLLRDY: PLL ready interrupt
681 /// @arg RCC_IT_CSS: Clock Security System interrupt
682 /// @retval The new state of it (SET or RESET).
683 ////////////////////////////////////////////////////////////////////////////////
RCC_GetITStatus(RCC_IT_TypeDef it)684 ITStatus RCC_GetITStatus(RCC_IT_TypeDef it)
685 {
686     return (ITStatus)READ_BIT(RCC->CIR, (it << RCC_CIR_LSIRDYF_Pos));
687 }
688 
689 ////////////////////////////////////////////////////////////////////////////////
690 /// @brief  Clears the RCC's interrupt pending bits.
691 /// @param  it: specifies the interrupt pending bit to clear.
692 ///   This parameter can be any combination of the following values:
693 /// @arg RCC_IT_LSIRDY: LSI ready interrupt
694 /// @arg RCC_IT_LSERDY: LSE ready interrupt
695 /// @arg RCC_IT_HSIRDY: HSI ready interrupt
696 /// @arg RCC_IT_HSERDY: HSE ready interrupt
697 /// @arg RCC_IT_PLLRDY: PLL ready interrupt
698 /// @arg RCC_IT_CSS: Clock Security System interrupt
699 /// @retval None.
700 ////////////////////////////////////////////////////////////////////////////////
RCC_ClearITPendingBit(u8 it)701 void RCC_ClearITPendingBit(u8 it)
702 {
703     SET_BIT(RCC->CIR, (it << RCC_CIR_LSIRDYC_Pos));
704 }
705 ////////////////////////////////////////////////////////////////////////////////
706 /// @brief  Forces or releases Low Speed APB (APB1) peripheral reset.
707 /// @param  apb1_periph: specifies the APB1 peripheral to reset.
708 ///   This parameter can be any combination of the following values:
709 /// @retval None.
710 ////////////////////////////////////////////////////////////////////////////////
RCC_APB1PeriphReset(u32 apb1_periph)711 void RCC_APB1PeriphReset(u32 apb1_periph)
712 {
713     RCC->APB1RSTR |= apb1_periph;
714     RCC->APB1RSTR &= ~apb1_periph;
715 }
716 ////////////////////////////////////////////////////////////////////////////////
717 /// @brief  Forces or releases Low Speed APB (APB2) peripheral reset.
718 /// @param  apb2_periph: specifies the APB2 peripheral to reset.
719 ///   This parameter can be any combination of the following values:
720 /// @retval None.
721 ////////////////////////////////////////////////////////////////////////////////
RCC_APB2PeriphReset(u32 apb2_periph)722 void RCC_APB2PeriphReset(u32 apb2_periph)
723 {
724     RCC->APB2RSTR |= apb2_periph;
725     RCC->APB2RSTR &= ~apb2_periph;
726 }
727 ////////////////////////////////////////////////////////////////////////////////
728 /// @brief  Forces or releases High Speed AHB (AHB1) peripheral reset.
729 /// @param  ahb1_periph: specifies the AHB1 peripheral to reset.
730 ///   This parameter can be any combination of the following values:
731 /// @retval None.
732 ////////////////////////////////////////////////////////////////////////////////
RCC_AHBPeriphReset(u32 ahb1_periph)733 void RCC_AHBPeriphReset(u32 ahb1_periph)
734 {
735     RCC->AHBRSTR |= ahb1_periph;
736     RCC->AHBRSTR &= ~ahb1_periph;
737 }
738 ////////////////////////////////////////////////////////////////////////////////
739 //
740 //  New Function Interface
741 //
742 ////////////////////////////////////////////////////////////////////////////////
743 
744 ////////////////////////////////////////////////////////////////////////////////
745 /// @brief  Forces or releases Low Speed APB (APB1) peripheral reset.
746 /// @param  apb1_periph: specifies the APB1 peripheral to reset.
747 ///   This parameter can be any combination of the following values:
748 /// @retval None.
749 ////////////////////////////////////////////////////////////////////////////////
exRCC_APB1PeriphReset(u32 apb1_periph)750 void exRCC_APB1PeriphReset(u32 apb1_periph)
751 {
752     RCC->APB1RSTR |= apb1_periph;
753     RCC->APB1RSTR &= ~apb1_periph;
754 }
755 
756 ////////////////////////////////////////////////////////////////////////////////
757 /// @brief
758 /// @param
759 /// @retval None.
760 ////////////////////////////////////////////////////////////////////////////////
exRCC_BackupReset()761 void exRCC_BackupReset()
762 {
763 }
764 ////////////////////////////////////////////////////////////////////////////////
765 /// @brief  Forces or releases High Speed APB (APB2) peripheral reset.
766 /// @param  apb2_periph: specifies the APB2 peripheral to reset.
767 ///   This parameter can be any combination of the following values:
768 /// @retval None.
769 ////////////////////////////////////////////////////////////////////////////////
exRCC_APB2PeriphReset(u32 apb2_periph)770 void exRCC_APB2PeriphReset(u32 apb2_periph)
771 {
772     RCC->APB2RSTR |= apb2_periph;
773     RCC->APB2RSTR &= ~apb2_periph;
774 }
775 ////////////////////////////////////////////////////////////////////////////////
776 /// @brief  Forces or releases High Speed AHB (AHB1) peripheral reset.
777 /// @param  ahb1_periph: specifies the AHB1 peripheral to reset.
778 ///   This parameter can be any combination of the following values:
779 /// @retval None.
780 ////////////////////////////////////////////////////////////////////////////////
exRCC_AHBPeriphReset(u32 ahb1_periph)781 void exRCC_AHBPeriphReset(u32 ahb1_periph)
782 {
783     RCC->AHBRSTR |= ahb1_periph;
784     RCC->AHBRSTR &= ~ahb1_periph;
785 }
786 ////////////////////////////////////////////////////////////////////////////////
787 /// @brief  Disable systick
788 /// @param  None.
789 /// @retval None.
790 ////////////////////////////////////////////////////////////////////////////////
exRCC_SystickDisable()791 void exRCC_SystickDisable()
792 {
793     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
794 }
795 
796 ////////////////////////////////////////////////////////////////////////////////
797 /// @brief  Enable systick
798 /// @param  None.
799 /// @retval None.
800 ////////////////////////////////////////////////////////////////////////////////
exRCC_SystickEnable(u32 sys_tick_period)801 void exRCC_SystickEnable(u32 sys_tick_period)
802 {
803     SysTick_Config(RCC_GetHCLKFreq() / 1000000 * sys_tick_period);
804 }
805 
806 /*
807 (state) ? (RCC->AHBENR |= ahb_periph) : (RCC->AHBENR &= ~ahb_periph);
808 (state) ? (RCC->APB1ENR |= apb1_periph) : (RCC->APB1ENR &= ~apb1_periph);
809 (state) ? (RCC->APB2ENR |= apb2_periph) : (RCC->APB2ENR &= ~apb2_periph);
810 */
811 
812 ////////////////////////////////////////////////////////////////////////////////
813 /// @brief  Enables or disables the specified ADC peripheral Clock.
814 /// @param  peripheral:select the ADC peripheral.
815 /// @param  state: new state of the ADC peripheral.
816 /// @retval None.
817 ////////////////////////////////////////////////////////////////////////////////
RCC_ADC_ClockCmd(ADC_TypeDef * peripheral,FunctionalState state)818 void RCC_ADC_ClockCmd(ADC_TypeDef* peripheral, FunctionalState state)
819 {
820     switch (*(vu32*)&peripheral) {
821 
822         case ADC1_BASE:
823             (state) ? (RCC->APB2ENR |= RCC_APB2ENR_ADC1) : (RCC->APB2ENR &= ~RCC_APB2ENR_ADC1);
824             break;
825         case ADC2_BASE:
826             (state) ? (RCC->APB2ENR |= RCC_APB2ENR_ADC2) : (RCC->APB2ENR &= ~RCC_APB2ENR_ADC2);
827             break;
828         case ADC3_BASE:
829             (state) ? (RCC->APB2ENR |= RCC_APB2ENR_ADC3) : (RCC->APB2ENR &= ~RCC_APB2ENR_ADC3);
830             break;
831         default:
832             break;
833     }
834 
835 }
836 
837 ////////////////////////////////////////////////////////////////////////////////
838 /// @brief  Enables or disables the specified BKP peripheral Clock.
839 /// @param  peripheral:select the BKP peripheral.
840 /// @param  state: new state of the BKP peripheral.
841 /// @retval None.
842 ////////////////////////////////////////////////////////////////////////////////
RCC_BKP_ClockCmd(BKP_TypeDef * peripheral,FunctionalState state)843 void RCC_BKP_ClockCmd(BKP_TypeDef* peripheral, FunctionalState state)
844 {
845     if(BKP == peripheral) {
846         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_BKP) : (RCC->APB1ENR &= ~RCC_APB1ENR_BKP);
847         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_PWR) : (RCC->APB1ENR &= ~RCC_APB1ENR_PWR);
848     }
849 }
850 
851 ////////////////////////////////////////////////////////////////////////////////
852 /// @brief  Enables or disables the specified CAN peripheral Clock.
853 /// @param  peripheral:select the CAN peripheral.
854 /// @param  state: new state of the CAN peripheral.
855 /// @retval None.
856 ////////////////////////////////////////////////////////////////////////////////
RCC_CAN_ClockCmd(CAN_TypeDef * peripheral,FunctionalState state)857 void RCC_CAN_ClockCmd(CAN_TypeDef* peripheral, FunctionalState state)
858 {
859     if(CAN1 == peripheral) {
860         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_CAN) : (RCC->APB1ENR &= ~RCC_APB1ENR_CAN);
861     }
862 }
863 
864 
865 ////////////////////////////////////////////////////////////////////////////////
866 /// @brief  Enables or disables the specified COMP peripheral Clock.
867 /// @param  peripheral:select the COMP peripheral.
868 /// @param  state: new state of the COMP peripheral.
869 /// @retval None.
870 ////////////////////////////////////////////////////////////////////////////////
RCC_COMP_ClockCmd(COMP_TypeDef * peripheral,FunctionalState state)871 void RCC_COMP_ClockCmd(COMP_TypeDef* peripheral, FunctionalState state)
872 {
873     if(COMP == peripheral) {
874         (state) ? (RCC->APB2ENR |= RCC_APB2ENR_COMP) : (RCC->APB2ENR &= ~RCC_APB2ENR_COMP);
875     }
876 }
877 ////////////////////////////////////////////////////////////////////////////////
878 /// @brief  Enables or disables the specified CRC peripheral Clock.
879 /// @param  peripheral:select the CRC peripheral.
880 /// @param  state: new state of the CRC peripheral.
881 /// @retval None.
882 ////////////////////////////////////////////////////////////////////////////////
RCC_CRC_ClockCmd(CRC_TypeDef * peripheral,FunctionalState state)883 void RCC_CRC_ClockCmd(CRC_TypeDef* peripheral, FunctionalState state)
884 {
885     if(CRC == peripheral) {
886         (state) ? (RCC->AHBENR |= RCC_AHBENR_CRC) : (RCC->AHBENR &= ~RCC_AHBENR_CRC);
887     }
888 }
889 ////////////////////////////////////////////////////////////////////////////////
890 /// @brief  Enables or disables the specified DAC peripheral Clock.
891 /// @param  peripheral:select the DAC peripheral.
892 /// @param  state: new state of the DAC peripheral.
893 /// @retval None.
894 ////////////////////////////////////////////////////////////////////////////////
RCC_DAC_ClockCmd(DAC_TypeDef * peripheral,FunctionalState state)895 void RCC_DAC_ClockCmd(DAC_TypeDef* peripheral, FunctionalState state)
896 {
897     if(DAC == peripheral) {
898         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_DAC) : (RCC->APB1ENR &= ~RCC_APB1ENR_DAC);
899     }
900 }
901 ////////////////////////////////////////////////////////////////////////////////
902 /// @brief  Enables or disables the specified DMA peripheral Clock.
903 /// @param  peripheral:select the DMA peripheral.
904 /// @param  state: new state of the DMA peripheral.
905 /// @retval None.
906 ////////////////////////////////////////////////////////////////////////////////
RCC_DMA_ClockCmd(DMA_TypeDef * peripheral,FunctionalState state)907 void RCC_DMA_ClockCmd(DMA_TypeDef* peripheral, FunctionalState state)
908 {
909     if(DMA1 == peripheral) {
910         (state) ? (RCC->AHBENR |= RCC_AHBENR_DMA1) : (RCC->AHBENR &= ~RCC_AHBENR_DMA1);
911     }
912     if(DMA2 == peripheral) {
913         (state) ? (RCC->AHBENR |= RCC_AHBENR_DMA2) : (RCC->AHBENR &= ~RCC_AHBENR_DMA2);
914     }
915 }
916 
917 
918 
919 ////////////////////////////////////////////////////////////////////////////////
920 /// @brief  Enables or disables the specified GPIO peripheral Clock.
921 /// @param  peripheral:select the GPIO peripheral.
922 /// @param  state: new state of the GPIO peripheral.
923 /// @retval None.
924 ////////////////////////////////////////////////////////////////////////////////
RCC_GPIO_ClockCmd(GPIO_TypeDef * peripheral,FunctionalState state)925 void RCC_GPIO_ClockCmd(GPIO_TypeDef* peripheral, FunctionalState state)
926 {
927     switch (*(vu32*)&peripheral) {
928         case (u32)GPIOA:
929             (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOA) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOA);
930             break;
931         case (u32)GPIOB:
932             (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOB) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOB);
933             break;
934         case (u32)GPIOC:
935             (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOC) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOC);
936             break;
937         case (u32)GPIOD:
938             (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOD) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOD);
939             break;
940         case (u32)GPIOE:
941             (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOE) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOE);
942             break;
943         case (u32)GPIOF:
944             (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOF) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOF);
945             break;
946         case (u32)GPIOG:
947             (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOG) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOG);
948             break;
949         case (u32)GPIOH:
950             (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOH) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOH);
951             break;
952         default:
953             break;
954     }
955 }
956 
957 
958 ////////////////////////////////////////////////////////////////////////////////
959 /// @brief  Deinitializes the uart peripheral registers to their
960 ///         default reset values.
961 /// @param  peripheral: Select the UART or the UART peripheral.
962 /// @retval None.
963 ////////////////////////////////////////////////////////////////////////////////
RCC_UART_ClockCmd(UART_TypeDef * peripheral,FunctionalState state)964 void RCC_UART_ClockCmd(UART_TypeDef* peripheral, FunctionalState state)
965 {
966     if(UART2 == peripheral) {
967         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART2) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART2);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART2);
968     }
969     if(UART1 == peripheral) {
970         (state) ? (RCC->APB2ENR |= RCC_APB2ENR_UART1) : (RCC->APB2ENR &= ~RCC_APB2ENR_UART1);//exRCC_APB2PeriphReset(RCC_APB2ENR_UART1);
971     }
972     if(UART3 == peripheral) {
973         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART3) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART3);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART3);
974     }
975     if(UART4 == peripheral) {
976         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART4) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART4);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART4);
977     }
978     if(UART5 == peripheral) {
979         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART5) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART5);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART5);
980     }
981     if(UART6 == peripheral) {
982         (state) ? (RCC->APB2ENR |= RCC_APB2ENR_UART6) : (RCC->APB2ENR &= ~RCC_APB2ENR_UART6);//exRCC_APB2PeriphReset(RCC_APB2ENR_UART6);
983     }
984     if(UART7 == peripheral) {
985         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART7) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART7);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART7);
986     }
987     if(UART8 == peripheral) {
988         (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART8) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART8);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART8);
989     }
990 }
991 /// @}
992 
993 /// @}
994 
995 /// @}
996