1 /******************************************************************************
2 *
3 * @brief ICS ����ͷ�ļ�.
4 *
5 ******************************************************************************/
6 #ifndef ICS_H_
7 #define ICS_H_
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11
12 #include "common.h"
13 /****************************************************************************!
14 * @brief ʱ��ģʽ��������
15 *
16 ***************************************************************************/
17 enum
18 {
19 ICS_CLK_MODE_FEI = 1, /*!< FEI ģʽ */
20 ICS_CLK_MODE_FEE, /*!< FEE ģʽ */
21 ICS_CLK_MODE_FEE_OSC, /*!< FEE ģʽ OSC���ʱ��Դѡ������EXTAL���ŵ��ⲿʱ��Դ */
22 ICS_CLK_MODE_FBE, /*!< FBE ģʽ */
23 ICS_CLK_MODE_FBE_OSC, /*!< FBE ģʽ OSC���ʱ��Դѡ������EXTAL���ŵ��ⲿʱ��Դ */
24 ICS_CLK_MODE_FBI, /*!< FBI ģʽ */
25 ICS_CLK_MODE_FBILP, /*!< FBILP ģʽ */
26 ICS_CLK_MODE_FBELP, /*!< FBELP ģʽ */
27 };
28
29 /*****************************************************************************//*!
30 *
31 * @brief ��ʱ��ģʽ�ӵ�ǰģʽ�л�����һ��ʱ��ģʽ.
32 *
33 * ʱ��ģʽ��۶�������:
34 * FEI, FBI, FEE, FBE, FBILP, FBELP, FEE_OSC, FBE_OSC
35 * ע��FEE_OSC, FBE_OSC ����������ǰʱ��ģʽ. ��ǰʱ��ģʽ��Ҫ�л�����ʱ��ģʽ������£�
36 * < ��ǰʱ��ģʽ��Ҫ�л�����ʱ��ģʽ>
37 * <FEI,FEE>, <FEI,FBI>, <FEI,FBE>, <FEI,FBE_OSC>, <FEI,FEE_OSC>, <FEE,FEI>,
38 * <FEE,FBI>, <FEE,FBE>, <FBI,FBE>, <FBI,FEE>, <FBI,FBILP>, <FBI,FEI>,
39 * <FBE,FBI>, <FBE,FEE>, <FBE,FEI>, <FBE,FBELP>, <FBELP,FBE>, <FBILP,FBI>.
40 *
41 * @param[in] CurMode ��ǰʱ��ģʽ
42 * @param[in] NewMode Ҫ�л�����ʱ��ģʽ
43 * @param[in] clkFreq �ο�ʱ��Ƶ��
44 *
45 * @return none
46 * @warning FEE_OSC, FBE_OSC ����������ǰʱ��ģʽ.
47 *
48 *****************************************************************************/
49
50 #define ICS_SwitchMode(CurMode, NewMode, clkFreq) CurMode##_to_##NewMode(clkFreq)
51
52
53 /******************************************************************************
54 * ���� OSC ���ýṹ��
55 *
56 *******************************************************************************/
57 typedef struct
58 {
59 uint8_t bRange : 1; /*!< 1: ��Ƶ��Χ, 0: ��Ƶ��Χ */
60 uint8_t bGain : 1; /*!< 1: ������, 0:������ */
61 uint8_t bEnable : 1; /*!< 1: ʹ��OSC, 0: ����OSC */
62 uint8_t bStopEnable : 1; /*!< 1: ֹͣģʽ��OSCʹ��, 0: ֹͣģʽ��OSC���� */
63 uint8_t bIsCryst : 1; /*!< 1: OSC���ѡ������ʱ��, 0: OSC���ѡ������extal���ŵ��ⲿʱ�� */
64 uint8_t bWaitInit : 1; /*!< 1: �ȴ�������ʼ�����, 0: ���ȴ� */
65 } OSC_ConfigType, *OSC_ConfigPtr;
66
67
68
69 /******************************************************************************
70 *
71 * ICS���ýṹ��
72 *
73 *******************************************************************************/
74 typedef struct
75 {
76 uint8_t u8ClkMode; /*!< ѡ��ʱ��ģʽ*/
77 uint8_t bLPEnable; /*!< ����ģʽ��ʹ�� */
78 uint32_t u32ClkFreq; /*!< �ο�ʱ��Ƶ�� */
79 OSC_ConfigType oscConfig; /*!< OSC ���� */
80 } ICS_ConfigType ;
81
82 /*****************************************************************************//*!
83 *
84 * @brief ʹ���ж�.
85 *
86 * @param none
87 *
88 * @return none
89 *
90 * @see ICS_DisableInt
91 *****************************************************************************/
ICS_EnableInt(void)92 __STATIC_INLINE void ICS_EnableInt(void)
93 {
94 ICS->C4 |= (ICS_C4_LOLIE_MASK);
95 }
96
97 /*****************************************************************************//*!
98 *
99 * @brief �����ж�
100 *
101 * @param none
102 *
103 * @return none
104 *
105 * @see ICS_EnableInt
106 *****************************************************************************/
ICS_DisableInt(void)107 __STATIC_INLINE void ICS_DisableInt(void)
108 {
109 ICS->C4 &= ~(ICS_C4_LOLIE_MASK);
110 }
111
112 /*****************************************************************************//*!
113 *
114 * @brief ʹ��ʱ�Ӽ��
115 *
116 * @param none
117 *
118 * @return none
119 *
120 * @see ICS_DisableClockMonitor
121 *****************************************************************************/
ICS_EnableClockMonitor(void)122 __STATIC_INLINE void ICS_EnableClockMonitor(void)
123 {
124 ICS->C4 |= (ICS_C4_CME_MASK);
125 }
126
127 /*****************************************************************************//*!
128 *
129 * @brief ����ʱ�Ӽ��
130 *
131 * @param none
132 *
133 * @return none
134 *
135 * @see ICS_EnableClockMonitor
136 *****************************************************************************/
ICS_DisableClockMonitor(void)137 __STATIC_INLINE void ICS_DisableClockMonitor(void)
138 {
139 ICS->C4 &= ~(ICS_C4_CME_MASK);
140 }
141
142 /*****************************************************************************//*!
143 *
144 * @brief ����ICS���ʱ��Դ��Ƶ
145 *
146 * @param[in] busDivide -- ��Ƶֵ
147 *
148 * @return depends on commands
149 *****************************************************************************/
ICS_SetBusDivider(uint8_t u8BusDivide)150 __STATIC_INLINE void ICS_SetBusDivider(uint8_t u8BusDivide)
151 {
152 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(u8BusDivide);
153 }
154
155
156 /*****************************************************************************//*!
157 *
158 * @brief ʹ��OSC
159 *
160 * @param none
161 *
162 * @return none
163 *
164 *****************************************************************************/
OSC_Enable(void)165 __STATIC_INLINE void OSC_Enable(void)
166 {
167 OSC->CR |= (OSC_CR_OSCEN_MASK);
168 }
169
170 /*****************************************************************************//*!
171 *
172 * @brief ����OSC
173 *
174 * @param none
175 *
176 * @return none
177 *
178 *****************************************************************************/
OSC_Disable(void)179 __STATIC_INLINE void OSC_Disable(void)
180 {
181 OSC->CR &= ~(OSC_CR_OSCEN_MASK);
182 }
183
184 /*****************************************************************************//*!
185 *
186 * @brief ����OSCģ���Ƶ�ʷ�ΧΪ��Ƶ��Χ
187 *
188 * @param none
189 *
190 * @return none
191 *
192 *****************************************************************************/
OSC_SetLowRange(void)193 __STATIC_INLINE void OSC_SetLowRange(void)
194 {
195 OSC->CR &= ~(OSC_CR_RANGE_MASK);
196 }
197
198 /*!***************************************************************************//*!
199 +FUNCTION----------------------------------------------------------------
200 *
201 * @brief ����OSCģ���Ƶ�ʷ�ΧΪ��Ƶ��Χ
202 *
203 * @param none
204 *
205 * @return none
206 *
207 *****************************************************************************/
OSC_SetHighRange(void)208 __STATIC_INLINE void OSC_SetHighRange(void)
209 {
210 OSC->CR |= (OSC_CR_RANGE_MASK);
211 }
212
213
214 /*****************************************************************************//*!
215 *
216 * @brief ����OSC�Ĺ���ģʽΪ������ģʽ
217 *
218 * @param none
219 *
220 * @return none
221 *
222 *****************************************************************************/
OSC_SetHighGain(void)223 __STATIC_INLINE void OSC_SetHighGain(void)
224 {
225 OSC->CR |= (OSC_CR_HGO_MASK);
226 }
227
228 /*****************************************************************************//*!
229 *
230 * @brief ����OSC�Ĺ���ģʽΪ����ģʽ
231 *
232 * @param none
233 *
234 * @return none
235 *
236 *****************************************************************************/
OSC_SetLowGain(void)237 __STATIC_INLINE void OSC_SetLowGain(void)
238 {
239 OSC->CR &= ~(OSC_CR_HGO_MASK);
240 }
241
242 /*****************************************************************************//*!
243 *
244 * @brief ѡ��OSCģ������ʱ��ԴΪ����ʱ��Դ
245 *
246 * @param none
247 *
248 * @return none
249 *
250 *****************************************************************************/
OSC_SelectCrystal(void)251 __STATIC_INLINE void OSC_SelectCrystal(void)
252 {
253 OSC->CR |= (OSC_CR_OSCOS_MASK);
254 }
255
256
257 /*****************************************************************************//*!
258 *
259 * @brief OSC���ѡ������extal���ŵ��ⲿʱ��
260 *
261 * @param none
262 *
263 * @return none
264 *
265 *****************************************************************************/
OSC_SelectClock(void)266 __STATIC_INLINE void OSC_SelectClock(void)
267 {
268 OSC->CR &= ~(OSC_CR_OSCOS_MASK);
269 }
270
271 /*****************************************************************************//*!
272 *
273 * @brief ��ֹͣģʽ��OSCģ��ʹ��
274 *
275 * @param none
276 *
277 * @return none
278 *
279 *****************************************************************************/
OSC_ActiveInStop(void)280 __STATIC_INLINE void OSC_ActiveInStop(void)
281 {
282 OSC->CR |= (OSC_CR_OSCSTEN_MASK);
283 }
284
285 /*****************************************************************************//*!
286 *
287 * @brief ��ֹͣģʽ��OSCģ�����
288 *
289 * @param none
290 *
291 * @return none
292 *
293 *****************************************************************************/
OSC_InactiveInStop(void)294 __STATIC_INLINE void OSC_InactiveInStop(void)
295 {
296 OSC->CR &= ~(OSC_CR_OSCSTEN_MASK);
297 }
298
299 /******************************************************************************/
300
301 void ICS_Init(ICS_ConfigType *pConfig);
302 void ICS_DeInit(void);
303 void ICS_SetClkDivider(uint32_t u32ClkFreqKHz);
304 void ICS_Trim(uint16 u16TrimValue);
305 void OSC_Init(OSC_ConfigType *pConfig);
306 void OSC_DeInit(void);
307
308 /************** �������� ******************/
309 void ICS_DisableClockMonitor(void);
310 void ICS_DisableInt(void);
311 void ICS_EnableClockMonitor(void);
312 void ICS_EnableInt(void);
313 void ICS_SetBusDivider(uint8_t u8BusDivide);
314 void OSC_ActiveInStop(void);
315 void OSC_Enable(void);
316 void OSC_Disable(void);
317 void OSC_InactiveInStop(void);
318 void OSC_SelectClock(void);
319 void OSC_SelectCrystal(void);
320 void OSC_SetHighGain(void);
321 void OSC_SetHighRange(void);
322 void OSC_SetLowGain(void);
323 void OSC_SetLowRange(void);
324
325 /* do not touch the following functions */
326 void FEI_to_FEE(ICS_ConfigType *pConfig);
327 void FEI_to_FBI(ICS_ConfigType *pConfig);
328 void FEI_to_FBE(ICS_ConfigType *pConfig);
329 void FEE_to_FBI(ICS_ConfigType *pConfig);
330 void FEE_to_FEI(ICS_ConfigType *pConfig);
331 void FEE_to_FBE(ICS_ConfigType *pConfig);
332 void FBE_to_FEE(ICS_ConfigType *pConfig);
333 void FBE_to_FEI(ICS_ConfigType *pConfig);
334 void FBE_to_FBI(ICS_ConfigType *pConfig);
335 void FBE_to_FBELP(ICS_ConfigType *pConfig);
336 void FBI_to_FEI(ICS_ConfigType *pConfig);
337 void FBI_to_FBE(ICS_ConfigType *pConfig);
338 void FBI_to_FEE(ICS_ConfigType *pConfig);
339 void FBI_to_FBILP(ICS_ConfigType *pConfig);
340 void FBILP_to_FBI(ICS_ConfigType *pConfig);
341 void FBELP_to_FBE(ICS_ConfigType *pConfig);
342 void FEI_to_FBE_OSC(ICS_ConfigType *pConfig);
343 void FEI_to_FEE_OSC(ICS_ConfigType *pConfig);
344 #ifdef __cplusplus
345 }
346 #endif
347 #endif
348