]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Nuvoton_Code/StdDriver/src/eadc.c
Add Cortex M23 GCC and IAR ports. Add demo projects for Nuvoton NuMaker-PFM-2351.
[freertos] / FreeRTOS / Demo / CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC / Nuvoton_Code / StdDriver / src / eadc.c
1 /**************************************************************************//**\r
2  * @file     eadc.c\r
3  * @version  V2.00\r
4  * @brief    M2351 series EADC driver source file\r
5  *\r
6  * @note\r
7  * Copyright (C) 2017 Nuvoton Technology Corp. All rights reserved.\r
8 *****************************************************************************/\r
9 #include "NuMicro.h"\r
10 \r
11 /** @addtogroup Standard_Driver Standard Driver\r
12   @{\r
13 */\r
14 \r
15 /** @addtogroup EADC_Driver EADC Driver\r
16   @{\r
17 */\r
18 \r
19 /** @addtogroup EADC_EXPORTED_FUNCTIONS EADC Exported Functions\r
20   @{\r
21 */\r
22 \r
23 /**\r
24   * @brief This function make EADC_module be ready to convert.\r
25   * @param[in] eadc The pointer of the specified EADC module.\r
26   * @param[in] u32InputMode Decides the input mode.\r
27   *                       - \ref EADC_CTL_DIFFEN_SINGLE_END      :Single end input mode.\r
28   *                       - \ref EADC_CTL_DIFFEN_DIFFERENTIAL    :Differential input type.\r
29   * @return None\r
30   * @details This function is used to set analog input mode and enable A/D Converter.\r
31   *         Before starting A/D conversion function, ADCEN bit (EADC_CTL[0]) should be set to 1.\r
32   * @note\r
33   */\r
34 void EADC_Open(EADC_T *eadc, uint32_t u32InputMode)\r
35 {\r
36     eadc->CTL &= (~(EADC_CTL_DIFFEN_Msk));\r
37 \r
38     eadc->CTL |= (u32InputMode | EADC_CTL_ADCEN_Msk);\r
39 \r
40     while(!(eadc->PWRM & EADC_PWRM_PWUPRDY_Msk)) {}\r
41 }\r
42 \r
43 /**\r
44   * @brief Disable EADC_module.\r
45   * @param[in] eadc The pointer of the specified EADC module.\r
46   * @return None\r
47   * @details Clear ADCEN bit (EADC_CTL[0]) to disable A/D converter analog circuit power consumption.\r
48   */\r
49 void EADC_Close(EADC_T *eadc)\r
50 {\r
51     eadc->CTL &= ~EADC_CTL_ADCEN_Msk;\r
52 }\r
53 \r
54 /**\r
55   * @brief Configure the sample control logic module.\r
56   * @param[in] eadc The pointer of the specified EADC module.\r
57   * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 15.\r
58   * @param[in] u32TriggerSrc Decides the trigger source. Valid values are:\r
59   *                            - \ref EADC_SOFTWARE_TRIGGER              : Disable trigger\r
60   *                            - \ref EADC_FALLING_EDGE_TRIGGER          : STADC pin falling edge trigger\r
61   *                            - \ref EADC_RISING_EDGE_TRIGGER           : STADC pin rising edge trigger\r
62   *                            - \ref EADC_FALLING_RISING_EDGE_TRIGGER   : STADC pin both falling and rising edge trigger\r
63   *                            - \ref EADC_ADINT0_TRIGGER                : ADC ADINT0 interrupt EOC pulse trigger\r
64   *                            - \ref EADC_ADINT1_TRIGGER                : ADC ADINT1 interrupt EOC pulse trigger\r
65   *                            - \ref EADC_TIMER0_TRIGGER                : Timer0 overflow pulse trigger\r
66   *                            - \ref EADC_TIMER1_TRIGGER                : Timer1 overflow pulse trigger\r
67   *                            - \ref EADC_TIMER2_TRIGGER                : Timer2 overflow pulse trigger\r
68   *                            - \ref EADC_TIMER3_TRIGGER                : Timer3 overflow pulse trigger\r
69   *                            - \ref EADC_PWM0TG0_TRIGGER               : EPWM0TG0 trigger\r
70   *                            - \ref EADC_PWM0TG1_TRIGGER               : EPWM0TG1 trigger\r
71   *                            - \ref EADC_PWM0TG2_TRIGGER               : EPWM0TG2 trigger\r
72   *                            - \ref EADC_PWM0TG3_TRIGGER               : EPWM0TG3 trigger\r
73   *                            - \ref EADC_PWM0TG4_TRIGGER               : EPWM0TG4 trigger\r
74   *                            - \ref EADC_PWM0TG5_TRIGGER               : EPWM0TG5 trigger\r
75   *                            - \ref EADC_PWM1TG0_TRIGGER               : EPWM1TG0 trigger\r
76   *                            - \ref EADC_PWM1TG1_TRIGGER               : EPWM1TG1 trigger\r
77   *                            - \ref EADC_PWM1TG2_TRIGGER               : EPWM1TG2 trigger\r
78   *                            - \ref EADC_PWM1TG3_TRIGGER               : EPWM1TG3 trigger\r
79   *                            - \ref EADC_PWM1TG4_TRIGGER               : EPWM1TG4 trigger\r
80   *                            - \ref EADC_PWM1TG5_TRIGGER               : EPWM1TG5 trigger\r
81   *                            - \ref EADC_BPWM0TG_TRIGGER               : BPWM0TG trigger\r
82   *                            - \ref EADC_BPWM1TG_TRIGGER               : BPWM1TG trigger\r
83   * @param[in] u32Channel Specifies the sample module channel, valid value are from 0 to 15.\r
84   * @return None\r
85   * @details Each of ADC control logic modules 0~15 which is configurable for ADC converter channel EADC_CH0~15 and trigger source.\r
86   *         sample module 16~18 is fixed for ADC channel 16, 17, 18 input sources as band-gap voltage, temperature sensor, and battery power (VBAT).\r
87   */\r
88 void EADC_ConfigSampleModule(EADC_T *eadc, \\r
89                              uint32_t u32ModuleNum, \\r
90                              uint32_t u32TriggerSrc, \\r
91                              uint32_t u32Channel)\r
92 {\r
93     eadc->SCTL[u32ModuleNum] &= ~(EADC_SCTL_EXTFEN_Msk | EADC_SCTL_EXTREN_Msk | EADC_SCTL_TRGSEL_Msk | EADC_SCTL_CHSEL_Msk);\r
94     eadc->SCTL[u32ModuleNum] |= (u32TriggerSrc | u32Channel);\r
95 }\r
96 \r
97 \r
98 /**\r
99   * @brief Set trigger delay time.\r
100   * @param[in] eadc The pointer of the specified EADC module.\r
101   * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 15.\r
102   * @param[in] u32TriggerDelayTime Decides the trigger delay time, valid range are between 0~0xFF.\r
103   * @param[in] u32DelayClockDivider Decides the trigger delay clock divider. Valid values are:\r
104     *                                - \ref EADC_SCTL_TRGDLYDIV_DIVIDER_1    : Trigger delay clock frequency is ADC_CLK/1\r
105     *                                - \ref EADC_SCTL_TRGDLYDIV_DIVIDER_2    : Trigger delay clock frequency is ADC_CLK/2\r
106     *                                - \ref EADC_SCTL_TRGDLYDIV_DIVIDER_4    : Trigger delay clock frequency is ADC_CLK/4\r
107     *                                - \ref EADC_SCTL_TRGDLYDIV_DIVIDER_16   : Trigger delay clock frequency is ADC_CLK/16\r
108   * @return None\r
109   * @details User can configure the trigger delay time by setting TRGDLYCNT (EADC_SCTLn[15:8], n=0~15) and TRGDLYDIV (EADC_SCTLn[7:6], n=0~15).\r
110   *         Trigger delay time = (u32TriggerDelayTime) x Trigger delay clock period.\r
111   */\r
112 void EADC_SetTriggerDelayTime(EADC_T *eadc, \\r
113                               uint32_t u32ModuleNum, \\r
114                               uint32_t u32TriggerDelayTime, \\r
115                               uint32_t u32DelayClockDivider)\r
116 {\r
117     eadc->SCTL[u32ModuleNum] &= ~(EADC_SCTL_TRGDLYDIV_Msk | EADC_SCTL_TRGDLYCNT_Msk);\r
118     eadc->SCTL[u32ModuleNum] |= ((u32TriggerDelayTime << EADC_SCTL_TRGDLYCNT_Pos) | u32DelayClockDivider);\r
119 }\r
120 \r
121 /**\r
122   * @brief Set ADC extend sample time.\r
123   * @param[in] eadc The pointer of the specified EADC module.\r
124   * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 18.\r
125   * @param[in] u32ExtendSampleTime Decides the extend sampling time, the range is from 0~255 ADC clock. Valid value are from 0 to 0xFF.\r
126   * @return None\r
127   * @details When A/D converting at high conversion rate, the sampling time of analog input voltage may not enough if input channel loading is heavy,\r
128   *         user can extend A/D sampling time after trigger source is coming to get enough sampling time.\r
129   */\r
130 void EADC_SetExtendSampleTime(EADC_T *eadc, uint32_t u32ModuleNum, uint32_t u32ExtendSampleTime)\r
131 {\r
132     eadc->SCTL[u32ModuleNum] &= ~EADC_SCTL_EXTSMPT_Msk;\r
133 \r
134     eadc->SCTL[u32ModuleNum] |= (u32ExtendSampleTime << EADC_SCTL_EXTSMPT_Pos);\r
135 \r
136 }\r
137 \r
138 /*@}*/ /* end of group EADC_EXPORTED_FUNCTIONS */\r
139 \r
140 /*@}*/ /* end of group EADC_Driver */\r
141 \r
142 /*@}*/ /* end of group Standard_Driver */\r
143 \r
144 /*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/\r