lib_adc.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. /**
  2. ******************************************************************************
  3. * @file lib_adc.c
  4. * @author Application Team
  5. * @version V4.6.0
  6. * @date 2019-06-18
  7. * @brief ADC library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_adc.h"
  14. extern __IO uint32_t ana_reg3_tmp;
  15. #define ANA_REG1_RSTValue (0U)
  16. #define ANA_ADCCTRL_RSTValue (0U)
  17. /**
  18. * @brief Initializes ADC peripheral registers to their default reset values.
  19. * @note 1. Disable ADC
  20. 2. Disable ADC overall bias current trim
  21. 3. Disable resistor/cap division.
  22. 4. Disable ADC auto/manual done interrupt
  23. 5. ANA_ADCCTRL(register) write default value.
  24. * @param None
  25. * @retval None
  26. */
  27. void ADC_DeInit(void)
  28. {
  29. /* Power down ADC */
  30. ana_reg3_tmp &= ~ANA_REG3_ADCPDN;
  31. ANA->REG3 = ana_reg3_tmp;
  32. /* Disable resistor/cap division. */
  33. ANA->REG1 = ANA_REG1_RSTValue;
  34. /* Disable interrupt, Clear interrupt flag */
  35. ANA->INTEN &= ~(ANA_INTEN_INTEN0 | ANA_INTEN_INTEN1);
  36. ANA->INTSTS = (ANA_INTSTS_INTSTS0 | ANA_INTSTS_INTSTS1);
  37. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  38. ANA->ADCCTRL = ANA_ADCCTRL_RSTValue;
  39. }
  40. /**
  41. * @brief Fills each ADC_InitStruct member with its default value.
  42. * @param ADC_InitStruct: pointer to an ADCInitType structure which will be initialized.
  43. * @retval None
  44. */
  45. void ADC_StructInit(ADCInitType* ADC_InitStruct)
  46. {
  47. /*--------------- Reset ADC init structure parameters values ---------------*/
  48. /* Initialize the ClockSource member */
  49. ADC_InitStruct->ClockSource = ADC_CLKSRC_RCH;
  50. /* Initialize the Channel member */
  51. ADC_InitStruct->Channel = ADC_CHANNEL0;
  52. /* Initialize the ClockDivider member */
  53. ADC_InitStruct->ClockDivider = ADC_CLKDIV_1;
  54. /* Initialize the ConvMode member */
  55. ADC_InitStruct->ConvMode = ADC_CONVMODE_SINGLECHANNEL;
  56. /* Initialize the TrigMode member */
  57. ADC_InitStruct->TrigMode = ADC_TRIGMODE_MANUAL;
  58. }
  59. /**
  60. * @brief ADC initialization.
  61. * @param ADC_InitStruct:
  62. TrigMode:
  63. ADC_TRIGMODE_AUTO
  64. ADC_TRIGMODE_MANUAL
  65. ConvMode:
  66. ADC_CONVMODE_SINGLECHANNEL
  67. ADC_CONVMODE_MULTICHANNEL
  68. ClockSource:
  69. ADC_CLKSRC_RCH
  70. ADC_CLKSRC_PLLL
  71. ClockDivider:
  72. ADC_CLKDIV_1
  73. ADC_CLKDIV_2
  74. ADC_CLKDIV_3
  75. ADC_CLKDIV_4
  76. ADC_CLKDIV_5
  77. ADC_CLKDIV_6
  78. ADC_CLKDIV_7
  79. ADC_CLKDIV_8
  80. ADC_CLKDIV_9
  81. ADC_CLKDIV_10
  82. ADC_CLKDIV_11
  83. ADC_CLKDIV_12
  84. ADC_CLKDIV_13
  85. ADC_CLKDIV_14
  86. ADC_CLKDIV_15
  87. ADC_CLKDIV_16
  88. Channel:(be valid when ConvMode is ADC_CONVMODE_SINGLECHANNEL)
  89. ADC_CHANNEL0
  90. ADC_CHANNEL1
  91. ADC_CHANNEL2
  92. ADC_CHANNEL3
  93. ADC_CHANNEL4
  94. ADC_CHANNEL5
  95. ADC_CHANNEL6
  96. ADC_CHANNEL7
  97. ADC_CHANNEL8
  98. ADC_CHANNEL9
  99. ADC_CHANNEL10
  100. ADC_CHANNEL11
  101. * @retval None
  102. */
  103. void ADC_Init(ADCInitType* ADC_InitStruct)
  104. {
  105. uint32_t tmp = 0;
  106. /* Check parameters */
  107. assert_parameters(IS_ADC_TRIGMODE(ADC_InitStruct->TrigMode));
  108. assert_parameters(IS_ADC_CONVMODE(ADC_InitStruct->ConvMode));
  109. assert_parameters(IS_ADC_CLKDIV(ADC_InitStruct->ClockDivider));
  110. assert_parameters(IS_ADC_CLKSRC(ADC_InitStruct->ClockSource));
  111. tmp = ANA->ADCCTRL;
  112. tmp &= ~(ANA_ADCCTRL_AMODE \
  113. |ANA_ADCCTRL_MMODE \
  114. |ANA_ADCCTRL_CLKSEL \
  115. |ANA_ADCCTRL_CLKDIV \
  116. |ANA_ADCCTRL_AEN \
  117. |ANA_ADCCTRL_MCH \
  118. |ANA_ADCCTRL_ACH);
  119. tmp |= (ADC_InitStruct->ClockDivider | ADC_InitStruct->ClockSource);
  120. if(ADC_InitStruct->TrigMode == ADC_TRIGMODE_AUTO) //Auto mode
  121. {
  122. if(ADC_InitStruct->ConvMode == ADC_CONVMODE_SINGLECHANNEL) //signal channel
  123. {
  124. assert_parameters(IS_ADC_CHANNEL(ADC_InitStruct->Channel));
  125. tmp &= (~ANA_ADCCTRL_ACH);
  126. tmp |= (ADC_InitStruct->Channel << ANA_ADCCTRL_ACH_Pos);
  127. }
  128. else //multi channels
  129. {
  130. tmp |= ANA_ADCCTRL_AMODE;
  131. }
  132. }
  133. else // Manual mode
  134. {
  135. if(ADC_InitStruct->ConvMode == ADC_CONVMODE_SINGLECHANNEL) //signal channel
  136. {
  137. assert_parameters(IS_ADC_CHANNEL(ADC_InitStruct->Channel));
  138. tmp &= (~ANA_ADCCTRL_MCH);
  139. tmp |= (ADC_InitStruct->Channel << ANA_ADCCTRL_MCH_Pos);
  140. }
  141. else //multi channels
  142. {
  143. tmp |= ANA_ADCCTRL_MMODE;
  144. }
  145. }
  146. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  147. ANA->ADCCTRL = tmp;
  148. }
  149. /**
  150. * @brief Calculate ADC voltage value(uint:V) via ADC original data.
  151. * @param [in]Mode:
  152. * ADC_3V_EXTERNAL_NODIV
  153. * ADC_3V_EXTERNAL_RESDIV
  154. * ADC_3V_EXTERNAL_CAPDIV
  155. * ADC_3V_VDD_RESDIV
  156. * ADC_3V_VDD_CAPDIV
  157. * ADC_3V_BATRTC_RESDIV
  158. * ADC_3V_BATRTC_CAPDIV
  159. * ADC_5V_EXTERNAL_NODIV
  160. * ADC_5V_EXTERNAL_RESDIV
  161. * ADC_5V_EXTERNAL_CAPDIV
  162. * ADC_5V_VDD_RESDIV
  163. * ADC_5V_VDD_CAPDIV
  164. * ADC_5V_BATRTC_RESDIV
  165. * ADC_5V_BATRTC_CAPDIV
  166. * @param [in]adc_data: The ADC original data
  167. * @param [out]Voltage: The pointer of voltage value calculated by this function
  168. * @retval 1 NVR checksum error.
  169. 0 Function successed.
  170. */
  171. uint32_t ADC_CalculateVoltage(uint32_t Mode, int16_t adc_data, float *Voltage)
  172. {
  173. NVR_ADCVOLPARA parameter;
  174. NVR_BATMEARES BAT_OffsetInfo;
  175. /* Check parameters */
  176. assert_parameters(IS_ADCVOL_MODE(Mode));
  177. if (NVR_GetADCVoltageParameter(Mode, &parameter))
  178. {
  179. if ((Mode&0xFUL) > 2UL) /* VDD or BATRTC channel */
  180. {
  181. if (NVR_GetBATOffset(&BAT_OffsetInfo))
  182. {
  183. return 1;
  184. }
  185. else
  186. {
  187. if (((Mode&0xFUL) == 3UL) || ((Mode&0xFUL) == 5UL)) /* VDD/BATRTC, Resistive */
  188. {
  189. *Voltage = (float)(0.00015392*(float)adc_data + 0.06667986) + BAT_OffsetInfo.BATRESResult;
  190. }
  191. else /* VDD/BATRTC, Capacitive */
  192. {
  193. *Voltage = (float)(0.00014107*(float)adc_data - 0.00699515) + BAT_OffsetInfo.BATCAPResult;
  194. }
  195. }
  196. }
  197. else /* External channel */
  198. {
  199. if (Mode & 0x100UL) /* Power supply: 5V */
  200. {
  201. if ((Mode&0xFUL) == 0UL) /* No divider */
  202. {
  203. *Voltage = (float)(0.00003678*(float)adc_data + 0.00235783);
  204. }
  205. else if ((Mode&0xFUL) == 1UL) /* Resistive */
  206. {
  207. *Voltage = (float)(0.00016129*(float)adc_data + 0.00673599);
  208. }
  209. else /* Capacitive */
  210. {
  211. *Voltage = (float)(0.00014076*(float)adc_data - 0.00753319);
  212. }
  213. }
  214. else /* Power supply: 3.3V */
  215. {
  216. if ((Mode&0xFUL) == 0UL) /* No divider */
  217. {
  218. *Voltage = (float)(0.00003680*(float)adc_data + 0.00205011);
  219. }
  220. else if ((Mode&0xFUL) == 1UL) /* Resistive */
  221. {
  222. *Voltage = (float)(0.00016425*(float)adc_data + 0.03739179);
  223. }
  224. else /* Capacitive */
  225. {
  226. *Voltage = (float)(0.00014051*(float)adc_data - 0.00023322);
  227. }
  228. }
  229. }
  230. }
  231. else
  232. {
  233. *Voltage = (float)(parameter.aParameter*(float)adc_data + parameter.bParameter);
  234. }
  235. return 0;
  236. }
  237. /**
  238. * @brief Get VDD Voltage(takes 244us).
  239. * @note This function costs about 170us when SystemClock is 26M.
  240. * ADC data refresh time is 117us.
  241. * @note This function will release ADC resource(write ADC registers with their
  242. * default reset values).
  243. * @note ADC configurarion:
  244. * - Trigger mode: manual mode
  245. * - Conversion mode: single channel mode(VDD channel 1)
  246. * - ADC clock: 3.2M
  247. * - Skip samples: Skip 2 samples
  248. * - Down sampling rate: 1/64
  249. * @param [in]Division
  250. ADC_BAT_CAPDIV (Cap division 1/4)
  251. ADC_BAT_RESDIV (Resistance division 1/4)
  252. [out]CalResults.VDDVoltage The value of VDD Voltage
  253. [out]CalResults.BATRTCVoltage is ignored
  254. [out]CalResults.Temperature is ignored
  255. * @retval 1 NVR BAT-offset information checksum error.
  256. 0 Function successed.
  257. */
  258. uint32_t ADC_GetVDDVoltage_Fast(uint32_t Division, ADC_CalResType *CalResults)
  259. {
  260. float Vbatcap;
  261. float Vbatres;
  262. NVR_BATMEARES BAT_OffsetInfo;
  263. int16_t data;
  264. assert_parameters(IS_ADC_BATDIV(Division));
  265. /* Get NVR BAT offset information */
  266. if (NVR_GetBATOffset(&BAT_OffsetInfo))
  267. {
  268. return (1);
  269. }
  270. else
  271. {
  272. Vbatcap = BAT_OffsetInfo.BATCAPResult;
  273. Vbatres = BAT_OffsetInfo.BATRESResult;
  274. }
  275. /* ADC initialization */
  276. ADC_DeInit();
  277. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  278. ANA->ADCCTRL = 0x06C00101;
  279. /* Enable division */
  280. ANA->REG1 |= Division;
  281. /* Enable ADC */
  282. ana_reg3_tmp |= ANA_REG3_ADCPDN;
  283. ANA->REG3 = ana_reg3_tmp;
  284. /* Start a manual ADC conversion */
  285. ADC_StartManual();
  286. /* Waiting last operation done */
  287. ADC_WaitForManual();
  288. data = ANA->ADCDATA1;
  289. /* Calculate the voltage of VDD */
  290. if (Division & ADC_BAT_CAPDIV)
  291. {
  292. CalResults->VDDVoltage = (0.00014107*(float)data - 0.00699515) + Vbatcap;
  293. }
  294. else
  295. {
  296. CalResults->VDDVoltage = (0.00015392*(float)data + 0.06667986) + Vbatres;
  297. }
  298. /* ADC resource release */
  299. ADC_DeInit();
  300. return (0);
  301. }
  302. /**
  303. * @brief Get VDD Voltage(takes 3.3ms).
  304. * @note This function costs about 3.3ms when SystemClock is 26M.
  305. * ADC data refresh time is about 3.2ms.
  306. * @note This function will release ADC resource(write ADC registers with their
  307. * default reset values).
  308. * @note ADC configurarion:
  309. * - Trigger mode: manual mode
  310. * - Conversion mode: single channel mode(VDD channel 1)
  311. * - ADC clock: 1.6M
  312. * - Skip samples: Skip first 4 samples
  313. * - Down sampling rate: 1/512
  314. * @param [in]Division
  315. ADC_BAT_CAPDIV (Cap division 1/4)
  316. ADC_BAT_RESDIV (Resistance division 1/4)
  317. [out]CalResults.VDDVoltage The value of VDD Voltage
  318. [out]CalResults.BATRTCVoltage is ignored
  319. [out]CalResults.Temperature is ignored
  320. * @retval 1 NVR BAT-offset information checksum error.
  321. 0 Function successed.
  322. */
  323. uint32_t ADC_GetVDDVoltage_Normal(uint32_t Division, ADC_CalResType *CalResults)
  324. {
  325. float Vbatcap;
  326. float Vbatres;
  327. NVR_BATMEARES BAT_OffsetInfo;
  328. ADCInitType ADC_InitStruct;
  329. int16_t data;
  330. assert_parameters(IS_ADC_BATDIV(Division));
  331. /* Get NVR BAT offset information */
  332. if (NVR_GetBATOffset(&BAT_OffsetInfo))
  333. {
  334. return (1);
  335. }
  336. else
  337. {
  338. Vbatcap = BAT_OffsetInfo.BATCAPResult;
  339. Vbatres = BAT_OffsetInfo.BATRESResult;
  340. }
  341. /* ADC initialization */
  342. ADC_DeInit();
  343. ADC_InitStruct.TrigMode = ADC_TRIGMODE_MANUAL;
  344. ADC_InitStruct.ConvMode = ADC_CONVMODE_SINGLECHANNEL;
  345. ADC_InitStruct.Channel = ADC_CHANNEL1;
  346. ADC_InitStruct.ClockDivider = ADC_CLKDIV_4;
  347. ADC_InitStruct.ClockSource = ADC_CLKSRC_RCH;
  348. ADC_Init(&ADC_InitStruct);
  349. /* Enable division */
  350. ANA->REG1 |= Division;
  351. /* Enable ADC */
  352. ana_reg3_tmp |= ANA_REG3_ADCPDN;
  353. ANA->REG3 = ana_reg3_tmp;
  354. /* Start a manual ADC conversion */
  355. ADC_StartManual();
  356. /* Waiting last operation done */
  357. ADC_WaitForManual();
  358. data = ANA->ADCDATA1;
  359. /* Calculate the voltage of VDD */
  360. if (Division & ADC_BAT_CAPDIV)
  361. {
  362. CalResults->VDDVoltage = (0.00014107*(float)data - 0.00699515) + Vbatcap;
  363. }
  364. else
  365. {
  366. CalResults->VDDVoltage = (0.00015392*(float)data + 0.06667986) + Vbatres;
  367. }
  368. /* ADC resource release */
  369. ADC_DeInit();
  370. return (0);
  371. }
  372. /**
  373. * @brief Get BATRTC Voltage(takes 244us).
  374. * @note This function takes about 244us when SystemClock is 26M.
  375. * ADC data refresh time is 117us.
  376. * @note This function will release ADC resource(write ADC registers with their
  377. * default reset values).
  378. * @note ADC configurarion:
  379. * - Trigger mode: manual mode
  380. * - Conversion mode: single channel mode(BATRTC channel 2)
  381. * - ADC clock: 3.2M
  382. * - Skip samples: Skip 2 samples
  383. * - Down sampling rate: 1/64
  384. * @param [in]Division
  385. ADC_BAT_CAPDIV (Cap division 1/4)
  386. ADC_BAT_RESDIV (Resistance division 1/4)
  387. [out]CalResults.VDDVoltage is ignored
  388. [out]CalResults.BATRTCVoltage The value of BATRTC Voltage
  389. [out]CalResults.Temperature is ignored
  390. * @retval 1 NVR BAT-offset or BGP-gain information checksum error.
  391. 0 Function successed.
  392. */
  393. uint32_t ADC_GetBATRTCVoltage_Fast(uint32_t Division, ADC_CalResType *CalResults)
  394. {
  395. float Vbatcap;
  396. float Vbatres;
  397. NVR_BATMEARES BAT_OffsetInfo;
  398. int16_t data;
  399. assert_parameters(IS_ADC_BATDIV(Division));
  400. /* Get NVR BAT offset information */
  401. if (NVR_GetBATOffset(&BAT_OffsetInfo))
  402. {
  403. return (1);
  404. }
  405. else
  406. {
  407. Vbatcap = BAT_OffsetInfo.BATCAPResult;
  408. Vbatres = BAT_OffsetInfo.BATRESResult;
  409. }
  410. /* ADC initialization */
  411. ADC_DeInit();
  412. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  413. ANA->ADCCTRL = 0x06C00102;
  414. /* Enable division */
  415. ANA->REG1 |= Division;
  416. /* Enable ADC */
  417. ana_reg3_tmp |= ANA_REG3_ADCPDN;
  418. ANA->REG3 = ana_reg3_tmp;
  419. /* Start a manual ADC conversion */
  420. ADC_StartManual();
  421. /* Waiting last operation done */
  422. ADC_WaitForManual();
  423. data = ANA->ADCDATA2;
  424. /* Calculate the voltage of BAT1 */
  425. if (Division & ADC_BAT_CAPDIV)
  426. {
  427. CalResults->BATRTCVoltage = (0.00014107*(float)data - 0.00699515) + Vbatcap;
  428. }
  429. else
  430. {
  431. CalResults->BATRTCVoltage = (0.00015392*(float)data + 0.06667986) + Vbatres;
  432. }
  433. /* ADC resource release */
  434. ADC_DeInit();
  435. return (0);
  436. }
  437. /**
  438. * @brief Get BATRTC Voltage(takes 3.3ms).
  439. * @note This function takes about 3.3ms when SystemClock is 26M.
  440. * ADC data refresh time is about 3.2ms.
  441. * @note This function will release ADC resource(write ADC registers with their
  442. * default reset values).
  443. * @note ADC configurarion:
  444. * - Trigger mode: manual mode
  445. * - Conversion mode: single channel mode(BATRTC channel 2)
  446. * - ADC clock: 1.6M
  447. * - Skip samples: Skip first 4 samples
  448. * - Down sampling rate: 1/512
  449. * @param [in]Division
  450. ADC_BAT_CAPDIV (Capacitance division 1/4)
  451. ADC_BAT_RESDIV (Resistance division 1/4)
  452. [out]CalResults.VDDVoltage is ignored
  453. [out]CalResults.BATRTCVoltage The value of BATRTC Voltage
  454. [out]CalResults.Temperature is ignored
  455. * @retval 1 NVR BAT-offset information checksum error.
  456. 0 Function successed.
  457. */
  458. uint32_t ADC_GetBATRTCVoltage_Normal(uint32_t Division, ADC_CalResType *CalResults)
  459. {
  460. float Vbatcap;
  461. float Vbatres;
  462. NVR_BATMEARES BAT_OffsetInfo;
  463. ADCInitType ADC_InitStruct;
  464. int16_t data;
  465. assert_parameters(IS_ADC_BATDIV(Division));
  466. /* Get NVR BAT offset information */
  467. if (NVR_GetBATOffset(&BAT_OffsetInfo))
  468. {
  469. return (1);
  470. }
  471. else
  472. {
  473. Vbatcap = BAT_OffsetInfo.BATCAPResult;
  474. Vbatres = BAT_OffsetInfo.BATRESResult;
  475. }
  476. /* ADC initialization */
  477. ADC_DeInit();
  478. ADC_InitStruct.TrigMode = ADC_TRIGMODE_MANUAL;
  479. ADC_InitStruct.ConvMode = ADC_CONVMODE_SINGLECHANNEL;
  480. ADC_InitStruct.Channel = ADC_CHANNEL2;
  481. ADC_InitStruct.ClockDivider = ADC_CLKDIV_4;
  482. ADC_InitStruct.ClockSource = ADC_CLKSRC_RCH;
  483. ADC_Init(&ADC_InitStruct);
  484. /* Enable division */
  485. ANA->REG1 |= Division;
  486. /* Enable ADC */
  487. ana_reg3_tmp |= ANA_REG3_ADCPDN;
  488. ANA->REG3 = ana_reg3_tmp;
  489. /* Start a manual ADC conversion */
  490. ADC_StartManual();
  491. /* Waiting last operation done */
  492. ADC_WaitForManual();
  493. data = ANA->ADCDATA2;
  494. /* Calculate the voltage of BAT1 */
  495. if (Division & ADC_BAT_CAPDIV)
  496. {
  497. CalResults->BATRTCVoltage = (0.00014107*(float)data - 0.00699515) + Vbatcap;
  498. }
  499. else
  500. {
  501. CalResults->BATRTCVoltage = (0.00015392*(float)data + 0.06667986) + Vbatres;
  502. }
  503. /* ADC resource release */
  504. ADC_DeInit();
  505. return (0);
  506. }
  507. /**
  508. * @brief Get Temperature(takes 6.5ms).
  509. * @note This function costs about 6.5ms when SystemClock is 26M.
  510. * ADC data refresh time is about 3.2ms.
  511. * @note This function will release ADC resource(write ADC registers with their
  512. * default reset values).
  513. * @note ADC configurarion:
  514. * - Trigger mode: manual mode
  515. * - Conversion mode: single channel mode(Temperature channel 10)
  516. * - ADC clock: 1.6M
  517. * - Skip samples: Skip first 4 samples
  518. * - Down sampling rate: 1/512
  519. * @param [out]CalResults.VDDVoltage is ignored
  520. [out]CalResults.BATRTCVoltage is ignored
  521. [out]CalResults.Temperature The value of Temperature
  522. * @retval 1 Temperature delta information checksum error.
  523. 0 Function successed.
  524. */
  525. uint32_t ADC_GetTemperature(ADC_CalResType *CalResults)
  526. {
  527. int32_t P2;
  528. int16_t P1, P0;
  529. int16_t adc_data;
  530. uint32_t retval;
  531. NVR_RTCINFO RTC_DataStruct;
  532. ADCInitType ADC_InitStruct;
  533. /* Get RTC Px parameters */
  534. retval = NVR_GetInfo_LoadRTCData(&RTC_DataStruct);
  535. if (retval & 0x1U)
  536. {
  537. return (1);
  538. }
  539. else
  540. {
  541. P0 = RTC_DataStruct.RTCTempP0;
  542. P1 = RTC_DataStruct.RTCTempP1;
  543. P2 = RTC_DataStruct.RTCTempP2;
  544. }
  545. /* ADC initialization */
  546. ADC_DeInit();
  547. ADC_InitStruct.TrigMode = ADC_TRIGMODE_MANUAL;
  548. ADC_InitStruct.ConvMode = ADC_CONVMODE_SINGLECHANNEL;
  549. ADC_InitStruct.Channel = ADC_CHANNEL10;
  550. ADC_InitStruct.ClockDivider = ADC_CLKDIV_4;
  551. ADC_InitStruct.ClockSource = ADC_CLKSRC_RCH;
  552. ADC_Init(&ADC_InitStruct);
  553. /* Configure 1/512 down-sampling rate */
  554. ADC_CICDownSamRateConfig(ADC_SDRSEL_DIV512);
  555. /* Enable ADC */
  556. ADC_Cmd(ENABLE);
  557. /*---------- Get ADC data1 ----------*/
  558. /* Starts a manual ADC conversion */
  559. ADC_StartManual();
  560. /* Waiting Manual ADC conversion done */
  561. ADC_WaitForManual();
  562. adc_data = (int16_t)ADC_GetADCConversionValue(ADC_CHANNEL10);
  563. /* ADC resource release */
  564. ADC_DeInit();
  565. /* Calculate temperature */
  566. CalResults->Temperature = (float)((((P0 * ((adc_data*adc_data)>>16)) + P1*adc_data + P2) >> 8) / 256.0);
  567. return (0);
  568. }
  569. /**
  570. * @brief ADC power control.
  571. * @note When DISABLE is selected, the automatic triggering of the ADC must be turned off by calling
  572. * ADC_TrigSourceConfig(ADC_TRIGSOURCE_OFF) before using this function.
  573. * @param NewState
  574. ENABLE
  575. DISABLE
  576. * @retval 0: Function succeeded
  577. * 1: Function failded, the automatic triggering be enabled when DISABLE selected
  578. */
  579. uint32_t ADC_Cmd(uint32_t NewState)
  580. {
  581. /* Check parameters */
  582. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  583. if (NewState == DISABLE)
  584. {
  585. if (ANA->ADCCTRL & ANA_ADCCTRL_AEN)
  586. {
  587. return 1;
  588. }
  589. else
  590. {
  591. ana_reg3_tmp &= ~ANA_REG3_ADCPDN;
  592. }
  593. }
  594. else
  595. {
  596. ana_reg3_tmp |= ANA_REG3_ADCPDN;
  597. }
  598. ANA->REG3 = ana_reg3_tmp;
  599. return 0;
  600. }
  601. /**
  602. * @brief Manual ADC trigger
  603. * @param None
  604. * @retval None
  605. */
  606. void ADC_StartManual(void)
  607. {
  608. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  609. ANA->ADCCTRL |= ANA_ADCCTRL_MTRIG;
  610. }
  611. /**
  612. * @brief Wait for the last Manual ADC conversion done.
  613. * @param None
  614. * @retval None
  615. */
  616. void ADC_WaitForManual(void)
  617. {
  618. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG)
  619. {
  620. }
  621. }
  622. /**
  623. * @brief ADC auto mode trigger source configure.
  624. * @param TrigSource:
  625. ADC_TRIGSOURCE_OFF
  626. ADC_TRIGSOURCE_TIM0
  627. ADC_TRIGSOURCE_TIM1
  628. ADC_TRIGSOURCE_TIM2
  629. ADC_TRIGSOURCE_TIM3
  630. * @retval None
  631. */
  632. void ADC_TrigSourceConfig(uint32_t TrigSource)
  633. {
  634. uint32_t tmp;
  635. /* Check parameters */
  636. assert_parameters(IS_ADC_TRIGSOURCE(TrigSource));
  637. tmp = ANA->ADCCTRL;
  638. tmp &= ~ANA_ADCCTRL_AEN;
  639. tmp |= TrigSource;
  640. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  641. ANA->ADCCTRL = tmp;
  642. }
  643. /**
  644. * @brief Resistance division enable control.
  645. * @param NewState
  646. ENABLE (x1/4)
  647. DISABLE (x1)
  648. * @retval None
  649. */
  650. void ADC_RESDivisionCmd(uint32_t NewState)
  651. {
  652. uint32_t tmp;
  653. /* Check parameters */
  654. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  655. tmp = ANA->REG1;
  656. if (NewState == ENABLE)
  657. {
  658. tmp &= ~ANA_REG1_GDE4;
  659. tmp |=ANA_REG1_RESDIV;
  660. }
  661. else
  662. {
  663. tmp &= ~ANA_REG1_RESDIV;
  664. }
  665. ANA->REG1 = tmp;
  666. }
  667. /**
  668. * @brief Capacitance division enable control.
  669. * @param NewState
  670. ENABLE (x1/4)
  671. DISABLE (x1)
  672. * @retval None
  673. */
  674. void ADC_CAPDivisionCmd(uint32_t NewState)
  675. {
  676. uint32_t tmp;
  677. /* Check parameters */
  678. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  679. tmp = ANA->REG1;
  680. if (NewState == ENABLE)
  681. {
  682. tmp &= ~ANA_REG1_RESDIV;
  683. tmp |=ANA_REG1_GDE4;
  684. }
  685. else
  686. {
  687. tmp &= ~ANA_REG1_GDE4;
  688. }
  689. ANA->REG1 = tmp;
  690. }
  691. /**
  692. * @brief CIC filter always on control.
  693. * @param NewState
  694. ENABLE (CIC filter always on)
  695. DISABLE (CIC filter will be disabled when no ADC sample process is ongoing.)
  696. * @retval None
  697. */
  698. void ADC_CICAlwaysOnCmd(uint32_t NewState)
  699. {
  700. /* Check parameters */
  701. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  702. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  703. if (NewState == ENABLE)
  704. ANA->ADCCTRL |= ANA_ADCCTRL_CICAON;
  705. else
  706. ANA->ADCCTRL &= ~ANA_ADCCTRL_CICAON;
  707. }
  708. /**
  709. * @brief CIC filter input inversion control.
  710. * @param NewState
  711. ENABLE
  712. DISABLE
  713. * @retval None
  714. */
  715. void ADC_CICINVCmd(uint32_t NewState)
  716. {
  717. /* Check parameters */
  718. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  719. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  720. if (NewState == ENABLE)
  721. ANA->ADCCTRL |= ANA_ADCCTRL_CICINV;
  722. else
  723. ANA->ADCCTRL &= ~ANA_ADCCTRL_CICINV;
  724. }
  725. /**
  726. * @brief CIC output scale-down configure.
  727. * @param ScaleDown:
  728. ADC_SCA_NONE
  729. ADC_SCA_DIV2
  730. * @retval None
  731. */
  732. void ADC_CICScaleDownConfig(uint32_t ScaleDown)
  733. {
  734. uint32_t tmp;
  735. /* Check parameters */
  736. assert_parameters(IS_ADC_SCA(ScaleDown));
  737. tmp = ANA->ADCCTRL;
  738. tmp &= ~ANA_ADCCTRL_CICSCA;
  739. tmp |= ScaleDown;
  740. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  741. ANA->ADCCTRL = tmp;
  742. }
  743. /**
  744. * @brief CIC output skip control.
  745. * @param Skip:
  746. ADC_SKIP_4
  747. ADC_SKIP_5
  748. ADC_SKIP_6
  749. ADC_SKIP_7
  750. ADC_SKIP_0
  751. ADC_SKIP_1
  752. ADC_SKIP_2
  753. ADC_SKIP_3
  754. * @retval None
  755. */
  756. void ADC_CICSkipConfig(uint32_t Skip)
  757. {
  758. uint32_t tmp;
  759. /* Check parameters */
  760. assert_parameters(IS_ADC_SKIP(Skip));
  761. tmp = ANA->ADCCTRL;
  762. tmp &= ~ANA_ADCCTRL_CICSKIP;
  763. tmp |= Skip;
  764. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  765. ANA->ADCCTRL = tmp;
  766. }
  767. /**
  768. * @brief CIC down sampling rate control.
  769. * @param DSRSelection:
  770. ADC_SDRSEL_DIV512
  771. ADC_SDRSEL_DIV256
  772. ADC_SDRSEL_DIV128
  773. ADC_SDRSEL_DIV64
  774. * @retval None
  775. */
  776. void ADC_CICDownSamRateConfig(uint32_t DSRSelection)
  777. {
  778. uint32_t tmp;
  779. /* Check parameters */
  780. assert_parameters(IS_ADC_SDR(DSRSelection));
  781. tmp = ANA->ADCCTRL;
  782. tmp &= ~ANA_ADCCTRL_DSRSEL;
  783. tmp |= DSRSelection;
  784. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  785. ANA->ADCCTRL = tmp;
  786. }
  787. /**
  788. * @brief Get ADC vonversion value.
  789. * @param Channel:
  790. ADC_CHANNEL0
  791. ADC_CHANNEL1
  792. ADC_CHANNEL2
  793. ADC_CHANNEL3
  794. ADC_CHANNEL4
  795. ADC_CHANNEL5
  796. ADC_CHANNEL6
  797. ADC_CHANNEL7
  798. ADC_CHANNEL8
  799. ADC_CHANNEL9
  800. ADC_CHANNEL10
  801. ADC_CHANNEL11
  802. * @retval ADC conversion value.
  803. */
  804. int16_t ADC_GetADCConversionValue(uint32_t Channel)
  805. {
  806. __IO uint32_t *addr;
  807. /* Check parameters */
  808. assert_parameters(IS_ADC_CHANNEL(Channel));
  809. addr = &ANA->ADCDATA0 + Channel;
  810. return *addr;
  811. }
  812. /**
  813. * @brief ADC interrupt control.
  814. * @param INTMask:
  815. ADC_INT_AUTODONE
  816. ADC_INT_MANUALDONE
  817. NewState
  818. ENABLE
  819. DISABLE
  820. * @retval None
  821. */
  822. void ADC_INTConfig(uint32_t INTMask, uint32_t NewState)
  823. {
  824. /* Check parameters */
  825. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  826. assert_parameters(IS_ADC_INT(INTMask));
  827. if (NewState == ENABLE)
  828. ANA->INTEN |= INTMask;
  829. else
  830. ANA->INTEN &= ~INTMask;
  831. }
  832. /**
  833. * @brief Get auto done flag
  834. * @param None
  835. * @retval 1 flag set
  836. * 0 flag reset.
  837. */
  838. uint8_t ADC_GetAutoDoneFlag(void)
  839. {
  840. if(ANA->INTSTS & ANA_INTSTS_INTSTS1)
  841. return 1;
  842. else
  843. return 0;
  844. }
  845. /**
  846. * @brief Get manual done flag
  847. * @param None
  848. * @retval 1 flag set
  849. * 0 flag reset.
  850. */
  851. uint8_t ADC_GetManualDoneFlag(void)
  852. {
  853. if(ANA->INTSTS & ANA_INTSTS_INTSTS0)
  854. return 1;
  855. else
  856. return 0;
  857. }
  858. /**
  859. * @brief Clear auto done flag
  860. * @param None
  861. * @retval None
  862. */
  863. void ADC_ClearAutoDoneFlag(void)
  864. {
  865. ANA->INTSTS = ANA_INTSTS_INTSTS1;
  866. }
  867. /**
  868. * @brief Clear manual done flag
  869. * @param None
  870. * @retval None
  871. */
  872. void ADC_ClearManualDoneFlag(void)
  873. {
  874. ANA->INTSTS = ANA_INTSTS_INTSTS0;
  875. }
  876. /*********************************** END OF FILE ******************************/