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 adc.c
44  **
45  ** ADC driver API.
46  **
47  **   - 2017-06-28 Alex    First Version
48  **
49  ******************************************************************************/
50 
51 /******************************************************************************
52  * Include files
53  ******************************************************************************/
54 #include "adc.h"
55 
56 /**
57  ******************************************************************************
58  ** \addtogroup AdcGroup
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 
70 /******************************************************************************
71  * Local type definitions ('typedef')
72  ******************************************************************************/
73 
74 /******************************************************************************
75  * Local function prototypes ('static')
76  ******************************************************************************/
77 
78 /******************************************************************************
79  * Local variable definitions ('static')
80  ******************************************************************************/
81 static stc_adc_irq_calbakfn_pt_t stcAdcIrqCalbaks = {NULL, NULL, NULL, NULL,NULL,NULL};
82 
83 /*****************************************************************************
84  * Function implementation - global ('extern') and local ('static')
85  *****************************************************************************/
86 
87 /**
88  * \brief
89  *          ADC中断服务程序
90  *
91  * \param   [in]  u8Param  未使用
92  *
93  * \retval  无
94  */
95 
Adc_IRQHandler(uint8_t u8Param)96 void Adc_IRQHandler(uint8_t u8Param)
97 {
98     if (TRUE == M0P_ADC->IFR_f.REGIF)
99     {
100         if (NULL != stcAdcIrqCalbaks.pfnAdcRegIrq)
101         {
102             stcAdcIrqCalbaks.pfnAdcRegIrq();
103         }
104         M0P_ADC->ICR_f.REGIC = 0u;
105     }
106 
107     if (TRUE == M0P_ADC->IFR_f.HTIF)
108     {
109         if (NULL != stcAdcIrqCalbaks.pfnAdcHhtIrq)
110         {
111             stcAdcIrqCalbaks.pfnAdcHhtIrq();
112         }
113         M0P_ADC->ICR_f.HTIC = 0u;
114     }
115 
116     if (TRUE == M0P_ADC->IFR_f.LTIF)
117     {
118         if (NULL != stcAdcIrqCalbaks.pfnAdcLltIrq)
119         {
120             stcAdcIrqCalbaks.pfnAdcLltIrq();
121         }
122         M0P_ADC->ICR_f.LTIC = 0u;
123     }
124 
125     if (TRUE == M0P_ADC->IFR_f.SGLIF)
126     {
127         if (NULL != stcAdcIrqCalbaks.pfnAdcIrq)
128         {
129             stcAdcIrqCalbaks.pfnAdcIrq();
130         }
131         M0P_ADC->ICR_f.SGLIC = 0u;
132     }
133     if(TRUE == M0P_ADC->IFR_f.SQRIF)
134     {
135         if (NULL != stcAdcIrqCalbaks.pfnAdcSQRIrq)
136         {
137             stcAdcIrqCalbaks.pfnAdcSQRIrq();
138         }
139         M0P_ADC->ICR_f.SQRIC = 0u;
140     }
141     if(TRUE == M0P_ADC->IFR_f.JQRIF)
142     {
143         if (NULL != stcAdcIrqCalbaks.pfnAdcJQRIrq)
144         {
145             stcAdcIrqCalbaks.pfnAdcJQRIrq();
146         }
147         M0P_ADC->ICR_f.JQRIC = 0u;
148     }
149 }
150 
151 /**
152  * \brief
153  *          配置ADC中断函数入口
154  *
155  * \param   [in]  pstcAdcIrqCfg  ADC中断配置指针
156  * \param   [in]  pstcAdcIrqCalbaks  ADC中断回调函数指针
157  *
158  * \retval  无
159  */
Adc_ConfigIrq(stc_adc_irq_t * pstcAdcIrqCfg,stc_adc_irq_calbakfn_pt_t * pstcAdcIrqCalbaks)160 void Adc_ConfigIrq(stc_adc_irq_t* pstcAdcIrqCfg,
161                    stc_adc_irq_calbakfn_pt_t* pstcAdcIrqCalbaks)
162 {
163     if (TRUE == pstcAdcIrqCfg->bAdcIrq)
164     {
165         if (NULL != pstcAdcIrqCalbaks->pfnAdcIrq)
166         {
167             stcAdcIrqCalbaks.pfnAdcIrq = pstcAdcIrqCalbaks->pfnAdcIrq;
168         }
169     }
170     if (TRUE == pstcAdcIrqCfg->bAdcJQRIrq)
171     {
172         if (NULL != pstcAdcIrqCalbaks->pfnAdcJQRIrq)
173         {
174             stcAdcIrqCalbaks.pfnAdcJQRIrq = pstcAdcIrqCalbaks->pfnAdcJQRIrq;
175         }
176     }
177     if (TRUE == pstcAdcIrqCfg->bAdcSQRIrq)
178     {
179         if (NULL != pstcAdcIrqCalbaks->pfnAdcSQRIrq)
180         {
181             stcAdcIrqCalbaks.pfnAdcSQRIrq = pstcAdcIrqCalbaks->pfnAdcSQRIrq;
182         }
183     }
184     if (TRUE == pstcAdcIrqCfg->bAdcRegCmp)
185     {
186         if (NULL != pstcAdcIrqCalbaks->pfnAdcRegIrq)
187         {
188             stcAdcIrqCalbaks.pfnAdcRegIrq = pstcAdcIrqCalbaks->pfnAdcRegIrq;
189         }
190     }
191 
192     if (TRUE == pstcAdcIrqCfg->bAdcHhtCmp)
193     {
194         if (NULL != pstcAdcIrqCalbaks->pfnAdcHhtIrq)
195         {
196             stcAdcIrqCalbaks.pfnAdcHhtIrq = pstcAdcIrqCalbaks->pfnAdcHhtIrq;
197         }
198     }
199 
200     if (TRUE == pstcAdcIrqCfg->bAdcLltCmp)
201     {
202         if (NULL != pstcAdcIrqCalbaks->pfnAdcLltIrq)
203         {
204             stcAdcIrqCalbaks.pfnAdcLltIrq = pstcAdcIrqCalbaks->pfnAdcLltIrq;
205         }
206     }
207 
208 }
209 
210 /**
211  * \brief
212  *          获取ADC中断状态
213  *
214  * \param   [in]  pstcAdcIrqState  ADC中断状态指针
215  *
216  * \retval  无
217  */
Adc_GetIrqState(stc_adc_irq_t * pstcAdcIrqState)218 void Adc_GetIrqState(stc_adc_irq_t* pstcAdcIrqState)
219 {
220     pstcAdcIrqState->bAdcIrq = M0P_ADC->IFR_f.SGLIF;
221     pstcAdcIrqState->bAdcRegCmp = M0P_ADC->IFR_f.REGIF;
222     pstcAdcIrqState->bAdcHhtCmp = M0P_ADC->IFR_f.HTIF;
223     pstcAdcIrqState->bAdcLltCmp = M0P_ADC->IFR_f.LTIF;
224     pstcAdcIrqState->bAdcJQRIrq = M0P_ADC->IFR_f.JQRIF;
225     pstcAdcIrqState->bAdcSQRIrq = M0P_ADC->IFR_f.SQRIF;
226 }
227 /**
228  * \brief
229  *          清除ADC SGL中断状态
230  *
231  * \param   无
232  *
233  * \retval  无
234  */
Adc_ClrSglIrqState(void)235 void Adc_ClrSglIrqState(void)
236 {
237     M0P_ADC->ICR_f.SGLIC = 0;
238 }
239 /**
240  * \brief
241  *          清除ADC JQR中断状态
242  *
243  * \param   无
244  *
245  * \retval  无
246  */
Adc_ClrJqrIrqState(void)247 void Adc_ClrJqrIrqState(void)
248 {
249     M0P_ADC->ICR_f.JQRIC = 0;
250 }
251 /**
252  * \brief
253  *          清除ADC SQR中断状态
254  *
255  * \param   无
256  *
257  * \retval  无
258  */
Adc_ClrSqrIrqState(void)259 void Adc_ClrSqrIrqState(void)
260 {
261     M0P_ADC->ICR_f.SQRIC = 0;
262 }
263 
264 /**
265  * \brief
266  *          清除ADC REG中断状态
267  *
268  * \param   无
269  *
270  * \retval  无
271  */
Adc_ClrRegIrqState(void)272 void Adc_ClrRegIrqState(void)
273 {
274     M0P_ADC->ICR_f.REGIC = 0;
275 }
276 
277 /**
278  * \brief
279  *          清除ADC HT中断状态
280  *
281  * \param   无
282  *
283  * \retval  无
284  */
Adc_ClrHtIrqState(void)285 void Adc_ClrHtIrqState(void)
286 {
287     M0P_ADC->ICR_f.HTIC = 0;
288 }
289 
290 /**
291  * \brief
292  *          清除ADC LT中断状态
293  *
294  * \param   无
295  *
296  * \retval  无
297  */
Adc_ClrLtIrqState(void)298 void Adc_ClrLtIrqState(void)
299 {
300     M0P_ADC->ICR_f.LTIC = 0;
301 }
302 
303 
304 /**
305  * \brief
306  *          ADC中断使能
307  *
308  * \param   无
309  *
310  * \retval  无
311  */
Adc_EnableIrq(void)312 void Adc_EnableIrq(void)
313 {
314     M0P_ADC->CR0_f.IE = 1u;
315 }
316 
317 /**
318  * \brief
319  *          ADC比较使能(比较中断)
320  *
321  * \param   [in]  pstcAdcIrqCfg  ADC比较配置
322  *
323  * \retval  无
324  */
325 
Adc_ThresholdCfg(stc_adc_threshold_cfg_t * stcAdcThrCfg)326 void Adc_ThresholdCfg(stc_adc_threshold_cfg_t* stcAdcThrCfg)
327 {
328 
329     M0P_ADC->HT_f.HT = stcAdcThrCfg->u32AdcRegHighThd;               //使用比较
330     M0P_ADC->LT_f.LT = stcAdcThrCfg->u32AdcRegLowThd;               //使用比较
331 
332     M0P_ADC->CR1_f.THCH = stcAdcThrCfg->enThCh;         //阈值比较通道选择
333 
334         if (TRUE == stcAdcThrCfg->bAdcRegCmp)
335     {
336         M0P_ADC->CR1_f.REGCMP = 1u;
337     }
338     else
339     {
340         M0P_ADC->CR1_f.REGCMP = 0u;
341     }
342 
343     if (TRUE == stcAdcThrCfg->bAdcHhtCmp)
344     {
345         M0P_ADC->CR1_f.HTCMP = 1u;
346     }
347     else
348     {
349         M0P_ADC->CR1_f.HTCMP = 0u;
350     }
351 
352     if (TRUE ==  stcAdcThrCfg->bAdcLltCmp)
353     {
354         M0P_ADC->CR1_f.LTCMP = 1u;
355     }
356     else
357     {
358         M0P_ADC->CR1_f.LTCMP = 0u;
359     }
360 
361 }
362 
363 /**
364  * \brief
365  *          ADC中断除能
366  *
367  * \param   无
368  *
369  * \retval  无
370  */
Adc_DisableIrq(void)371 void Adc_DisableIrq(void)
372 {
373     uint32_t u32Cr1;
374 
375     M0P_ADC->CR0_f.IE = 0u;
376 
377     u32Cr1 = M0P_ADC->CR1 | (1<<15);    // must write 1 to bit 15 to avoid clear ADC_result_acc
378     u32Cr1 &= ~((1u<<12)|(1u<<13)|(1u<<14));
379     M0P_ADC->CR1 = u32Cr1;
380 }
381 
382 /**
383  * \brief
384  *          ADC初始化
385  *
386  * \param   [in]  pstcAdcConfig  ADC配置指针
387  *
388  * \retval  en_result_t  Ok:  配置成功
389  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
390  */
Adc_Init(stc_adc_cfg_t * pstcAdcConfig)391 en_result_t Adc_Init(stc_adc_cfg_t* pstcAdcConfig)
392 {
393     if (NULL == pstcAdcConfig)
394     {
395         return ErrorInvalidParameter;
396     }
397     M0P_ADC->CR0_f.CLKDIV = pstcAdcConfig->enAdcClkDiv;
398     M0P_ADC->CR0_f.SAM = pstcAdcConfig->enAdcSampTimeSel;
399     M0P_ADC->CR0_f.REF = pstcAdcConfig->enAdcRefVolSel;
400     M0P_ADC->CR0_f.BUF = pstcAdcConfig->bAdcInBufEn;
401     M0P_ADC->CR1_f.REGCMP = 0u;
402     M0P_ADC->CR1_f.HTCMP = 0u;
403     M0P_ADC->CR1_f.LTCMP = 0u;
404 
405     return Ok;
406 }
407 
408 /**
409  * \brief
410  *          ADC外部中断触发源配置
411  *
412  * \param   [in]  pstcAdcConfig  ADC配置指针
413  *
414  * \retval  en_result_t  Ok:  配置成功
415  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
416  */
Adc_ExtTrigCfg(stc_adc_ext_trig_cfg_t * pstcExtTrigConfig)417 en_result_t Adc_ExtTrigCfg(stc_adc_ext_trig_cfg_t* pstcExtTrigConfig)
418 {
419     if (NULL == pstcExtTrigConfig)
420     {
421         return ErrorInvalidParameter;
422     }
423     if(pstcExtTrigConfig->enAdcExtTrigRegSel == AdcExtTrig0)
424     {
425         M0P_ADC->EXTTRIGGER0  |= 1u << pstcExtTrigConfig->enAdcTrig0Sel;
426     }
427     else if(pstcExtTrigConfig->enAdcExtTrigRegSel == AdcExtTrig1)
428     {
429         M0P_ADC->EXTTRIGGER1  |= 1u << pstcExtTrigConfig->enAdcTrig1Sel;
430     }
431     else
432     {
433         return ErrorInvalidParameter;
434     }
435 
436     return Ok;
437 }
438 
439 /**
440  * \brief
441  *          ADC Deinit
442  *
443  * \param   无
444  *
445  * \retval  无
446  */
Adc_DeInit(void)447 void Adc_DeInit(void)
448 {
449 
450     M0P_ADC->CR0_f.EN = 0u;
451 
452     M0P_ADC->CR0_f.IE = 0u;
453     M0P_ADC->CR1_f.REGCMP = 0u;
454     M0P_ADC->CR1_f.HTCMP = 0u;
455     M0P_ADC->CR1_f.LTCMP = 0u;
456 
457     M0P_ADC->ICR_f.SGLIC = 0u;
458     M0P_ADC->ICR_f.LTIC = 0u;
459     M0P_ADC->ICR_f.HTIC = 0u;
460     M0P_ADC->ICR_f.REGIC = 0u;
461     M0P_ADC->ICR_f.SQRIC = 0u;
462     M0P_ADC->ICR_f.JQRIC = 0u;
463 
464     M0P_ADC->CR0_f.CLKDIV = 0u;
465     M0P_ADC->CR0_f.SAM = 0x2u;
466     M0P_ADC->CR0_f.REF = 0x3u;
467     M0P_ADC->CR0_f.SGLMUX = 0xFu;
468     M0P_ADC->CR0_f.BUF = 0u;
469     M0P_ADC->HT_f.HT = 0xFFFu;
470     M0P_ADC->LT_f.LT = 0u;
471 }
472 
473 /**
474  * \brief
475  *          ADC 单次转换开始
476  *
477  * \param   无
478  *
479  * \retval  无
480  */
481 
Adc_SGL_Start(void)482 void Adc_SGL_Start(void)
483 {
484     M0P_ADC->SGLSTART_f.START = 1u;
485 }
486 
487 /**
488  * \brief
489  *          ADC 单次转换停止
490  *
491  * \param   无
492  *
493  * \retval  无
494  */
Adc_SGL_Stop(void)495 void Adc_SGL_Stop(void)
496 {
497     M0P_ADC->SGLSTART_f.START = 0u;
498 }
499 /**
500  * \brief
501  *          ADC 顺序转换开始
502  *
503  * \param   无
504  *
505  * \retval  无
506  */
507 
Adc_SQR_Start(void)508 void Adc_SQR_Start(void)
509 {
510     M0P_ADC->SQRSTART_f.START = 1u;
511 }
512 
513 /**
514  * \brief
515  *          ADC 顺序转换停止
516  *
517  * \param   无
518  *
519  * \retval  无
520  */
Adc_SQR_Stop(void)521 void Adc_SQR_Stop(void)
522 {
523     M0P_ADC->SQRSTART_f.START = 0u;
524 }
525 /**
526  * \brief
527  *          ADC 插队转换开始
528  *
529  * \param   无
530  *
531  * \retval  无
532  */
533 
Adc_JQR_Start(void)534 void Adc_JQR_Start(void)
535 {
536     M0P_ADC->JQRSTART_f.START = 1u;
537 }
538 
539 /**
540  * \brief
541  *          ADC 插队转换停止
542  *
543  * \param   无
544  *
545  * \retval  无
546  */
Adc_JQR_Stop(void)547 void Adc_JQR_Stop(void)
548 {
549     M0P_ADC->JQRSTART_f.START = 0u;
550 }
551 /**
552  * \brief
553  *          ADC使能
554  *
555  * \param   无
556  *
557  * \retval  无
558  */
Adc_Enable(void)559 void Adc_Enable(void)
560 {
561     M0P_ADC->CR0_f.EN = 1u;
562 }
563 
564 /**
565  * \brief
566  *          ADC除能
567  *
568  * \param   无
569  *
570  * \retval  无
571  */
Adc_Disable(void)572 void Adc_Disable(void)
573 {
574     M0P_ADC->CR0_f.EN = 0u;
575 }
576 
577 /**
578  * \brief
579  *          配置单次转换模式
580  *
581  * \param   [in]  pstcAdcConfig   ADC配置指针
582  *
583  * \retval  en_result_t  Ok:  配置成功
584  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
585  */
Adc_ConfigSglMode(stc_adc_cfg_t * pstcAdcConfig)586 en_result_t Adc_ConfigSglMode(stc_adc_cfg_t* pstcAdcConfig)
587 {
588     if (NULL == pstcAdcConfig)
589     {
590         return ErrorInvalidParameter;
591     }
592 
593     M0P_ADC->CR1_f.MODE = pstcAdcConfig->enAdcOpMode;
594 
595     return Ok;
596 }
597 
598 /**
599  * \brief
600  *          配置顺序扫描转换模式
601  *
602  * \param   [in]  pstcAdcConfig   ADC配置指针
603  * \param   [in]  pstcAdcNormCfg  连续转换模式配置指针
604  *
605  * \retval  en_result_t  Ok:  配置成功
606  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
607  */
Adc_ConfigSqrMode(stc_adc_cfg_t * pstcAdcConfig,uint8_t u8AdcSampCnt,boolean_t bAdcResultAccEn)608 en_result_t Adc_ConfigSqrMode(stc_adc_cfg_t* pstcAdcConfig, uint8_t u8AdcSampCnt,boolean_t  bAdcResultAccEn)
609 {
610     if (NULL == pstcAdcConfig)
611     {
612         return ErrorInvalidParameter;
613     }
614 
615     M0P_ADC->CR1_f.MODE = pstcAdcConfig->enAdcOpMode;
616     M0P_ADC->CR1_f.RACCCLR = 0;//ADC转换结果累加寄存器(ADC_ResultAcc)清零
617     M0P_ADC->CR1_f.RACCEN = bAdcResultAccEn;
618     if (bAdcResultAccEn)
619     {
620         M0P_ADC->CR1_f.RACCCLR = 1u;
621     }
622     M0P_ADC->SQR2_f.CNT  = u8AdcSampCnt - 1;
623 
624     return Ok;
625 }
626 
627 /**
628  * \brief
629  *          配置插队扫描转换模式
630  *
631  * \param   [in]  pstcAdcConfig   ADC配置指针
632  * \param   [in]  pstcAdcNormCfg  扫描转换模式配置指针
633  *
634  * \retval  en_result_t  Ok:  配置成功
635  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
636  */
Adc_ConfigJqrMode(stc_adc_cfg_t * pstcAdcConfig,uint8_t u8AdcSampCnt,boolean_t bAdcResultAccEn)637 en_result_t Adc_ConfigJqrMode(stc_adc_cfg_t* pstcAdcConfig, uint8_t u8AdcSampCnt,boolean_t  bAdcResultAccEn)
638 {
639     if (NULL == pstcAdcConfig)
640     {
641         return ErrorInvalidParameter;
642     }
643 
644     M0P_ADC->CR1_f.MODE = pstcAdcConfig->enAdcOpMode;
645     M0P_ADC->CR1_f.RACCEN = bAdcResultAccEn;
646     M0P_ADC->JQR_f.CNT  = u8AdcSampCnt - 1;
647 
648     return Ok;
649 }
650 /**
651  * \brief
652  *          配置单次转换通道
653  *
654  * \param   [in]enstcAdcSampCh 转换通道
655  *
656  * \retval  en_result_t  Ok:  成功
657  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
658  */
Adc_ConfigSglChannel(en_adc_samp_ch_sel_t enstcAdcSampCh)659 en_result_t Adc_ConfigSglChannel( en_adc_samp_ch_sel_t enstcAdcSampCh)
660 {
661 	M0P_ADC->CR0_f.SGLMUX = enstcAdcSampCh;
662 	return Ok;
663 }
664 
665 /**
666  * \brief
667  *          配置顺序扫描转换通道
668  *
669  * \param   [in]enstcAdcSqrChMux 顺序扫描转换通道顺序
670  * \param   [in]enstcAdcSampCh   转换通道
671  *
672  * \retval  en_result_t  Ok:  成功
673  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
674  */
Adc_ConfigSqrChannel(en_adc_sqr_chmux_t enstcAdcSqrChMux,en_adc_samp_ch_sel_t enstcAdcSampCh)675 en_result_t Adc_ConfigSqrChannel(en_adc_sqr_chmux_t enstcAdcSqrChMux, en_adc_samp_ch_sel_t enstcAdcSampCh)
676 {
677     switch(enstcAdcSqrChMux)
678     {
679         case CH0MUX:
680             M0P_ADC->SQR0_f.CH0MUX = enstcAdcSampCh;
681         break;
682         case CH1MUX:
683             M0P_ADC->SQR0_f.CH1MUX = enstcAdcSampCh;
684         break;
685         case CH2MUX:
686             M0P_ADC->SQR0_f.CH2MUX = enstcAdcSampCh;
687         break;
688         case CH3MUX:
689             M0P_ADC->SQR0_f.CH3MUX = enstcAdcSampCh;
690         break;
691         case CH4MUX:
692             M0P_ADC->SQR0_f.CH4MUX = enstcAdcSampCh;
693         break;
694         case CH5MUX:
695             M0P_ADC->SQR0_f.CH5MUX = enstcAdcSampCh;
696         break;
697         case CH6MUX:
698             M0P_ADC->SQR1_f.CH6MUX = enstcAdcSampCh;
699         break;
700         case CH7MUX:
701             M0P_ADC->SQR1_f.CH7MUX = enstcAdcSampCh;
702         break;
703         case CH8MUX:
704             M0P_ADC->SQR1_f.CH8MUX = enstcAdcSampCh;
705         break;
706         case CH9MUX:
707             M0P_ADC->SQR1_f.CH9MUX = enstcAdcSampCh;
708         break;
709         case CH10MUX:
710             M0P_ADC->SQR1_f.CH10MUX = enstcAdcSampCh;
711         break;
712         case CH11MUX:
713             M0P_ADC->SQR1_f.CH11MUX = enstcAdcSampCh;
714         break;
715         case CH12MUX:
716             M0P_ADC->SQR2_f.CH12MUX = enstcAdcSampCh;
717         break;
718         case CH13MUX:
719             M0P_ADC->SQR2_f.CH13MUX = enstcAdcSampCh;
720         break;
721         case CH14MUX:
722             M0P_ADC->SQR2_f.CH14MUX = enstcAdcSampCh;
723         break;
724         case CH15MUX:
725             M0P_ADC->SQR2_f.CH15MUX = enstcAdcSampCh;
726         break;
727         default:
728         break;
729 
730     }
731     return Ok;
732 }
733 /**
734  * \brief
735  *          配置插队扫描转换通道
736  *
737  * \param   [in]enstcAdcSqrChMux 插队扫描转换通道顺序
738  * \param   [in]enstcAdcSampCh   转换通道
739  *
740  * \retval  en_result_t  Ok:  成功
741  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
742  */
Adc_ConfigJqrChannel(en_adc_jqr_chmux_t enstcAdcJqrChMux,en_adc_samp_ch_sel_t enstcAdcSampCh)743 en_result_t Adc_ConfigJqrChannel(en_adc_jqr_chmux_t enstcAdcJqrChMux, en_adc_samp_ch_sel_t enstcAdcSampCh)
744 {
745     switch(enstcAdcJqrChMux)
746     {
747         case CH0MUX:
748             M0P_ADC->JQR_f.CH0MUX = enstcAdcSampCh;
749         break;
750         case CH1MUX:
751             M0P_ADC->JQR_f.CH1MUX = enstcAdcSampCh;
752         break;
753         case CH2MUX:
754             M0P_ADC->JQR_f.CH2MUX = enstcAdcSampCh;
755         break;
756         case CH3MUX:
757             M0P_ADC->JQR_f.CH3MUX = enstcAdcSampCh;
758         break;
759         default:
760         break;
761     }
762     return Ok;
763 }
764 /**
765  * \brief
766  *          配置触发DMA读取控制
767  *
768  * \param   [in]enAdcDmaTrig 触发DMA读取控制
769  *
770  * \retval  en_result_t  Ok:  成功
771  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
772  */
Adc_ConfigDmaTrig(en_adc_dmatrig_t enAdcDmaTrig)773 en_result_t Adc_ConfigDmaTrig(en_adc_dmatrig_t enAdcDmaTrig)
774 {
775   if(enAdcDmaTrig == DmaJqr)
776   {
777       M0P_ADC->CR1_f.DMAJQR = 1;
778   }else
779   {
780       M0P_ADC->CR1_f.DMASQR = 1;
781   }
782   return Ok;
783 }
784 
785 /**
786  * \brief
787  *          查询ADC单次转换状态
788  *
789  * \param   none
790  *
791  * \retval  boolean_t  TRUE:  ADC转换完成
792  * \retval  boolean_t  FALSE: ADC转换中
793  */
Adc_PollSglBusyState(void)794 boolean_t Adc_PollSglBusyState(void)
795 {
796     return M0P_ADC->IFR_f.SGLIF;
797 }
798 
799 
800 /**
801  * \brief
802  *          查询ADC顺序扫描转换状态
803  *
804  * \retval  boolean_t  TRUE:  ADC转换完成
805  * \retval  boolean_t  FALSE: ADC转换中
806  * \param   none
807  *
808  */
Adc_PollSqrBusyState(void)809 boolean_t Adc_PollSqrBusyState(void)
810 {
811     return M0P_ADC->IFR_f.SQRIF;
812 }
813 
814 /**
815  * \brief
816  *          查询ADC插队扫描转换状态
817  *
818  * \param   none
819  *
820  * \retval  boolean_t  TRUE:  ADC转换完成
821  * \retval  boolean_t  FALSE: ADC转换中
822  */
Adc_PollJqrBusyState(void)823 boolean_t Adc_PollJqrBusyState(void)
824 {
825     return M0P_ADC->IFR_f.JQRIF;
826 }
827 
828 /**
829  * \brief
830  *          获取采样值
831  *
832  * \param   [out] pu16AdcResult  采样值指针
833  *
834  * \retval  en_result_t  Ok:  成功
835  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
836  */
Adc_GetSglResult(uint16_t * pu16AdcResult)837 en_result_t Adc_GetSglResult(uint16_t* pu16AdcResult)
838 {
839     if (NULL == pu16AdcResult)
840     {
841         return ErrorInvalidParameter;
842     }
843 
844     *pu16AdcResult = M0P_ADC->RESULT_f.RESULT;
845 
846     return Ok;
847 }
848 
849 /**
850  * \brief
851  *          查询ADC结果比较区间状态
852  *
853  * \retval  boolean_t  TRUE:  ADC转换完成
854  * \retval  boolean_t  FALSE: ADC转换中
855  * \param   none
856  *
857  */
Adc_PollRegBusyState(void)858 boolean_t Adc_PollRegBusyState(void)
859 {
860     return M0P_ADC->IFR_f.REGIF;
861 }
862 /**
863  * \brief
864  *          查询ADC结果比较上阈值状态
865  *
866  * \retval  boolean_t  TRUE:  ADC转换完成
867  * \retval  boolean_t  FALSE: ADC转换中
868  * \param   none
869  *
870  */
Adc_PollHTBusyState(void)871 boolean_t Adc_PollHTBusyState(void)
872 {
873     return M0P_ADC->IFR_f.HTIF;
874 }
875 /**
876  * \brief
877  *          查询ADC结果比较区间状态
878  *
879  * \retval  boolean_t  TRUE:  ADC转换完成
880  * \retval  boolean_t  FALSE: ADC转换中
881  * \param   none
882  *
883  */
Adc_PollLtBusyState(void)884 boolean_t Adc_PollLtBusyState(void)
885 {
886     return M0P_ADC->IFR_f.LTIF;
887 }
888 /**
889  * \brief
890  *          获取采样值
891  *
892  * \param   [out] pu16AdcResult  采样值指针
893  * \param   [in] SQRChannelIndex  顺序扫描通道序号
894  *
895  * \retval  en_result_t  Ok:  成功
896  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
897  */
Adc_GetSqrResult(uint16_t * pu16AdcResult,uint8_t SQRChannelIndex)898 en_result_t Adc_GetSqrResult(uint16_t* pu16AdcResult,uint8_t SQRChannelIndex)
899 {
900     volatile uint32_t *BaseSqrResultAddress =(volatile uint32_t *) &(M0P_ADC->SQRRESULT0);
901 
902     if (NULL == pu16AdcResult)
903     {
904         return ErrorInvalidParameter;
905     }
906 
907     if(SQRChannelIndex > 15)
908     {
909         return ErrorInvalidParameter;
910     }
911 
912     *pu16AdcResult = (uint16_t)(*(BaseSqrResultAddress + SQRChannelIndex));
913 
914     return Ok;
915 }
916 
917 /**
918  * \brief
919  *          获取插队扫描采样值
920  *
921  * \param   [out] pu16AdcResult  采样值指针
922  * \param   [in] JQRChannelIndex  插队扫描通道序号
923  *
924  * \retval  en_result_t  Ok:  成功
925  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
926  */
Adc_GetJqrResult(uint16_t * pu16AdcResult,uint8_t JQRChannelIndex)927 en_result_t Adc_GetJqrResult(uint16_t* pu16AdcResult,uint8_t JQRChannelIndex)
928 {
929 	  volatile uint32_t *BaseJqrResultAddress =(volatile uint32_t *) &(M0P_ADC->JQRRESULT0);
930 	  if (NULL == pu16AdcResult)
931     {
932         return ErrorInvalidParameter;
933     }
934 
935 	  if(JQRChannelIndex > 3)
936 	  {
937 	  	return ErrorInvalidParameter;
938 	  }
939 	  *pu16AdcResult = (uint16_t)(*(BaseJqrResultAddress + JQRChannelIndex));
940 	  return Ok;
941 }
942 /**
943  * \brief
944  *          获取累加采样值
945  *
946  * \param   [out] pu32AdcAccResult  累加采样值指针
947  *
948  * \retval  en_result_t  Ok:  成功
949  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
950  */
Adc_GetAccResult(uint32_t * pu32AdcAccResult)951 en_result_t Adc_GetAccResult(uint32_t* pu32AdcAccResult)
952 {
953     if (NULL == pu32AdcAccResult)
954     {
955         return ErrorInvalidParameter;
956     }
957 
958     *pu32AdcAccResult = M0P_ADC->RESULTACC_f.RESULTACC;
959 
960     return Ok;
961 }
962 
963 /**
964  * \brief
965  *          清零累加采样值
966  *
967  * \param   无
968  *
969  * \retval  无
970  */
Adc_ClrAccResult(void)971 void Adc_ClrAccResult(void)
972 {
973     M0P_ADC->CR1_f.RACCCLR = 0u;
974 }
975 
976 
977 /**
978  * \brief
979  *          设置ADC参考电压
980  *
981  * \param   [in]  enAdcRefVolSel  ADC参考电压
982  *
983  * \retval  en_result_t  Ok:  配置成功
984  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
985  */
Adc_SetVref(en_adc_ref_vol_sel_t enAdcRefVolSel)986 en_result_t Adc_SetVref(en_adc_ref_vol_sel_t enAdcRefVolSel)
987 {
988     if (enAdcRefVolSel > RefVolSelAVDD)
989     {
990         return ErrorInvalidParameter;
991     }
992     if((RefVolSelInBgr1p5 == enAdcRefVolSel) || (RefVolSelInBgr2p5 == enAdcRefVolSel))
993     {
994         M0P_ADC->CR0_f.INREFEN = 1;
995     }else
996     {
997         M0P_ADC->CR0_f.INREFEN = 0;
998     }
999     M0P_ADC->CR0_f.REF = enAdcRefVolSel;
1000     return Ok;
1001 }
1002 /**
1003  * \brief
1004  *          设置ADC结果对齐方式
1005  *
1006  * \param   [in]  enAlign  ADC结果对齐方式
1007  *
1008  * \retval  en_result_t  Ok:  配置成功
1009  * \retval  en_result_t  ErrorInvalidParameter: 无效参数
1010  */
Adc_SetAlign(en_adc_align_t enAlign)1011 en_result_t Adc_SetAlign(en_adc_align_t enAlign)
1012 {
1013   M0P_ADC->CR1_f.ALIGN = enAlign;
1014   return Ok;
1015 }
1016 //@} // AdcGroup
1017 
1018 
1019 /******************************************************************************
1020  * EOF (not truncated)
1021  ******************************************************************************/
1022 
1023