1 ////////////////////////////////////////////////////////////////////////////////
2 /// @file     hal_rcc.h
3 /// @author   AE TEAM
4 /// @brief    THIS FILE CONTAINS ALL THE FUNCTIONS PROTOTYPES FOR THE RCC
5 ///           FIRMWARE LIBRARY.
6 ////////////////////////////////////////////////////////////////////////////////
7 /// @attention
8 ///
9 /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
10 /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
11 /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
12 /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
13 /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
14 /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
15 ///
16 /// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
17 ////////////////////////////////////////////////////////////////////////////////
18 
19 // Define to prevent recursive inclusion
20 #ifndef __HAL_RCC_H
21 #define __HAL_RCC_H
22 
23 // Files includes
24 #include "types.h"
25 #include "reg_common.h"
26 #include "mm32_reg.h"
27 
28 
29 ////////////////////////////////////////////////////////////////////////////////
30 /// @addtogroup MM32_Hardware_Abstract_Layer
31 /// @{
32 
33 ////////////////////////////////////////////////////////////////////////////////
34 /// @defgroup RCC_HAL
35 /// @brief RCC HAL modules
36 /// @{
37 
38 ////////////////////////////////////////////////////////////////////////////////
39 /// @defgroup RCC_Exported_Types
40 /// @{
41 
42 ////////////////////////////////////////////////////////////////////////////////
43 /// @defgroup RCC_Exported_Constants
44 /// @{
45 
46 
47 /// @}
48 
49 
50 
51 ////////////////////////////////////////////////////////////////////////////////
52 /// @defgroup RCC_Exported_Enumeration
53 /// @{
54 
55 
56 ////////////////////////////////////////////////////////////////////////////////
57 /// @brief HSE configuration
58 ////////////////////////////////////////////////////////////////////////////////
59 typedef enum {
60     RCC_HSE_OFF    = 0,             // HSE OFF
61     RCC_HSE_ON     = RCC_CR_HSEON,  // HSE ON
62     RCC_HSE_Bypass = RCC_CR_HSEBYP  // HSE Bypass
63 } RCCHSE_TypeDef;
64 
65 ////////////////////////////////////////////////////////////////////////////////
66 /// @brief Used for flags
67 ////////////////////////////////////////////////////////////////////////////////
68 typedef enum {
69     CR_REG_INDEX   = 1,     //
70     BDCR_REG_INDEX = 2,     //
71     CSR_REG_INDEX  = 3,     //
72     RCC_FLAG_MASK  = 0x1FU  //
73 } RCC_RegisterFlag_TypeDef;
74 
75 ////////////////////////////////////////////////////////////////////////////////
76 /// @brief RCC Flag
77 ////////////////////////////////////////////////////////////////////////////////
78 typedef enum {
79     // Flags in the CR register
80     RCC_FLAG_HSIRDY = ((u8)((CR_REG_INDEX << 5U) | RCC_CR_HSIRDY_Pos)),         ///< Internal High Speed clock ready flag
81     RCC_FLAG_HSERDY = ((u8)((CR_REG_INDEX << 5U) | RCC_CR_HSERDY_Pos)),         ///< External High Speed clock ready flag
82 
83     RCC_FLAG_PLLRDY = ((u8)((CR_REG_INDEX << 5U) | RCC_CR_PLLRDY_Pos)),         ///< PLL clock ready flag
84 
85     // Flags in the CSR register
86     RCC_FLAG_LSIRDY  = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_LSIRDY_Pos)),      ///< Internal Low Speed oscillator Ready
87     RCC_FLAG_PINRST  = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_PINRSTF_Pos)),     ///< PIN reset flag
88     RCC_FLAG_PORRST  = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_PORRSTF_Pos)),     ///< POR/PDR reset flag
89     RCC_FLAG_SFTRST  = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_SFTRSTF_Pos)),     ///< Software Reset flag
90     RCC_FLAG_IWDGRST = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_IWDGRSTF_Pos)),    ///< Independent Watchdog reset flag
91     RCC_FLAG_WWDGRST = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_WWDGRSTF_Pos)),    ///< Window watchdog reset flag
92 
93     // Flags in the BDCR register
94     RCC_FLAG_LSERDY = ((u8)((BDCR_REG_INDEX << 5U) | RCC_BDCR_LSERDY_Pos))      ///< External Low Speed oscillator Ready
95 } RCC_FLAG_TypeDef;
96 
97 ////////////////////////////////////////////////////////////////////////////////
98 /// @brief System clock source
99 ////////////////////////////////////////////////////////////////////////////////
100 typedef enum {
101     RCC_HSI = 0,  // Set HSI as systemCLOCK
102     RCC_HSE = 1,  // Set HSE as systemCLOCK
103     RCC_PLL = 2,   // Set PLL as systemCLOCK
104     RCC_LSI = 3  // Set LSI as systemCLOCK
105 } SYSCLK_TypeDef;
106 
107 ////////////////////////////////////////////////////////////////////////////////
108 /// @brief PLL entry clock source
109 ////////////////////////////////////////////////////////////////////////////////
110 
111 typedef enum {
112     RCC_HSI_Div4 = 0,
113     RCC_HSI_Div = 0,
114     RCC_HSE_Div1 = RCC_PLLCFGR_PLLSRC,
115     RCC_HSE_Div2 = (RCC_PLLCFGR_PLLXTPRE | RCC_PLLCFGR_PLLSRC),
116 } RCC_PLLSource_TypeDef;
117 
118 ////////////////////////////////////////////////////////////////////////////////
119 /// @brief PLL multiplication factor
120 ////////////////////////////////////////////////////////////////////////////////
121 typedef enum {
122     RCC_PLLMul_2  = 0x00000000U,
123     RCC_PLLMul_3  = 0x00040000U,
124     RCC_PLLMul_4  = 0x00080000U,
125     RCC_PLLMul_5  = 0x000C0000U,
126     RCC_PLLMul_6  = 0x00100000U,
127     RCC_PLLMul_7  = 0x00140000U,
128     RCC_PLLMul_8  = 0x00180000U,
129     RCC_PLLMul_9  = 0x001C0000U,
130     RCC_PLLMul_10 = 0x00200000U,
131     RCC_PLLMul_11 = 0x00240000U,
132     RCC_PLLMul_12 = 0x00280000U,
133     RCC_PLLMul_13 = 0x002C0000U,
134     RCC_PLLMul_14 = 0x00300000U,
135     RCC_PLLMul_15 = 0x00340000U,
136     RCC_PLLMul_16 = 0x00380000U
137 } RCC_PLLMul_TypeDef;
138 
139 ////////////////////////////////////////////////////////////////////////////////
140 /// @brief AHB clock source
141 ////////////////////////////////////////////////////////////////////////////////
142 typedef enum {
143     RCC_SYSCLK_Div1   = RCC_CFGR_HPRE_DIV1,
144     RCC_SYSCLK_Div2   = RCC_CFGR_HPRE_DIV2,
145     RCC_SYSCLK_Div4   = RCC_CFGR_HPRE_DIV4,
146     RCC_SYSCLK_Div8   = RCC_CFGR_HPRE_DIV8,
147     RCC_SYSCLK_Div16  = RCC_CFGR_HPRE_DIV16,
148     RCC_SYSCLK_Div64  = RCC_CFGR_HPRE_DIV64,
149     RCC_SYSCLK_Div128 = RCC_CFGR_HPRE_DIV128,
150     RCC_SYSCLK_Div256 = RCC_CFGR_HPRE_DIV256,
151     RCC_SYSCLK_Div512 = RCC_CFGR_HPRE_DIV512
152 } RCC_AHB_CLK_TypeDef;
153 ////////////////////////////////////////////////////////////////////////////////
154 /// @brief APB1 and APB2clock source
155 ////////////////////////////////////////////////////////////////////////////////
156 typedef enum {
157     RCC_HCLK_Div1  = RCC_CFGR_PPRE1_DIV1,
158     RCC_HCLK_Div2  = RCC_CFGR_PPRE1_DIV2,
159     RCC_HCLK_Div4  = RCC_CFGR_PPRE1_DIV4,
160     RCC_HCLK_Div8  = RCC_CFGR_PPRE1_DIV8,
161     RCC_HCLK_Div16 = RCC_CFGR_PPRE1_DIV16
162 } RCC_APB1_APB2_CLK_TypeDef;
163 ////////////////////////////////////////////////////////////////////////////////
164 /// @brief USB Device clock source
165 ////////////////////////////////////////////////////////////////////////////////
166 typedef enum {
167     RCC_USBCLKSource_PLLCLK_Div1 = 0,
168     RCC_USBCLKSource_PLLCLK_Div2 = 1,
169     RCC_USBCLKSource_PLLCLK_Div3 = 2,
170     RCC_USBCLKSource_PLLCLK_Div4 = 3
171 } RCC_USBCLKSOURCE_TypeDef;
172 
173 ////////////////////////////////////////////////////////////////////////////////
174 /// @brief ADC clock source
175 ////////////////////////////////////////////////////////////////////////////////
176 typedef enum {
177     RCC_PCLK2_Div2 = (0x00000000),
178     RCC_PCLK2_Div4 = (0x00004000),
179     RCC_PCLK2_Div6 = (0x00008000),
180     RCC_PCLK2_Div8 = (0x0000C000)
181 } RCC_ADCCLKSOURCE_TypeDef;
182 
183 ////////////////////////////////////////////////////////////////////////////////
184 /// @brief LSE configuration
185 ////////////////////////////////////////////////////////////////////////////////
186 typedef enum {
187     RCC_LSE_OFF    = 0,               // LSE OFF
188     RCC_LSE_ON     = RCC_BDCR_LSEON,  // LSE ON
189     RCC_LSE_Bypass = RCC_BDCR_LSEBYP  // LSE Bypass
190 } RCC_LSE_TypeDef;
191 
192 ////////////////////////////////////////////////////////////////////////////////
193 /// @brief RTC clock source
194 ////////////////////////////////////////////////////////////////////////////////
195 typedef enum {
196     RCC_RTCCLKSource_LSE        = RCC_BDCR_RTCSEL_LSE,
197     RCC_RTCCLKSource_LSI        = RCC_BDCR_RTCSEL_LSI,
198     RCC_RTCCLKSource_HSE_Div128 = RCC_BDCR_RTCSEL_HSE
199 } RCC_RTCCLKSOURCE_TypeDef;
200 
201 ////////////////////////////////////////////////////////////////////////////////
202 /// @brief Clock source to output on MCO pin
203 ////////////////////////////////////////////////////////////////////////////////
204 typedef enum {
205     RCC_MCO_NoClock = RCC_CFGR_MCO_NOCLOCK,
206     RCC_MCO_LSI     = RCC_CFGR_MCO_LSI,
207     RCC_MCO_LSE = RCC_CFGR_MCO_LSE,
208     RCC_MCO_SYSCLK = RCC_CFGR_MCO_SYSCLK,
209     RCC_MCO_HSI    = RCC_CFGR_MCO_HSI,
210     RCC_MCO_HSE    = RCC_CFGR_MCO_HSE,
211     RCC_MCO_PLLCLK_Div2 = RCC_CFGR_MCO_PLL
212 } RCC_MCO_TypeDef;
213 
214 ////////////////////////////////////////////////////////////////////////////////
215 /// @brief RCC Interrupt source
216 ////////////////////////////////////////////////////////////////////////////////
217 typedef enum {
218     RCC_IT_LSIRDY = RCC_CIR_LSIRDYF,
219     RCC_IT_LSERDY = RCC_CIR_LSERDYF,
220     RCC_IT_HSIRDY = RCC_CIR_HSIRDYF,
221     RCC_IT_HSERDY = RCC_CIR_HSERDYF,
222     RCC_IT_PLLRDY = RCC_CIR_PLLRDYF,
223     RCC_IT_CSS = RCC_CIR_CSSF
224 } RCC_IT_TypeDef;
225 
226 ////////////////////////////////////////////////////////////////////////////////
227 /// @brief RCC clock frequency type definition
228 ////////////////////////////////////////////////////////////////////////////////
229 typedef struct {
230     u32 SYSCLK_Frequency;                                                       ///< returns SYSCLK clock frequency.
231     u32 HCLK_Frequency;                                                         ///< returns hclk clock frequency.
232     u32 PCLK1_Frequency;                                                        ///< returns PCLK1 clock frequency.
233     u32 PCLK2_Frequency;                                                        ///< returns PCLK2 clock frequency.
234     u32 ADCCLK_Frequency;                                                       ///< returns ADCCLK clock frequency.
235 } RCC_ClocksTypeDef;
236 /// @}
237 
238 /// @}
239 
240 
241 ////////////////////////////////////////////////////////////////////////////////
242 /// @defgroup RCC_Exported_Variables
243 /// @{
244 #ifdef _HAL_RCC_C_
245 
246 #define GLOBAL
247 #else
248 #define GLOBAL extern
249 #endif
250 
251 #undef GLOBAL
252 /// @}
253 
254 ////////////////////////////////////////////////////////////////////////////////
255 /// @defgroup RCC_Exported_Functions
256 /// @{
257 void RCC_DeInit(void);
258 void RCC_HSEConfig(RCCHSE_TypeDef state);
259 void RCC_HSICmd(FunctionalState state);
260 void RCC_SYSCLKConfig(SYSCLK_TypeDef sys_clk_src);
261 void RCC_PLLDMDNConfig(u32 plldn, u32 plldm);
262 void RCC_PLLConfig(RCC_PLLSource_TypeDef pll_src, RCC_PLLMul_TypeDef pll_mul);
263 void RCC_PLLCmd(FunctionalState state);
264 void RCC_HCLKConfig(RCC_AHB_CLK_TypeDef sys_clk);
265 void RCC_PCLK1Config(RCC_APB1_APB2_CLK_TypeDef hclk);
266 void RCC_PCLK2Config(RCC_APB1_APB2_CLK_TypeDef hclk);
267 void RCC_USBCLKConfig(RCC_USBCLKSOURCE_TypeDef usb_clk_src);
268 void RCC_ADCCLKConfig(RCC_ADCCLKSOURCE_TypeDef pclk2);
269 void RCC_LSICmd(FunctionalState state);
270 
271 void RCC_RTCCLKCmd(FunctionalState state);
272 void RCC_LSEConfig(RCC_LSE_TypeDef state);
273 void RCC_RTCCLKConfig(RCC_RTCCLKSOURCE_TypeDef rtc_clk_src);
274 void RCC_BackupResetCmd(FunctionalState state);
275 
276 void RCC_GetClocksFreq(RCC_ClocksTypeDef* clk);
277 void RCC_AHBPeriphClockCmd(u32 ahb_periph, FunctionalState state);
278 void RCC_AHB2PeriphClockCmd(u32 ahb_periph, FunctionalState state);
279 void RCC_AHB3PeriphClockCmd(u32 ahb_periph, FunctionalState state);
280 void RCC_AHBPeriphResetCmd(u32 ahb_periph, FunctionalState state);
281 void RCC_AHB2PeriphResetCmd(u32 ahb_periph, FunctionalState state);
282 void RCC_AHB3PeriphResetCmd(u32 ahb_periph, FunctionalState state);
283 void RCC_APB2PeriphClockCmd(u32 apb2_periph, FunctionalState state);
284 void RCC_APB1PeriphClockCmd(u32 apb1_periph, FunctionalState state);
285 void RCC_APB2PeriphResetCmd(u32 apb2_periph, FunctionalState state);
286 void RCC_APB1PeriphResetCmd(u32 apb1_periph, FunctionalState state);
287 
288 void RCC_ClockSecuritySystemCmd(FunctionalState state);
289 void RCC_MCOConfig(RCC_MCO_TypeDef mco_src);
290 void RCC_ClearFlag(void);
291 void RCC_ITConfig(RCC_IT_TypeDef it, FunctionalState state);
292 void RCC_ClearITPendingBit(u8 it);
293 
294 u8  RCC_GetSYSCLKSource(void);
295 u32 RCC_GetSysClockFreq(void);
296 u32 RCC_GetHCLKFreq(void);
297 
298 u32 RCC_GetPCLK1Freq(void);
299 u32 RCC_GetPCLK2Freq(void);
300 FlagStatus  RCC_GetFlagStatus(RCC_FLAG_TypeDef flag);
301 ErrorStatus RCC_WaitForHSEStartUp(void);
302 ErrorStatus RCC_WaitForFlagStartUp(RCC_FLAG_TypeDef flag);
303 ITStatus    RCC_GetITStatus(RCC_IT_TypeDef it);
304 
305 ////////////////////////////////////////////////////////////////////////////////
306 //          Extended function interface
307 ////////////////////////////////////////////////////////////////////////////////
308 //ErrorStatus exRCC_Init(RCCInitStruct_TypeDef* para);
309 void exRCC_SystickDisable(void);
310 void exRCC_SystickEnable(u32 sys_tick_period);
311 void exRCC_APB1PeriphReset(u32 apb1_periph);
312 void exRCC_APB2PeriphReset(u32 apb2_periph);
313 void exRCC_BackupReset(void);
314 void RCC_ADC_ClockCmd(ADC_TypeDef* peripheral, FunctionalState state);
315 void RCC_GPIO_ClockCmd(GPIO_TypeDef* peripheral, FunctionalState state);
316 /// @}
317 
318 /// @}
319 
320 /// @}
321 
322 
323 
324 
325 ////////////////////////////////////////////////////////////////////////////////
326 #endif // __HAL_RCC_H
327 ////////////////////////////////////////////////////////////////////////////////
328 
329 
330