lib_adc.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  1. /**
  2. ******************************************************************************
  3. * @file lib_adc.c
  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. #include "lib_adc.h"
  14. #define ANA_INTEN_ADCMsk (0x3FC003U)
  15. #define ANA_INTSTS_ADCMsk (0x3FC003U)
  16. #define ANA_ADCCTRL0_RSTValue (0x300000U)
  17. #define ANA_ADCCTRL1_RSTValue (0xC2U)
  18. #define ANA_ADCCTRL2_RSTValue (0x8014U)
  19. #define ANA_ADCDATATHD1_0_RSTValue (0U)
  20. #define ANA_ADCDATATHD3_2_RSTValue (0U)
  21. #define ANA_ADCDATATHD_CH_RSTValue (0U)
  22. #define RTC_ADCUCALK_RSTValue (0x599A599AU)
  23. #define RTC_ADCMACTL_RSTValue (0x78000000U)
  24. #define RTC_ADCDTCTL_RSTValue (0x80000000)
  25. #define ADC_SYNC_WR(); {__NOP(); __NOP(); __NOP(); __NOP();}
  26. /**
  27. * @brief Initializes ADC peripheral registers to their default reset values.
  28. * @note 1. Disable ADC
  29. 2. Disable resistor division.
  30. 3. Disable ADC auto/manual done interrupt.
  31. 4. The ADC correlation (register) is written to the default value.
  32. * @param None
  33. * @retval None
  34. */
  35. void ADC_DeInit(void)
  36. {
  37. uint32_t tmp[3];
  38. if((ANA->ADCSTATE&0x07)!=0)
  39. {
  40. ADC_Cmd(DISABLE);
  41. }
  42. /* 6.5MHz clock. */
  43. ANA->REG0 &= ~ANA_REG0_ADCFRQSEL;
  44. /* ADC mode */
  45. ANA->REG1 &= ~ANA_REG1_ADCMODESEL;
  46. /* Power up VINBUF and REFBUF. */
  47. ANA->REG11 &= ~(ANA_REG11_REFBUFPD|ANA_REG11_VINBUFPD);
  48. /* Power down ADC */
  49. ANA->ADCCTRL2 &= ~ANA_ADCCTRL2_ADC_EN;
  50. /* Disable interrupt, Clear interrupt flag */
  51. ANA->INTEN &= ~ANA_INTEN_ADCMsk;
  52. ANA->INTSTS = ANA_INTSTS_ADCMsk;
  53. while (ANA->ADCCTRL0 & ANA_ADCCTRL0_MTRIG);
  54. ANA->ADCCTRL0 = ANA_ADCCTRL0_RSTValue;
  55. while (ANA->ADCCTRL0 & ANA_ADCCTRL0_MTRIG);
  56. ANA->ADCCTRL1 = ANA_ADCCTRL1_RSTValue;
  57. ANA->ADCCTRL2 = ANA_ADCCTRL2_RSTValue|ANA_ADCCTRL2_CONV_ERR_CLR|ANA_ADCCTRL2_CAL_ERR_CLR;
  58. ANA->ADCDATATHD1_0= ANA_ADCDATATHD1_0_RSTValue;
  59. ANA->ADCDATATHD3_2 = ANA_ADCDATATHD3_2_RSTValue;
  60. ANA->ADCDATATHD_CH = ANA_ADCDATATHD_CH_RSTValue;
  61. tmp[0] = RTC_ADCUCALK_RSTValue;
  62. tmp[1] = RTC_ADCMACTL_RSTValue;
  63. tmp[2] = RTC_ADCDTCTL_RSTValue;
  64. RTC_WriteRegisters((uint32_t)&RTC->ADCUCALK, tmp, 3);
  65. ANA->ADCCTRL2 = ANA_ADCCTRL2_RSTValue;
  66. }
  67. /**
  68. * @brief Fills each ADC_InitStruct member with its default value.
  69. * @param ADC_InitStruct: pointer to an ADC_InitType structure which will be initialized.
  70. * @retval None
  71. */
  72. void ADC_StructInit(ADC_InitType* ADC_InitStruct)
  73. {
  74. /*------ Reset ADC init structure parameters values ------*/
  75. ADC_InitStruct->Mode = ADC_MODE_DC;
  76. ADC_InitStruct->ClockSource = ADC_CLKSRC_RCH;
  77. ADC_InitStruct->ClockFrq = ADC_CLKFRQ_HIGH;
  78. ADC_InitStruct->SkipSample = ADC_SKIP_0;
  79. ADC_InitStruct->AverageSample = ADC_AVERAGE_2;
  80. ADC_InitStruct->TriggerSource = ADC_TRIGSOURCE_OFF;
  81. ADC_InitStruct->Channel = ADC_CHANNEL_GND0;
  82. ADC_InitStruct->ResDivEnable = 0;
  83. ADC_InitStruct->AverageEnable = 0;
  84. }
  85. /**
  86. * @brief Initializes ADC.
  87. * @param ADC_InitStruct: pointer to an ADC_InitType structure which will be initialized.
  88. Mode:
  89. ADC_MODE_DC (Not include ADC_CHANNEL_TEMP)
  90. ADC_MODE_AC (Only ADC_CHANNEL_CHx be valid)
  91. ADC_MODE_TEMP (Only ADC_CHANNEL_TEMP be valid)
  92. ClockSource: \n
  93. ADC_CLKSRC_RCH \n
  94. ADC_CLKSRC_PLLL \n
  95. ClockFrq: \n
  96. ADC_CLKFRQ_HIGH \n
  97. ADC_CLKFRQ_LOW \n
  98. SkipSample: \n
  99. ADC_SKIP_0 \n
  100. ADC_SKIP_4 \n
  101. ADC_SKIP_8 \n
  102. ADC_SKIP_12 \n
  103. AverageSample: \n
  104. ADC_AVERAGE_2 \n
  105. ADC_AVERAGE_4 \n
  106. ADC_AVERAGE_8 \n
  107. ADC_AVERAGE_16 \n
  108. ADC_AVERAGE_32 \n
  109. ADC_AVERAGE_64 \n
  110. TriggerSource: \n
  111. ADC_TRIGSOURCE_OFF \n
  112. ADC_TRIGSOURCE_ITVSITV \n
  113. ADC_TRIGSOURCE_WKUSEC \n
  114. ADC_TRIGSOURCE_ALARM \n
  115. ADC_TRIGSOURCE_TMR0 \n
  116. ADC_TRIGSOURCE_TMR1 \n
  117. ADC_TRIGSOURCE_TMR2 \n
  118. ADC_TRIGSOURCE_TMR3 \n
  119. Channel:
  120. ResDivEnable: (also can be ADC_CHANNEL_NONE)
  121. AverageEnable: (also can be ADC_CHANNEL_NONE)
  122. ADC_CHANNEL_GND0
  123. ADC_CHANNEL_BAT1
  124. ADC_CHANNEL_BATRTC
  125. ADC_CHANNEL_CH3
  126. ADC_CHANNEL_CH4
  127. ADC_CHANNEL_CH5
  128. ADC_CHANNEL_CH6
  129. ADC_CHANNEL_CH7
  130. ADC_CHANNEL_CH8
  131. ADC_CHANNEL_CH9
  132. ADC_CHANNEL_TEMP
  133. ADC_CHANNEL_CH11
  134. ADC_CHANNEL_DVCC
  135. ADC_CHANNEL_GND13
  136. ADC_CHANNEL_GND14
  137. ADC_CHANNEL_GND15
  138. ADC_CHANNEL_DC_ALL
  139. ADC_CHANNEL_AC_ALL
  140. * @retval None
  141. */
  142. void ADC_Init(ADC_InitType *ADC_InitStruct)
  143. {
  144. uint32_t tmp_anareg0, tmp_anareg1, tmp_anareg3, tmp_anareg11;
  145. uint32_t tmp_adcctrl0, tmp_adcctrl1, tmp_adcctrl2;
  146. uint32_t tmp_rtcadcmactl;
  147. /* Check parameters */
  148. assert_parameters(IS_ADC_MODE(ADC_InitStruct->Mode));
  149. assert_parameters(IS_ADC_CLKSRC(ADC_InitStruct->ClockSource));
  150. assert_parameters(IS_ADC_CLKFRQ(ADC_InitStruct->ClockFrq));
  151. assert_parameters(IS_ADC_SKIP(ADC_InitStruct->SkipSample));
  152. assert_parameters(IS_ADC_AVERAG(ADC_InitStruct->AverageSample));
  153. assert_parameters(IS_ADC_TRIGSOURCE(ADC_InitStruct->TriggerSource));
  154. while (ANA->ADCCTRL0 & ANA_ADCCTRL0_MTRIG);
  155. ANA->ADCCTRL2 &= ~ANA_ADCCTRL2_ADC_EN;
  156. tmp_adcctrl0 = ANA->ADCCTRL0;
  157. tmp_adcctrl1 = ANA->ADCCTRL1;
  158. tmp_adcctrl2 = ANA->ADCCTRL2;
  159. tmp_anareg0 = ANA->REG0;
  160. tmp_anareg1 = ANA->REG1;
  161. tmp_anareg3 = ANA->REG3;
  162. tmp_anareg11 = 0;
  163. tmp_rtcadcmactl = RTC->ADCMACTL;
  164. /* Configure clock source and trigger source */
  165. tmp_adcctrl0 &= ~(ANA_ADCCTRL0_AEN | ANA_ADCCTRL0_CLKSRCSEL);
  166. tmp_adcctrl0 |= (ADC_InitStruct->TriggerSource | ADC_InitStruct->ClockSource);
  167. /* Configure ClockFrq */
  168. if (ADC_InitStruct->ClockFrq == ADC_CLKFRQ_HIGH)
  169. {
  170. tmp_anareg0 &= ~ANA_REG0_ADCFRQSEL;
  171. tmp_adcctrl2 &= ~ANA_ADCCTRL2_ADCCR;
  172. }
  173. else
  174. {
  175. tmp_anareg0 |= ANA_REG0_ADCFRQSEL;
  176. tmp_adcctrl2 |= ANA_ADCCTRL2_ADCCR;
  177. }
  178. /* Configure skip samples and average samples */
  179. tmp_rtcadcmactl &= ~(RTC_ADCMACTL_SKIP_SAMPLE | RTC_ADCMACTL_AVERAGE_SAMPLE);
  180. tmp_rtcadcmactl |= (ADC_InitStruct->SkipSample | ADC_InitStruct->AverageSample);
  181. /* Mode: DC */
  182. if (ADC_InitStruct->Mode == ADC_MODE_DC)
  183. {
  184. /* Check parameters */
  185. assert_parameters(IS_ADC_CHANNEL_DC(ADC_InitStruct->Channel));
  186. assert_parameters(IS_ADC_CHANNEL_EN_DC(ADC_InitStruct->AverageEnable));
  187. assert_parameters(IS_ADC_CHANNEL_EN_DC(ADC_InitStruct->ResDivEnable));
  188. /* Enable or disable Channels */
  189. tmp_adcctrl2 &= ~ANA_ADCCTRL2_SCAN_CHx;
  190. tmp_adcctrl2 |= (ADC_InitStruct->Channel << ADC_CHANNEL_SHIFT);
  191. /* Enable or disable average */
  192. tmp_rtcadcmactl &= ~RTC_ADCMACTL_AVERAGE_CHx;
  193. tmp_rtcadcmactl |= (ADC_InitStruct->AverageEnable << ADC_AVERAGECH_SHIFT);
  194. /* Enable or disable RESDIV */
  195. tmp_adcctrl1 &= ~ANA_ADCCTRL1_RESDIV_CHx;
  196. tmp_adcctrl1 |= (ADC_InitStruct->ResDivEnable << ADC_RESDIVCH_SHIFT);
  197. /* Others */
  198. tmp_anareg1 &= ~ANA_REG1_ADCMODESEL;
  199. }
  200. /* Mode: AC */
  201. else if (ADC_InitStruct->Mode == ADC_MODE_AC)
  202. {
  203. /* Check parameters */
  204. assert_parameters(IS_ADC_CHANNEL_AC(ADC_InitStruct->Channel));
  205. assert_parameters(IS_ADC_CHANNEL_EN_AC(ADC_InitStruct->AverageEnable));
  206. /* Enable or disable Channels */
  207. tmp_adcctrl2 &= ~ANA_ADCCTRL2_SCAN_CHx;
  208. tmp_adcctrl2 |= (ADC_InitStruct->Channel << ADC_CHANNEL_SHIFT);
  209. /* Enable or disable average */
  210. tmp_rtcadcmactl &= ~RTC_ADCMACTL_AVERAGE_CHx;
  211. tmp_rtcadcmactl |= (ADC_InitStruct->AverageEnable << ADC_AVERAGECH_SHIFT);
  212. /* Enable or disable RESDIV */
  213. tmp_adcctrl1 &= ~ANA_ADCCTRL1_RESDIV_CHx;
  214. tmp_adcctrl1 |= (ADC_InitStruct->Channel << ADC_RESDIVCH_SHIFT);
  215. /* Others */
  216. tmp_anareg1 |= ANA_REG1_ADCMODESEL;
  217. }
  218. /* Mode: TEMP */
  219. else
  220. {
  221. /* Check parameters */
  222. assert_parameters(IS_ADC_CHANNEL_TEMP(ADC_InitStruct->Channel));
  223. /* Enable ADC_CHANNEL_TEMP */
  224. tmp_adcctrl2 &= ~ANA_ADCCTRL2_SCAN_CHx;
  225. tmp_adcctrl2 |= (ADC_CHANNEL_TEMP << ADC_CHANNEL_SHIFT);
  226. /* Enable average */
  227. tmp_rtcadcmactl &= ~RTC_ADCMACTL_AVERAGE_CHx;
  228. tmp_rtcadcmactl |= (ADC_CHANNEL_TEMP << ADC_AVERAGECH_SHIFT);
  229. /* Disable RESDIV */
  230. tmp_adcctrl1 &= ~ANA_ADCCTRL1_RESDIV_CHx;
  231. /* Others */
  232. tmp_anareg1 &= ~ANA_REG1_ADCMODESEL;
  233. if(ADC_InitStruct->ClockFrq == ADC_CLKFRQ_LOW)
  234. {
  235. /* It can improve the accuracy of temperature measurement */
  236. tmp_anareg11 |= (ANA_REG11_VINBUFPD | ANA_REG11_REFBUFPD);
  237. }
  238. }
  239. ANA->ADCCTRL0 = tmp_adcctrl0&(~ANA_ADCCTRL0_MTRIG);
  240. ANA->ADCCTRL1 = tmp_adcctrl1;
  241. ANA->ADCCTRL2 = tmp_adcctrl2;
  242. ANA->REG0 = tmp_anareg0;
  243. ANA->REG1 = tmp_anareg1;
  244. ANA->REG3 = tmp_anareg3;
  245. ANA->REG11 = tmp_anareg11;
  246. RTC_WriteRegisters((uint32_t)&RTC->ADCMACTL, &tmp_rtcadcmactl, 1);
  247. }
  248. /**
  249. * @brief Fills each ADCTHD_InitType member with its default value.
  250. * @param ADC_THDStruct: pointer to an ADC_THDStruct structure which will be initialized.
  251. * @retval None
  252. */
  253. void ADC_THDStructInit(ADCTHD_InitType* ADC_THDStruct)
  254. {
  255. ADC_THDStruct->THDChannel = ADC_THDCHANNEL0;
  256. ADC_THDStruct->UpperTHD = 0x0000;
  257. ADC_THDStruct->LowerTHD = 0x0000;
  258. ADC_THDStruct->TriggerSel = ADC_THDSEL_HIGH;
  259. ADC_THDStruct->THDSource = ADC_CHANNEL_GND0;
  260. }
  261. /**
  262. * @brief Initializes ADC threshold.
  263. * @param ADC_THDStruct:
  264. * THDChannel:
  265. * ADC_THDCHANNEL0
  266. * ADC_THDCHANNEL1
  267. * ADC_THDCHANNEL2
  268. * ADC_THDCHANNEL3
  269. * UpperTHD:
  270. * 0~0xFF
  271. * LowerTHD:
  272. * 0~0xFF
  273. * TriggerSel:
  274. * ADC_THDSEL_HIGH
  275. * ADC_THDSEL_RISING
  276. * ADC_THDSEL_FALLING
  277. * ADC_THDSEL_BOTH
  278. * THDSource:
  279. * ADC_CHANNEL_GND0
  280. * ADC_CHANNEL_BAT1
  281. * ADC_CHANNEL_BATRTC
  282. * ADC_CHANNEL_CH3
  283. * ADC_CHANNEL_CH4
  284. * ADC_CHANNEL_CH5
  285. * ADC_CHANNEL_CH6
  286. * ADC_CHANNEL_CH7
  287. * ADC_CHANNEL_CH8
  288. * ADC_CHANNEL_CH9
  289. * ADC_CHANNEL_TEMP
  290. * ADC_CHANNEL_CH11
  291. * ADC_CHANNEL_DVCC
  292. * ADC_CHANNEL_GND13
  293. * ADC_CHANNEL_GND14
  294. * ADC_CHANNEL_GND15
  295. * @retval None
  296. */
  297. void ADC_THDInit(ADCTHD_InitType* ADC_THDStruct)
  298. {
  299. uint32_t tmp = 0;
  300. uint32_t position = 0x00U;
  301. uint32_t currentch = 0x00U;
  302. /* Check parameters */
  303. assert_parameters(IS_ADC_THDCHANNEL(ADC_THDStruct->THDChannel));
  304. assert_parameters(IS_ADC_THDSEL(ADC_THDStruct->TriggerSel));
  305. assert_parameters(IS_ADC_CHANNEL_GETDATA(ADC_THDStruct->THDSource));
  306. while ((ADC_THDStruct->THDSource >> position) != 0U)
  307. {
  308. /* Get current ch position */
  309. currentch = ADC_THDStruct->THDSource & (0x01U << position);
  310. if (currentch)
  311. {
  312. break;
  313. }
  314. position++;
  315. }
  316. if ((ADC_THDStruct->THDChannel == ADC_THDCHANNEL0) || (ADC_THDStruct->THDChannel == ADC_THDCHANNEL1))
  317. {
  318. ANA->ADCDATATHD1_0 &= ~((ANA_ADCDATATHD1_0_LOWER_THD0|ANA_ADCDATATHD1_0_UPPER_THD0) << (16*ADC_THDStruct->THDChannel));
  319. ANA->ADCDATATHD1_0 |= (((ADC_THDStruct->UpperTHD<<8)|ADC_THDStruct->LowerTHD) << (16*ADC_THDStruct->THDChannel));
  320. }
  321. else
  322. {
  323. ANA->ADCDATATHD3_2 &= ~((ANA_ADCDATATHD3_2_LOWER_THD2|ANA_ADCDATATHD3_2_UPPER_THD2) << (16*(ADC_THDStruct->THDChannel - 2)));
  324. ANA->ADCDATATHD3_2 |= (((ADC_THDStruct->UpperTHD<<8)|ADC_THDStruct->LowerTHD) << (16*(ADC_THDStruct->THDChannel - 2)));
  325. }
  326. tmp = ANA->ADCDATATHD_CH;
  327. tmp &= ~(ANA_ADCDATATHD_CH_THD0_SEL << (ADC_THDStruct->THDChannel*2));
  328. tmp |= (ADC_THDStruct->TriggerSel << (ADC_THDStruct->THDChannel*2 + ANA_ADCDATATHD_CH_THD0_SEL_Pos));
  329. tmp &= ~(ANA_ADCDATATHD_CH_THD0_CH << (ADC_THDStruct->THDChannel*4));
  330. tmp |= (position << (ADC_THDStruct->THDChannel*4+ANA_ADCDATATHD_CH_THD0_CH_Pos));
  331. ANA->ADCDATATHD_CH = tmp;
  332. }
  333. /**
  334. * @brief Starts a ADC calibration (ADC calibration is implemented when DPORST or ADC RESET happened).
  335. * @param None
  336. * @retval None
  337. */
  338. void ADC_Calibration(void)
  339. {
  340. volatile uint32_t i;
  341. // if ((ANA->ADCCTRL2 & ANA_ADCCTRL2_RTC_CAL_DONE) && (ANA->ADCDOS != 0))
  342. // return;
  343. //Disable ADC
  344. ADCCALSTART:
  345. ANA->ADCCTRL2 &= ~ANA_ADCCTRL2_ADC_EN;
  346. ANA->ADCCTRL2 |= ANA_ADCCTRL2_CAL_ERR_CLR;
  347. ADC_SYNC_WR();
  348. //Set 6.5M ADC clock
  349. ANA->REG0 &= ~ANA_REG0_ADCFRQSEL;
  350. ADC_SYNC_WR();
  351. while (ANA->ADCCTRL0 & ANA_ADCCTRL0_MTRIG);
  352. //ADC STOP
  353. ANA->ADCCTRL0 = ANA_ADCCTRL0_RSTValue|ANA_ADCCTRL0_STOP;
  354. ADC_SYNC_WR();
  355. ANA->ADCCTRL0 = ANA_ADCCTRL0_RSTValue;
  356. ADC_SYNC_WR();
  357. //Reset ADC
  358. ANA->ADCCTRL2 = ANA_ADCCTRL2_RSTValue | ANA_ADCCTRL2_RESET;
  359. ADC_SYNC_WR();
  360. ANA->ADCCTRL2 = ANA_ADCCTRL2_RSTValue;
  361. ADC_SYNC_WR();
  362. //Enable ADC TRG_CAL
  363. ANA->ADCCTRL2 |= ANA_ADCCTRL2_ADC_EN_TRG_CAL;
  364. ADC_SYNC_WR();
  365. ANA->ADCCTRL2 |= ANA_ADCCTRL2_ADC_EN;
  366. ADC_SYNC_WR();
  367. /* while loop until ADC calibration is done */
  368. ADC_SYNC_WR();
  369. while (!(ANA->ADCCTRL2 & ANA_ADCCTRL2_RTC_CAL_DONE))
  370. {
  371. }
  372. if(ANA->ADCCTRL2 & ANA_ADCCTRL2_CAL_ERR)
  373. {
  374. goto ADCCALSTART;
  375. }
  376. ANA->ADCCTRL2 &= ~ANA_ADCCTRL2_ADC_EN_TRG_CAL;
  377. ADC_SYNC_WR();
  378. ANA->ADCCTRL2 &= ~ANA_ADCCTRL2_ADC_EN;
  379. ADC_SYNC_WR();
  380. }
  381. /**
  382. * @brief Calculates ADC value via ADC original data.
  383. * @param [in]Mode:
  384. ADC_3V_ADCCHx_NODIV
  385. ADC_3V_ADCCHx_RESDIV
  386. ADC_3V_BAT1_RESDIV
  387. ADC_3V_BATRTC_RESDIV
  388. ADC_5V_ADCCHx_NODIV
  389. ADC_5V_ADCCHx_RESDIV
  390. ADC_5V_BAT1_RESDIV
  391. ADC_5V_BATRTC_RESDIV
  392. ADC_TEMP
  393. * @param [in]adc_data: The ADC original data
  394. * @param [out]value: The pointer of value calculated by this function
  395. * @retval 1 NVR checksum error.
  396. 0 Function successed.
  397. */
  398. uint32_t ADC_CalculateValue(uint32_t Mode, int16_t adc_data, int16_t *value)
  399. {
  400. NVR_ADCVOLPARA parameter;
  401. NVR_TempParams TempParams;
  402. /* Check parameters */
  403. assert_parameters(IS_ADCVOL_MODE(Mode));
  404. if (Mode == ADC_TEMP)
  405. {
  406. if (NVR_GetTempParameters(&TempParams))
  407. {
  408. return 1;
  409. }
  410. else
  411. {
  412. /* Calculate temperature */
  413. *value = ((TempParams.RTCTempP0 * ((adc_data*adc_data)>>16)) + TempParams.RTCTempP1*adc_data + TempParams.RTCTempP2) >> 8;
  414. }
  415. }
  416. else
  417. {
  418. if (NVR_GetVoltageParameters(Mode, &parameter))
  419. {
  420. return 1;
  421. }
  422. else
  423. {
  424. *value = (int16_t)((parameter.aParameter*(float)adc_data + parameter.bParameter) + parameter.OffsetParameter);
  425. }
  426. }
  427. return 0;
  428. }
  429. /**
  430. * @brief Enables or disables ADC.
  431. * @note None
  432. * @param NewState
  433. ENABLE
  434. DISABLE
  435. * @retval None
  436. */
  437. void ADC_Cmd(uint32_t NewState)
  438. {
  439. __IO uint32_t dly = 400UL;
  440. /* Check parameters */
  441. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  442. while (ANA->ADCCTRL0 & ANA_ADCCTRL0_MTRIG);
  443. if (NewState == DISABLE)
  444. {
  445. if(ANA->ADCSTATE & ANA_ADCSTATE_ADCSTATE)
  446. {
  447. ANA->ADCCTRL0 |= ANA_ADCCTRL0_STOP;
  448. if ((MISC2->CLKSEL&MISC2_CLKSEL_CLKSEL) == MISC2_CLKSEL_CLKSEL_RTCCLK)
  449. {
  450. __NOP();
  451. __NOP();
  452. }
  453. else
  454. {
  455. while (dly--)
  456. __NOP();
  457. }
  458. ANA->ADCCTRL0 &= ~ANA_ADCCTRL0_STOP;
  459. }
  460. ANA->ADCCTRL2 &= ~ANA_ADCCTRL2_ADC_EN;
  461. }
  462. else
  463. {
  464. ANA->ADCCTRL0 &= ~ANA_ADCCTRL0_STOP;
  465. ANA->ADCCTRL2 |= ANA_ADCCTRL2_ADC_EN;
  466. if ((MISC2->CLKSEL&MISC2_CLKSEL_CLKSEL) == MISC2_CLKSEL_CLKSEL_RTCCLK)
  467. {
  468. __NOP();
  469. __NOP();
  470. }
  471. else
  472. {
  473. while (dly--)
  474. __NOP();
  475. }
  476. /* Start Manual ADC conversion */
  477. ADC_StartManual();
  478. /* Waiting Manual ADC conversion done */
  479. ADC_WaitForManual();
  480. }
  481. }
  482. /**
  483. * @brief Enables or disables ADC lower threshold detect function.
  484. * @note None
  485. * @param THDChannel:
  486. ADC_THDCHANNEL0~ADC_THDCHANNEL3
  487. NewState
  488. ENABLE
  489. DISABLE
  490. * @retval None
  491. */
  492. void ADC_LowerTHDCmd(uint32_t THDChannel,uint32_t NewState)
  493. {
  494. /* Check parameters */
  495. assert_parameters(IS_ADC_THDCHANNEL(THDChannel));
  496. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  497. if (NewState == DISABLE)
  498. {
  499. ANA->ADCCTRL1 &= ~(ANA_ADCCTRL1_LOWER_THD0_EN << (THDChannel*2));
  500. }
  501. else
  502. {
  503. ANA->ADCCTRL1 |= (ANA_ADCCTRL1_LOWER_THD0_EN << (THDChannel*2));
  504. }
  505. }
  506. /**
  507. * @brief Enables or disables ADC upper threshold detect function.
  508. * @note None
  509. * @param THDChannel:
  510. IS_ADC_THDCHANNEL0~IS_ADC_THDCHANNEL3
  511. NewState
  512. ENABLE
  513. DISABLE
  514. * @retval None
  515. */
  516. void ADC_UpperTHDCmd(uint32_t THDChannel,uint32_t NewState)
  517. {
  518. /* Check parameters */
  519. assert_parameters(IS_ADC_THDCHANNEL(THDChannel));
  520. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  521. if (NewState == DISABLE)
  522. {
  523. ANA->ADCCTRL1 &= ~(ANA_ADCCTRL1_UPPER_THD0_EN << (THDChannel*2));
  524. }
  525. else
  526. {
  527. ANA->ADCCTRL1 |= (ANA_ADCCTRL1_UPPER_THD0_EN << (THDChannel*2));
  528. }
  529. }
  530. /**
  531. * @brief Starts a ADC manual-trigger.
  532. * @param None
  533. * @retval None
  534. */
  535. void ADC_StartManual(void)
  536. {
  537. while (ANA->ADCCTRL0 & ANA_ADCCTRL0_MTRIG);
  538. ANA->ADCCTRL0 |= ANA_ADCCTRL0_MTRIG;
  539. }
  540. /**
  541. * @brief Waits until the last Manual ADC conversion done.
  542. * @param None
  543. * @retval None
  544. */
  545. void ADC_WaitForManual(void)
  546. {
  547. while (ANA->ADCCTRL0 & ANA_ADCCTRL0_MTRIG)
  548. {
  549. }
  550. }
  551. /**
  552. * @brief Gets ADC vonversion value.
  553. * @param Channel:
  554. * ADC_CHANNEL_GND0
  555. * ADC_CHANNEL_BAT1
  556. * ADC_CHANNEL_BATRTC
  557. * ADC_CHANNEL_CH3
  558. * ADC_CHANNEL_CH4
  559. * ADC_CHANNEL_CH5
  560. * ADC_CHANNEL_CH6
  561. * ADC_CHANNEL_CH7
  562. * ADC_CHANNEL_CH8
  563. * ADC_CHANNEL_CH9
  564. * ADC_CHANNEL_TEMP
  565. * ADC_CHANNEL_CH11
  566. * ADC_CHANNEL_DVCC
  567. * ADC_CHANNEL_GND13
  568. * ADC_CHANNEL_GND14
  569. * ADC_CHANNEL_GND15
  570. * @retval ADC conversion value.
  571. */
  572. int16_t ADC_GetADCConversionValue(uint32_t Channel)
  573. {
  574. uint32_t position = 0x0000UL;
  575. uint32_t chcurrent = 0x0000UL;
  576. /* Check parameters */
  577. assert_parameters(IS_ADC_CHANNEL_GETDATA(Channel));
  578. while ((Channel >> position) != 0UL)
  579. {
  580. chcurrent = Channel & (0x01U << position);
  581. if (chcurrent)
  582. break;
  583. position++;
  584. }
  585. return (ANA->ADCDATA[position]);
  586. }
  587. /**
  588. * @brief Enables or disables ADC interrupt.
  589. * @param INTMask: can use the '|' operator
  590. ADC_INT_UPPER_TH3
  591. ADC_INT_LOWER_TH3
  592. ADC_INT_UPPER_TH2
  593. ADC_INT_LOWER_TH2
  594. ADC_INT_UPPER_TH1
  595. ADC_INT_LOWER_TH1
  596. ADC_INT_UPPER_TH0
  597. ADC_INT_LOWER_TH0
  598. ADC_INT_AUTODONE
  599. ADC_INT_MANUALDONE
  600. NewState
  601. ENABLE
  602. DISABLE
  603. * @retval None
  604. */
  605. void ADC_INTConfig(uint32_t INTMask, uint32_t NewState)
  606. {
  607. /* Check parameters */
  608. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  609. assert_parameters(IS_ADC_INT(INTMask));
  610. if (NewState == ENABLE)
  611. ANA->INTEN |= INTMask;
  612. else
  613. ANA->INTEN &= ~INTMask;
  614. }
  615. /**
  616. * @brief Clears ADC interrupt status.
  617. * @param INTMask: can use the '|' operator
  618. ADC_INTSTS_UPPER_TH3
  619. ADC_INTSTS_LOWER_TH3
  620. ADC_INTSTS_UPPER_TH2
  621. ADC_INTSTS_LOWER_TH2
  622. ADC_INTSTS_UPPER_TH1
  623. ADC_INTSTS_LOWER_TH1
  624. ADC_INTSTS_UPPER_TH0
  625. ADC_INTSTS_LOWER_TH0
  626. ADC_INTSTS_AUTODONE
  627. ADC_INTSTS_MANUALDONE
  628. * @retval None
  629. */
  630. void ADC_ClearINTStatus(uint32_t INTMask)
  631. {
  632. /* Parameter check */
  633. assert_parameters(IS_ADC_INTFLAGC(INTMask));
  634. ANA->INTSTS = INTMask;
  635. }
  636. /**
  637. * @brief Gets ADC interrupt status.
  638. * @param INTMask:
  639. ADC_INTSTS_UPPER_TH3
  640. ADC_INTSTS_LOWER_TH3
  641. ADC_INTSTS_UPPER_TH2
  642. ADC_INTSTS_LOWER_TH2
  643. ADC_INTSTS_UPPER_TH1
  644. ADC_INTSTS_LOWER_TH1
  645. ADC_INTSTS_UPPER_TH0
  646. ADC_INTSTS_LOWER_TH0
  647. ADC_INTSTS_AUTODONE
  648. ADC_INTSTS_MANUALDONE
  649. * @retval 1: status set
  650. 0: status reset.
  651. */
  652. uint8_t ADC_GetINTStatus(uint32_t INTMask)
  653. {
  654. /* Parameter check */
  655. assert_parameters(IS_ADC_INTFLAGR(INTMask));
  656. if (ANA->INTSTS & INTMask)
  657. {
  658. return 1;
  659. }
  660. else
  661. {
  662. return 0;
  663. }
  664. }
  665. /**
  666. * @brief Gets ADC flag
  667. * @param FlagMask
  668. ADC_FLAG_CONV_ERR
  669. ADC_FLAG_CAL_ERR
  670. ADC_FLAG_CAL_DONE
  671. ADC_FLAG_BUSY
  672. * @retval 1 flag set
  673. * 0 flag reset.
  674. */
  675. uint8_t ADC_GetFlag(uint32_t FlagMask)
  676. {
  677. /* Parameter check */
  678. assert_parameters(IS_ADC_ADCFLAG(FlagMask));
  679. if (ANA->ADCCTRL2 & FlagMask)
  680. return 1;
  681. else
  682. return 0;
  683. }
  684. /**
  685. * @brief Clears ADC flag
  686. * @param FlagMask: status to clear, can use the '|' operator.
  687. ADC_FLAG_CONV_ERR
  688. ADC_FLAG_CAL_ERR
  689. * @retval None
  690. */
  691. void ADC_ClearFlag(uint32_t FlagMask)
  692. {
  693. uint32_t tmp;
  694. /* Parameter check */
  695. assert_parameters(IS_ADC_ADCFLAGC(FlagMask));
  696. if (FlagMask == ADC_FLAG_CONV_ERR)
  697. {
  698. tmp = ANA->ADCCTRL2;
  699. tmp &= ~ANA_ADCCTRL2_CAL_ERR_CLR;
  700. tmp |= ANA_ADCCTRL2_CONV_ERR_CLR;
  701. }
  702. else if (FlagMask == ADC_FLAG_CAL_ERR)
  703. {
  704. tmp = ANA->ADCCTRL2;
  705. tmp &= ~ANA_ADCCTRL2_CONV_ERR_CLR;
  706. tmp |= ANA_ADCCTRL2_CAL_ERR_CLR;
  707. }
  708. else
  709. {
  710. tmp = ANA->ADCCTRL2;
  711. tmp |= (ANA_ADCCTRL2_CAL_ERR_CLR | ANA_ADCCTRL2_CONV_ERR_CLR);
  712. }
  713. ANA->ADCCTRL2 = tmp;
  714. }
  715. /**
  716. * @brief Gets threshold flag
  717. * @param THDFlagMask
  718. ADC_THDFLAG_UPPER3
  719. ADC_THDFLAG_LOWER3
  720. ADC_THDFLAG_UPPER2
  721. ADC_THDFLAG_LOWER2
  722. ADC_THDFLAG_UPPER1
  723. ADC_THDFLAG_LOWER1
  724. ADC_THDFLAG_UPPER0
  725. ADC_THDFLAG_LOWER0
  726. * @retval 1 flag set
  727. * 0 flag reset.
  728. */
  729. uint8_t ADC_GetTHDFlag(uint32_t THDFlagMask)
  730. {
  731. /* Parameter check */
  732. assert_parameters(IS_ADC_THDFLAG(THDFlagMask));
  733. if(ANA->ADCDATATHD_CH & THDFlagMask)
  734. return 1;
  735. else
  736. return 0;
  737. }
  738. /*********************************** END OF FILE ******************************/