1 /******************************************************************************
2 *Copyright(C)2017, Huada Semiconductor Co.,Ltd All rights reserved.
3 *
4 * This software is owned and published by:
5 * Huada Semiconductor Co.,Ltd("HDSC").
6 *
7 * BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
8 * BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
9 *
10 * This software contains source code for use with HDSC
11 * components. This software is licensed by HDSC to be adapted only
12 * for use in systems utilizing HDSC components. HDSC shall not be
13 * responsible for misuse or illegal use of this software for devices not
14 * supported herein. HDSC is providing this software "AS IS" and will
15 * not be responsible for issues arising from incorrect user implementation
16 * of the software.
17 *
18 * Disclaimer:
19 * HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
20 * REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
21 * ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
22 * WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
23 * WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
24 * WARRANTY OF NONINFRINGEMENT.
25 * HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
26 * NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
27 * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
28 * LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
29 * INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
30 * INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
31 * SAVINGS OR PROFITS,
32 * EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
33 * YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
34 * INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
35 * FROM, THE SOFTWARE.
36 *
37 * This software may be replicated in part or whole for the licensed use,
38 * with the restriction that this Disclaimer and Copyright notice must be
39 * included with each copy of this software, whether used in part or whole,
40 * at all times.
41 */
42
43 /** \file trim.c
44 **
45 ** Common API of trim.
46 ** @link trimGroup Some description @endlink
47 **
48 ** - 2017-05-16
49 **
50 ******************************************************************************/
51
52 /*******************************************************************************
53 * Include files
54 ******************************************************************************/
55 #include "trim.h"
56 /**
57 *******************************************************************************
58 ** \addtogroup TrimGroup
59 ******************************************************************************/
60 //@{
61
62 /*******************************************************************************
63 * Local pre-processor symbols/macros ('#define')
64 ******************************************************************************/
65
66 /*******************************************************************************
67 * Global variable definitions (declared in header file with 'extern')
68 ******************************************************************************/
69 #define IS_VALID_TRIMINT(x) (TrimStop == (x) ||\
70 TrimCalCntOf == (x) ||\
71 TrimXTLFault == (x) ||\
72 TrimXTHFault == (x) ||\
73 TrimPLLFault == (x))
74
75
76 /*******************************************************************************
77 * Local type definitions ('typedef')
78 ******************************************************************************/
79
80 /*******************************************************************************
81 * Local variable definitions ('static')
82 ******************************************************************************/
83
84 /*******************************************************************************
85 * Local function prototypes ('static')
86 ******************************************************************************/
87 static func_ptr_t pfnTrimCallback = NULL;
88
89 /*******************************************************************************
90 * Function implementation - global ('extern') and local ('static')
91 ******************************************************************************/
92 /**
93 *****************************************************************************
94 ** \brief Trim中断标志获取
95 **
96 **
97 ** \param [in] enIntType 中断类型(RefStop、CalCntOf、XTAL32KFault、XTAL32MFault)
98 **
99 ** \retval TRUE or FALSE
100 *****************************************************************************/
Trim_GetIntFlag(en_trim_inttype_t enIntType)101 boolean_t Trim_GetIntFlag(en_trim_inttype_t enIntType)
102 {
103 boolean_t bRetVal = FALSE;
104
105 ASSERT(IS_VALID_TRIMINT(enIntType));
106
107 switch (enIntType)
108 {
109 case TrimStop:
110 bRetVal = M0P_CLK_TRIM->IFR_f.STOP ? TRUE : FALSE;
111 break;
112 case TrimCalCntOf:
113 bRetVal = M0P_CLK_TRIM->IFR_f.CALCNT_OF ? TRUE : FALSE;
114 break;
115 case TrimXTLFault:
116 bRetVal = M0P_CLK_TRIM->IFR_f.XTL_FAULT ? TRUE : FALSE;
117 break;
118 case TrimXTHFault:
119 bRetVal = M0P_CLK_TRIM->IFR_f.XTH_FAULT ? TRUE : FALSE;
120 break;
121 case TrimPLLFault:
122 bRetVal = M0P_CLK_TRIM->IFR_f.PLL_FAULT ? TRUE : FALSE;
123 break;
124 default:
125 bRetVal = FALSE;
126 break;
127 }
128
129 return bRetVal;
130 }
131
132 /**
133 *****************************************************************************
134 ** \brief Trim中断标志清除
135 **
136 **
137 ** \param [in] enIntType 中断类型(RefStop、CalCntOf、XTAL32KFault、XTAL32MFault)
138 **
139 ** \retval Ok or Error
140 *****************************************************************************/
Trim_ClearIntFlag(en_trim_inttype_t enIntType)141 en_result_t Trim_ClearIntFlag(en_trim_inttype_t enIntType)
142 {
143 en_result_t enResult = Error;
144
145 ASSERT(IS_VALID_TRIMINT(enIntType));
146
147 switch (enIntType)
148 {
149 case TrimStop:
150 M0P_CLK_TRIM->CR_f.TRIM_START = FALSE;
151 enResult = Ok;
152 break;
153 case TrimCalCntOf:
154 M0P_CLK_TRIM->CR_f.TRIM_START = FALSE;
155 enResult = Ok;
156 break;
157 case TrimXTLFault:
158 M0P_CLK_TRIM->ICLR_f.XTL_FAULT_CLR = FALSE;
159 enResult = Ok;
160 break;
161 case TrimXTHFault:
162 M0P_CLK_TRIM->ICLR_f.XTH_FAULT_CLR = FALSE;
163 enResult = Ok;
164 break;
165 case TrimPLLFault:
166 M0P_CLK_TRIM->ICLR_f.PLL_FAULT_CLR = FALSE;
167 enResult = Ok;
168 break;
169 default:
170 enResult = Error;
171 break;
172 }
173
174 return enResult;
175 }
176
177 /**
178 *****************************************************************************
179 ** \brief Trim中断服务函数
180 **
181 **
182 ** \param [in] u8Param == 0
183 **
184 ** \retval NULL
185 *****************************************************************************/
ClkTrim_IRQHandler(uint8_t u8Param)186 void ClkTrim_IRQHandler(uint8_t u8Param)
187 {
188 if(NULL != pfnTrimCallback)
189 {
190 pfnTrimCallback();
191 }
192 }
193
194 /**
195 *****************************************************************************
196 ** \brief Trim中断使能
197 **
198 **
199 **
200 ** \retval Ok or Error
201 *****************************************************************************/
Trim_EnableIrq(void)202 en_result_t Trim_EnableIrq (void)
203 {
204 en_result_t enResult = Error;
205
206 M0P_CLK_TRIM->CR_f.IE = TRUE;
207 enResult = Ok;
208
209 return enResult;
210 }
211
212 /**
213 *****************************************************************************
214 ** \brief Trim中断禁止
215 **
216 **
217 **
218 **
219 ** \retval Ok or Error
220 *****************************************************************************/
Trim_DisableIrq(void)221 en_result_t Trim_DisableIrq(void)
222 {
223 en_result_t enResult = Error;
224
225 M0P_CLK_TRIM->CR_f.IE = FALSE;
226 enResult = Ok;
227
228 return enResult;
229 }
230
231 /**
232 *****************************************************************************
233 ** \brief Trim初始化配置
234 **
235 **
236 ** \param [in] pstcConfig Trim配置结构体指针
237 **
238 ** \retval Ok or Error
239 *****************************************************************************/
Trim_Init(stc_trim_config_t * pstcConfig)240 en_result_t Trim_Init(stc_trim_config_t* pstcConfig)
241 {
242 en_result_t enResult = Error;
243
244 M0P_CLK_TRIM->CR_f.MON_EN = pstcConfig->enMON;
245
246 if (TrimCalPLL == pstcConfig->enCALCLK)
247 {
248 M0P_CLK_TRIM->CR_f.CALCLK_SEL2 = TRUE;
249 M0P_CLK_TRIM->CR_f.CALCLK_SEL = pstcConfig->enCALCLK;
250 }
251 else
252 {
253 M0P_CLK_TRIM->CR_f.CALCLK_SEL2 = FALSE;
254 M0P_CLK_TRIM->CR_f.CALCLK_SEL = pstcConfig->enCALCLK;
255 }
256
257 M0P_CLK_TRIM->CR_f.REFCLK_SEL = pstcConfig->enREFCLK;
258
259 M0P_CLK_TRIM->REFCON_f.RCNTVAL = pstcConfig->u32RefCon;
260 if(TrimMonEnable == pstcConfig->enMON)
261 {
262 M0P_CLK_TRIM->CALCON_f.CCNTVAL = pstcConfig->u32CalCon;
263 }
264
265
266 pfnTrimCallback = pstcConfig->pfnTrimCb;
267
268 enResult = Ok;
269
270 return enResult;
271 }
272
273 /**
274 *****************************************************************************
275 ** \brief Trim校准/监测启动运行
276 **
277 **
278 **
279 ** \retval Ok or Error
280 *****************************************************************************/
Trim_Run(void)281 en_result_t Trim_Run(void)
282 {
283 en_result_t enResult = Error;
284
285 M0P_CLK_TRIM->CR_f.TRIM_START = TRUE;
286 enResult = Ok;
287
288 return enResult;
289 }
290
291 /**
292 *****************************************************************************
293 ** \brief Trim校准/监测停止
294 **
295 **
296 **
297 **
298 ** \retval Ok or Error
299 *****************************************************************************/
Trim_Stop(void)300 en_result_t Trim_Stop(void)
301 {
302 en_result_t enResult = Error;
303
304 M0P_CLK_TRIM->CR_f.TRIM_START = FALSE;
305 enResult = Ok;
306
307 return enResult;
308 }
309
310 /**
311 *****************************************************************************
312 ** \brief Trim参考计数器计数值获取
313 **
314 **
315 ** \retval u32Data 参考计数器计数值
316 *****************************************************************************/
Trim_RefCntGet(void)317 uint32_t Trim_RefCntGet(void)
318 {
319 uint32_t u32Data = 0;
320
321 u32Data = M0P_CLK_TRIM->REFCNT_f.REFCNT;
322
323 return u32Data;
324 }
325
326 /**
327 *****************************************************************************
328 ** \brief Trim校准计数器计数值获取
329 **
330 **
331 **
332 **
333 ** \retval u32Data 校准计数器计数值
334 *****************************************************************************/
Trim_CalCntGet(void)335 uint32_t Trim_CalCntGet(void)
336 {
337 uint32_t u32Data = 0;
338
339 u32Data = M0P_CLK_TRIM->CALCNT_f.CALCNT;
340
341 return u32Data;
342 }
343
344 //@} // TrimGroup
345
346 /*******************************************************************************
347 * EOF (not truncated)
348 ******************************************************************************/
349