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