lib_adc.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. /**
  2. ******************************************************************************
  3. * @file lib_adc.h
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  7. * @brief ADC library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #ifndef __LIB_ADC_H
  14. #define __LIB_ADC_H
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. #include "target.h"
  19. typedef struct
  20. {
  21. uint32_t Mode;
  22. uint32_t ClockSource;
  23. uint32_t ClockFrq;
  24. uint32_t SkipSample;
  25. uint32_t AverageSample;
  26. uint32_t TriggerSource;
  27. uint32_t Channel;
  28. uint32_t ResDivEnable;
  29. uint32_t AverageEnable;
  30. } ADC_InitType;
  31. typedef struct
  32. {
  33. uint32_t THDChannel;
  34. uint8_t UpperTHD;
  35. uint8_t LowerTHD;
  36. uint32_t TriggerSel;
  37. uint32_t THDSource;
  38. } ADCTHD_InitType;
  39. /* Exported constants --------------------------------------------------------*/
  40. //Mode
  41. #define ADC_MODE_DC (0UL)
  42. #define ADC_MODE_AC (1UL)
  43. #define ADC_MODE_TEMP (2UL)
  44. #define IS_ADC_MODE(__MODE__) (((__MODE__) == ADC_MODE_DC) ||\
  45. ((__MODE__) == ADC_MODE_AC) ||\
  46. ((__MODE__) == ADC_MODE_TEMP))
  47. //ClockSource
  48. #define ADC_CLKSRC_RCH (0)
  49. #define ADC_CLKSRC_PLLL ANA_ADCCTRL0_CLKSRCSEL
  50. #define IS_ADC_CLKSRC(__CLKSRC__) (((__CLKSRC__) == ADC_CLKSRC_RCH) ||\
  51. ((__CLKSRC__) == ADC_CLKSRC_PLLL))
  52. //ClockFrq
  53. #define ADC_CLKFRQ_HIGH (0UL)
  54. #define ADC_CLKFRQ_LOW (1UL)
  55. #define IS_ADC_CLKFRQ(__CLKFRQ__) (((__CLKFRQ__) == ADC_CLKFRQ_HIGH) ||\
  56. ((__CLKFRQ__) == ADC_CLKFRQ_LOW))
  57. //SkipSample
  58. #define ADC_SKIP_0 (0x0UL << RTC_ADCMACTL_SKIP_SAMPLE_Pos)
  59. #define ADC_SKIP_4 (0x4UL << RTC_ADCMACTL_SKIP_SAMPLE_Pos)
  60. #define ADC_SKIP_8 (0x7UL << RTC_ADCMACTL_SKIP_SAMPLE_Pos)
  61. #define ADC_SKIP_12 (0x12UL << RTC_ADCMACTL_SKIP_SAMPLE_Pos)
  62. #define IS_ADC_SKIP(__SKIP__) (((__SKIP__) == ADC_SKIP_0) ||\
  63. ((__SKIP__) == ADC_SKIP_4) ||\
  64. ((__SKIP__) == ADC_SKIP_8) ||\
  65. ((__SKIP__) == ADC_SKIP_12))
  66. //AverageSample
  67. #define ADC_AVERAGE_2 (0x0UL << RTC_ADCMACTL_AVERAGE_SAMPLE_Pos)
  68. #define ADC_AVERAGE_4 (0x1UL << RTC_ADCMACTL_AVERAGE_SAMPLE_Pos)
  69. #define ADC_AVERAGE_8 (0x2UL << RTC_ADCMACTL_AVERAGE_SAMPLE_Pos)
  70. #define ADC_AVERAGE_16 (0x3UL << RTC_ADCMACTL_AVERAGE_SAMPLE_Pos)
  71. #define ADC_AVERAGE_32 (0x4UL << RTC_ADCMACTL_AVERAGE_SAMPLE_Pos)
  72. #define ADC_AVERAGE_64 (0x5UL << RTC_ADCMACTL_AVERAGE_SAMPLE_Pos)
  73. #define IS_ADC_AVERAG(__AVERAG__) (((__AVERAG__) == ADC_AVERAGE_2) ||\
  74. ((__AVERAG__) == ADC_AVERAGE_4) ||\
  75. ((__AVERAG__) == ADC_AVERAGE_8) ||\
  76. ((__AVERAG__) == ADC_AVERAGE_16) ||\
  77. ((__AVERAG__) == ADC_AVERAGE_32) ||\
  78. ((__AVERAG__) == ADC_AVERAGE_64))
  79. //TriggerSource
  80. #define ADC_TRIGSOURCE_OFF (0x0UL << ANA_ADCCTRL0_AEN_Pos)
  81. #define ADC_TRIGSOURCE_ITVSITV (0x1UL << ANA_ADCCTRL0_AEN_Pos)
  82. #define ADC_TRIGSOURCE_WKUSEC (0x2UL << ANA_ADCCTRL0_AEN_Pos)
  83. #define ADC_TRIGSOURCE_ALARM (0x3UL << ANA_ADCCTRL0_AEN_Pos)
  84. #define ADC_TRIGSOURCE_TMR0 (0x4UL << ANA_ADCCTRL0_AEN_Pos)
  85. #define ADC_TRIGSOURCE_TMR1 (0x5UL << ANA_ADCCTRL0_AEN_Pos)
  86. #define ADC_TRIGSOURCE_TMR2 (0x6UL << ANA_ADCCTRL0_AEN_Pos)
  87. #define ADC_TRIGSOURCE_TMR3 (0x7UL << ANA_ADCCTRL0_AEN_Pos)
  88. #define IS_ADC_TRIGSOURCE(__TRIGSOURCE__) (((__TRIGSOURCE__) == ADC_TRIGSOURCE_OFF) ||\
  89. ((__TRIGSOURCE__) == ADC_TRIGSOURCE_ITVSITV) ||\
  90. ((__TRIGSOURCE__) == ADC_TRIGSOURCE_WKUSEC) ||\
  91. ((__TRIGSOURCE__) == ADC_TRIGSOURCE_ALARM) ||\
  92. ((__TRIGSOURCE__) == ADC_TRIGSOURCE_TMR0) ||\
  93. ((__TRIGSOURCE__) == ADC_TRIGSOURCE_TMR1) ||\
  94. ((__TRIGSOURCE__) == ADC_TRIGSOURCE_TMR2) ||\
  95. ((__TRIGSOURCE__) == ADC_TRIGSOURCE_TMR3))
  96. //Channel
  97. #define ADC_CHANNEL_NONE (0 << 0UL)
  98. #define ADC_CHANNEL_GND0 (1 << 0UL)
  99. #define ADC_CHANNEL_BAT1 (1 << 1UL)
  100. #define ADC_CHANNEL_BATRTC (1 << 2UL)
  101. #define ADC_CHANNEL_CH3 (1 << 3UL)
  102. #define ADC_CHANNEL_CH4 (1 << 4UL)
  103. #define ADC_CHANNEL_CH5 (1 << 5UL)
  104. #define ADC_CHANNEL_CH6 (1 << 6UL)
  105. #define ADC_CHANNEL_CH7 (1 << 7UL)
  106. #define ADC_CHANNEL_CH8 (1 << 8UL)
  107. #define ADC_CHANNEL_CH9 (1 << 9UL)
  108. #define ADC_CHANNEL_TEMP (1 << 10UL)
  109. #define ADC_CHANNEL_CH11 (1 << 11UL)
  110. #define ADC_CHANNEL_DVCC (1 << 12UL)
  111. #define ADC_CHANNEL_GND13 (1 << 13UL)
  112. #define ADC_CHANNEL_GND14 (1 << 14UL)
  113. #define ADC_CHANNEL_GND15 (1 << 15UL)
  114. #define ADC_CHANNEL_DC_Msk (0xFBFFUL)
  115. #define ADC_CHANNEL_DC_ALL ADC_CHANNEL_DC_Msk
  116. #define ADC_CHANNEL_AC_Msk (0x0BF8UL)
  117. #define ADC_CHANNEL_AC_ALL ADC_CHANNEL_AC_Msk
  118. #define IS_ADC_CHANNEL_GETDATA(__CHANNEL__) (((__CHANNEL__) == ADC_CHANNEL_GND0) ||\
  119. ((__CHANNEL__) == ADC_CHANNEL_BAT1) ||\
  120. ((__CHANNEL__) == ADC_CHANNEL_BATRTC) ||\
  121. ((__CHANNEL__) == ADC_CHANNEL_CH3) ||\
  122. ((__CHANNEL__) == ADC_CHANNEL_CH4) ||\
  123. ((__CHANNEL__) == ADC_CHANNEL_CH5) ||\
  124. ((__CHANNEL__) == ADC_CHANNEL_CH6) ||\
  125. ((__CHANNEL__) == ADC_CHANNEL_CH7) ||\
  126. ((__CHANNEL__) == ADC_CHANNEL_CH8) ||\
  127. ((__CHANNEL__) == ADC_CHANNEL_CH9) ||\
  128. ((__CHANNEL__) == ADC_CHANNEL_TEMP) ||\
  129. ((__CHANNEL__) == ADC_CHANNEL_CH11) ||\
  130. ((__CHANNEL__) == ADC_CHANNEL_DVCC) ||\
  131. ((__CHANNEL__) == ADC_CHANNEL_GND13) ||\
  132. ((__CHANNEL__) == ADC_CHANNEL_GND14) ||\
  133. ((__CHANNEL__) == ADC_CHANNEL_GND15))
  134. #define IS_ADC_CHANNEL_AC(__CHANNEL__) ((((__CHANNEL__) & ADC_CHANNEL_AC_Msk) != 0UL) &&\
  135. (((__CHANNEL__) & ~ADC_CHANNEL_AC_Msk) == 0UL))
  136. #define IS_ADC_CHANNEL_DC(__CHANNEL__) ((((__CHANNEL__) & ADC_CHANNEL_DC_Msk) != 0UL) &&\
  137. (((__CHANNEL__) & ~ADC_CHANNEL_DC_Msk) == 0UL))
  138. #define IS_ADC_CHANNEL_TEMP(__CHANNEL__) ((__CHANNEL__) == ADC_CHANNEL_TEMP)
  139. #define IS_ADC_CHANNEL_EN_DC(__CHANNEL__) (((((__CHANNEL__) & ADC_CHANNEL_DC_Msk) != 0UL) && (((__CHANNEL__) & ~ADC_CHANNEL_DC_Msk) == 0UL)) ||\
  140. ((__CHANNEL__) == ADC_CHANNEL_NONE))
  141. #define IS_ADC_CHANNEL_EN_AC(__CHANNEL__) (((((__CHANNEL__) & ADC_CHANNEL_AC_Msk) != 0UL) && (((__CHANNEL__) & ~ADC_CHANNEL_AC_Msk) == 0UL)) ||\
  142. ((__CHANNEL__) == ADC_CHANNEL_NONE))
  143. #define ADC_CHANNEL_Pos (0UL)
  144. #define ADC_CHANNEL_SHIFT (ANA_ADCCTRL2_SCAN_CHx_Pos - ADC_CHANNEL_Pos)
  145. #define ADC_AVERAGECH_SHIFT (RTC_ADCMACTL_AVERAGE_CHx_Pos - ADC_CHANNEL_Pos)
  146. #define ADC_RESDIVCH_SHIFT (ANA_ADCCTRL1_RESDIV_CHx_Pos - ADC_CHANNEL_Pos)
  147. //THDChannel
  148. #define ADC_THDCHANNEL0 (0UL)
  149. #define ADC_THDCHANNEL1 (1UL)
  150. #define ADC_THDCHANNEL2 (2UL)
  151. #define ADC_THDCHANNEL3 (3UL)
  152. #define IS_ADC_THDCHANNEL(THDCHANNEL) (((THDCHANNEL) == ADC_THDCHANNEL0) ||\
  153. ((THDCHANNEL) == ADC_THDCHANNEL1) ||\
  154. ((THDCHANNEL) == ADC_THDCHANNEL2) ||\
  155. ((THDCHANNEL) == ADC_THDCHANNEL3))
  156. //TriggerSel
  157. #define ADC_THDSEL_HIGH (0UL)
  158. #define ADC_THDSEL_RISING (1UL)
  159. #define ADC_THDSEL_FALLING (2UL)
  160. #define ADC_THDSEL_BOTH (3UL)
  161. #define IS_ADC_THDSEL(__THDSEL__) (((__THDSEL__) == ADC_THDSEL_HIGH) ||\
  162. ((__THDSEL__) == ADC_THDSEL_RISING) ||\
  163. ((__THDSEL__) == ADC_THDSEL_FALLING) ||\
  164. ((__THDSEL__) == ADC_THDSEL_BOTH))
  165. //INTMask
  166. #define ADC_INT_UPPER_TH3 ANA_INTEN_INTEN21
  167. #define ADC_INT_LOWER_TH3 ANA_INTEN_INTEN20
  168. #define ADC_INT_UPPER_TH2 ANA_INTEN_INTEN19
  169. #define ADC_INT_LOWER_TH2 ANA_INTEN_INTEN18
  170. #define ADC_INT_UPPER_TH1 ANA_INTEN_INTEN17
  171. #define ADC_INT_LOWER_TH1 ANA_INTEN_INTEN16
  172. #define ADC_INT_UPPER_TH0 ANA_INTEN_INTEN15
  173. #define ADC_INT_LOWER_TH0 ANA_INTEN_INTEN14
  174. #define ADC_INT_AUTODONE ANA_INTEN_INTEN1
  175. #define ADC_INT_MANUALDONE ANA_INTEN_INTEN0
  176. #define ADC_INT_Msk (0x3FC003UL)
  177. #define IS_ADC_INT(__INT__) ((((__INT__) & ADC_INT_Msk) != 0UL) &&\
  178. (((__INT__) & ~ADC_INT_Msk) == 0UL))
  179. //INTSTS
  180. #define ADC_INTSTS_UPPER_TH3 ANA_INTSTS_INTSTS21
  181. #define ADC_INTSTS_LOWER_TH3 ANA_INTSTS_INTSTS20
  182. #define ADC_INTSTS_UPPER_TH2 ANA_INTSTS_INTSTS19
  183. #define ADC_INTSTS_LOWER_TH2 ANA_INTSTS_INTSTS18
  184. #define ADC_INTSTS_UPPER_TH1 ANA_INTSTS_INTSTS17
  185. #define ADC_INTSTS_LOWER_TH1 ANA_INTSTS_INTSTS16
  186. #define ADC_INTSTS_UPPER_TH0 ANA_INTSTS_INTSTS15
  187. #define ADC_INTSTS_LOWER_TH0 ANA_INTSTS_INTSTS14
  188. #define ADC_INTSTS_AUTODONE ANA_INTSTS_INTSTS1
  189. #define ADC_INTSTS_MANUALDONE ANA_INTSTS_INTSTS0
  190. #define ADC_INTSTS_Msk (0x3FC003UL)
  191. #define IS_ADC_INTFLAGC(__INTFLAGC__) ((((__INTFLAGC__) & ADC_INTSTS_Msk) != 0U) &&\
  192. (((__INTFLAGC__) & ~ADC_INTSTS_Msk) == 0U))
  193. #define IS_ADC_INTFLAGR(__INTFLAGR__) (((__INTFLAGR__) == ADC_INTSTS_UPPER_TH3) ||\
  194. ((__INTFLAGR__) == ADC_INTSTS_LOWER_TH3) ||\
  195. ((__INTFLAGR__) == ADC_INTSTS_UPPER_TH2) ||\
  196. ((__INTFLAGR__) == ADC_INTSTS_LOWER_TH2) ||\
  197. ((__INTFLAGR__) == ADC_INTSTS_UPPER_TH1) ||\
  198. ((__INTFLAGR__) == ADC_INTSTS_LOWER_TH1) ||\
  199. ((__INTFLAGR__) == ADC_INTSTS_UPPER_TH0) ||\
  200. ((__INTFLAGR__) == ADC_INTSTS_LOWER_TH0) ||\
  201. ((__INTFLAGR__) == ADC_INTSTS_AUTODONE) ||\
  202. ((__INTFLAGR__) == ADC_INTSTS_MANUALDONE))
  203. #define ADC_FLAG_CONV_ERR (0x1U << ANA_ADCCTRL2_CONV_ERR_Pos)
  204. #define ADC_FLAG_CAL_ERR (0x1U << ANA_ADCCTRL2_CAL_ERR_Pos)
  205. #define ADC_FLAG_CAL_DONE (0x1U << ANA_ADCCTRL2_RTC_CAL_DONE_Pos)
  206. #define ADC_FLAG_BUSY (0x1U << ANA_ADCCTRL2_BUSY_Pos)
  207. #define IS_ADC_ADCFLAG(__ADCFLAG__) (((__ADCFLAG__) == ADC_FLAG_CONV_ERR) ||\
  208. ((__ADCFLAG__) == ADC_FLAG_CAL_ERR) ||\
  209. ((__ADCFLAG__) == ADC_FLAG_CAL_DONE) ||\
  210. ((__ADCFLAG__) == ADC_FLAG_BUSY))
  211. #define ADC_FLAG_RCMsk (ADC_FLAG_CONV_ERR|ADC_FLAG_CAL_ERR)
  212. #define IS_ADC_ADCFLAGC(__ADCFLAG__) ((((__ADCFLAG__) & ADC_FLAG_RCMsk) != 0U) &&\
  213. (((__ADCFLAG__) & ~ADC_FLAG_RCMsk) == 0U))
  214. //THDFlag
  215. #define ADC_THDFLAG_UPPER3 (0x1U << ANA_ADCDATATHD_CH_UPPER_THD3_TRGED_Pos)
  216. #define ADC_THDFLAG_LOWER3 (0x1U << ANA_ADCDATATHD_CH_LOWER_THD3_TRGED_Pos)
  217. #define ADC_THDFLAG_UPPER2 (0x1U << ANA_ADCDATATHD_CH_UPPER_THD2_TRGED_Pos)
  218. #define ADC_THDFLAG_LOWER2 (0x1U << ANA_ADCDATATHD_CH_LOWER_THD2_TRGED_Pos)
  219. #define ADC_THDFLAG_UPPER1 (0x1U << ANA_ADCDATATHD_CH_UPPER_THD1_TRGED_Pos)
  220. #define ADC_THDFLAG_LOWER1 (0x1U << ANA_ADCDATATHD_CH_LOWER_THD1_TRGED_Pos)
  221. #define ADC_THDFLAG_UPPER0 (0x1U << ANA_ADCDATATHD_CH_UPPER_THD0_TRGED_Pos)
  222. #define ADC_THDFLAG_LOWER0 (0x1U << ANA_ADCDATATHD_CH_LOWER_THD0_TRGED_Pos)
  223. #define IS_ADC_THDFLAG(__THDFLAG__) (((__THDFLAG__) == ADC_THDFLAG_UPPER3) ||\
  224. ((__THDFLAG__) == ADC_THDFLAG_LOWER3) ||\
  225. ((__THDFLAG__) == ADC_THDFLAG_UPPER2) ||\
  226. ((__THDFLAG__) == ADC_THDFLAG_LOWER2) ||\
  227. ((__THDFLAG__) == ADC_THDFLAG_UPPER1) ||\
  228. ((__THDFLAG__) == ADC_THDFLAG_LOWER1) ||\
  229. ((__THDFLAG__) == ADC_THDFLAG_UPPER0) ||\
  230. ((__THDFLAG__) == ADC_THDFLAG_LOWER0))
  231. #define IS_ADC_BATDIV(__BATDIV__) (((__BATDIV__) == ADC_BAT_CAPDIV) ||\
  232. ((__BATDIV__) == ADC_BAT_RESDIV))
  233. /* ADC_GetVoltage */
  234. //Mode
  235. #define ADC_3V_ADCCHx_NODIV (0x000UL) // Power supply: 3.3V; Channel: External; Divider modeL: None
  236. #define ADC_3V_ADCCHx_RESDIV (0x001UL) // Power supply: 3.3V; Channel: External; Divider modeL: Resistive
  237. #define ADC_3V_BAT1_RESDIV (0x002UL) // Power supply: 3.3V; Channel: VDD; Divider modeL: Resistive
  238. #define ADC_3V_BATRTC_RESDIV (0x003UL) // Power supply: 3.3V; Channel: BATRTC; Divider modeL: Resistive
  239. #define ADC_5V_ADCCHx_NODIV (0x100UL) // Power supply: 5V; Channel: External; Divider modeL: None
  240. #define ADC_5V_ADCCHx_RESDIV (0x101UL) // Power supply: 5V; Channel: External; Divider modeL: Resistive
  241. #define ADC_5V_BAT1_RESDIV (0x102UL) // Power supply: 5V; Channel: VDD; Divider modeL: Resistive
  242. #define ADC_5V_BATRTC_RESDIV (0x103UL) // Power supply: 5V; Channel: BATRTC; Divider modeL: Resistive
  243. #define ADC_TEMP (0x1000UL) // Temperature ; Channel: ADC_CHANNEL_TEMP
  244. #define IS_ADCVOL_MODE(__MODE__) (((__MODE__) == ADC_3V_ADCCHx_NODIV) ||\
  245. ((__MODE__) == ADC_3V_ADCCHx_RESDIV) ||\
  246. ((__MODE__) == ADC_3V_BAT1_RESDIV) ||\
  247. ((__MODE__) == ADC_3V_BATRTC_RESDIV) ||\
  248. ((__MODE__) == ADC_5V_ADCCHx_NODIV) ||\
  249. ((__MODE__) == ADC_5V_ADCCHx_RESDIV) ||\
  250. ((__MODE__) == ADC_5V_BAT1_RESDIV) ||\
  251. ((__MODE__) == ADC_5V_BATRTC_RESDIV) ||\
  252. ((__MODE__) == ADC_TEMP))
  253. /* Exported Functions ------------------------------------------------------- */
  254. /* ADC Exported Functions Group1:
  255. (De)Initialization -------------------------*/
  256. void ADC_DeInit(void);
  257. void ADC_StructInit(ADC_InitType* ADC_InitStruct);
  258. void ADC_Init(ADC_InitType* ADC_InitStruct);
  259. /* ADC Exported Functions Group2:
  260. ADC Configuration --------------*/
  261. void ADC_THDInit(ADCTHD_InitType* ADC_THDStruct);
  262. void ADC_THDStructInit(ADCTHD_InitType* ADC_THDStruct);
  263. void ADC_Calibration(void);
  264. /* ADC Exported Functions Group3:
  265. Get NVR Info, Calculate datas --------------*/
  266. uint32_t ADC_CalculateValue(uint32_t Mode, int16_t adc_data, int16_t *value);
  267. /* ADC Exported Functions Group4:
  268. Interrupt (flag) ---------------------------*/
  269. int16_t ADC_GetADCConversionValue(uint32_t Channel);
  270. void ADC_INTConfig(uint32_t INTMask, uint32_t NewState);
  271. uint8_t ADC_GetFlag(uint32_t FlagMask);
  272. void ADC_ClearFlag(uint32_t FlagMask);
  273. uint8_t ADC_GetINTStatus(uint32_t INTMask);
  274. void ADC_ClearINTStatus(uint32_t INTMask);
  275. uint8_t ADC_GetTHDFlag(uint32_t THDFlagMask);
  276. /* ADC Exported Functions Group5:
  277. MISC Configuration -------------------------*/
  278. void ADC_Cmd(uint32_t NewState);
  279. void ADC_LowerTHDCmd(uint32_t THDChannel,uint32_t NewState);
  280. void ADC_UpperTHDCmd(uint32_t THDChannel,uint32_t NewState);
  281. void ADC_StartManual(void);
  282. void ADC_WaitForManual(void);
  283. #ifdef __cplusplus
  284. }
  285. #endif
  286. #endif /* __LIB_ADC_H */
  287. /*********************************** END OF FILE ******************************/