ch32v20x_adc.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : ch32v20x_adc.c
  3. * Author : WCH
  4. * Version : V1.0.0
  5. * Date : 2021/06/06
  6. * Description : This file provides all the ADC firmware functions.
  7. *********************************************************************************
  8. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
  9. * Attention: This software (modified or not) and binary are used for
  10. * microcontroller manufactured by Nanjing Qinheng Microelectronics.
  11. *******************************************************************************/
  12. #include "ch32v20x_adc.h"
  13. #include "ch32v20x_rcc.h"
  14. /* ADC DISCNUM mask */
  15. #define CTLR1_DISCNUM_Reset ((uint32_t)0xFFFF1FFF)
  16. /* ADC DISCEN mask */
  17. #define CTLR1_DISCEN_Set ((uint32_t)0x00000800)
  18. #define CTLR1_DISCEN_Reset ((uint32_t)0xFFFFF7FF)
  19. /* ADC JAUTO mask */
  20. #define CTLR1_JAUTO_Set ((uint32_t)0x00000400)
  21. #define CTLR1_JAUTO_Reset ((uint32_t)0xFFFFFBFF)
  22. /* ADC JDISCEN mask */
  23. #define CTLR1_JDISCEN_Set ((uint32_t)0x00001000)
  24. #define CTLR1_JDISCEN_Reset ((uint32_t)0xFFFFEFFF)
  25. /* ADC AWDCH mask */
  26. #define CTLR1_AWDCH_Reset ((uint32_t)0xFFFFFFE0)
  27. /* ADC Analog watchdog enable mode mask */
  28. #define CTLR1_AWDMode_Reset ((uint32_t)0xFF3FFDFF)
  29. /* CTLR1 register Mask */
  30. #define CTLR1_CLEAR_Mask ((uint32_t)0xE0F0FEFF)
  31. /* ADC ADON mask */
  32. #define CTLR2_ADON_Set ((uint32_t)0x00000001)
  33. #define CTLR2_ADON_Reset ((uint32_t)0xFFFFFFFE)
  34. /* ADC DMA mask */
  35. #define CTLR2_DMA_Set ((uint32_t)0x00000100)
  36. #define CTLR2_DMA_Reset ((uint32_t)0xFFFFFEFF)
  37. /* ADC RSTCAL mask */
  38. #define CTLR2_RSTCAL_Set ((uint32_t)0x00000008)
  39. /* ADC CAL mask */
  40. #define CTLR2_CAL_Set ((uint32_t)0x00000004)
  41. /* ADC SWSTART mask */
  42. #define CTLR2_SWSTART_Set ((uint32_t)0x00400000)
  43. /* ADC EXTTRIG mask */
  44. #define CTLR2_EXTTRIG_Set ((uint32_t)0x00100000)
  45. #define CTLR2_EXTTRIG_Reset ((uint32_t)0xFFEFFFFF)
  46. /* ADC Software start mask */
  47. #define CTLR2_EXTTRIG_SWSTART_Set ((uint32_t)0x00500000)
  48. #define CTLR2_EXTTRIG_SWSTART_Reset ((uint32_t)0xFFAFFFFF)
  49. /* ADC JEXTSEL mask */
  50. #define CTLR2_JEXTSEL_Reset ((uint32_t)0xFFFF8FFF)
  51. /* ADC JEXTTRIG mask */
  52. #define CTLR2_JEXTTRIG_Set ((uint32_t)0x00008000)
  53. #define CTLR2_JEXTTRIG_Reset ((uint32_t)0xFFFF7FFF)
  54. /* ADC JSWSTART mask */
  55. #define CTLR2_JSWSTART_Set ((uint32_t)0x00200000)
  56. /* ADC injected software start mask */
  57. #define CTLR2_JEXTTRIG_JSWSTART_Set ((uint32_t)0x00208000)
  58. #define CTLR2_JEXTTRIG_JSWSTART_Reset ((uint32_t)0xFFDF7FFF)
  59. /* ADC TSPD mask */
  60. #define CTLR2_TSVREFE_Set ((uint32_t)0x00800000)
  61. #define CTLR2_TSVREFE_Reset ((uint32_t)0xFF7FFFFF)
  62. /* CTLR2 register Mask */
  63. #define CTLR2_CLEAR_Mask ((uint32_t)0xFFF1F7FD)
  64. /* ADC SQx mask */
  65. #define RSQR3_SQ_Set ((uint32_t)0x0000001F)
  66. #define RSQR2_SQ_Set ((uint32_t)0x0000001F)
  67. #define RSQR1_SQ_Set ((uint32_t)0x0000001F)
  68. /* RSQR1 register Mask */
  69. #define RSQR1_CLEAR_Mask ((uint32_t)0xFF0FFFFF)
  70. /* ADC JSQx mask */
  71. #define ISQR_JSQ_Set ((uint32_t)0x0000001F)
  72. /* ADC JL mask */
  73. #define ISQR_JL_Set ((uint32_t)0x00300000)
  74. #define ISQR_JL_Reset ((uint32_t)0xFFCFFFFF)
  75. /* ADC SMPx mask */
  76. #define SAMPTR1_SMP_Set ((uint32_t)0x00000007)
  77. #define SAMPTR2_SMP_Set ((uint32_t)0x00000007)
  78. /* ADC IDATARx registers offset */
  79. #define IDATAR_Offset ((uint8_t)0x28)
  80. /* ADC1 RDATAR register base address */
  81. #define RDATAR_ADDRESS ((uint32_t)0x4001244C)
  82. /*********************************************************************
  83. * @fn ADC_DeInit
  84. *
  85. * @brief Deinitializes the ADCx peripheral registers to their default
  86. * reset values.
  87. *
  88. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  89. *
  90. * @return none
  91. */
  92. void ADC_DeInit(ADC_TypeDef *ADCx)
  93. {
  94. if(ADCx == ADC1)
  95. {
  96. RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE);
  97. RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE);
  98. }
  99. else if(ADCx == ADC2)
  100. {
  101. RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE);
  102. RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE);
  103. }
  104. }
  105. /*********************************************************************
  106. * @fn ADC_Init
  107. *
  108. * @brief Initializes the ADCx peripheral according to the specified
  109. * parameters in the ADC_InitStruct.
  110. *
  111. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  112. * ADC_InitStruct - pointer to an ADC_InitTypeDef structure that
  113. * contains the configuration information for the specified ADC
  114. * peripheral.
  115. *
  116. * @return none
  117. */
  118. void ADC_Init(ADC_TypeDef *ADCx, ADC_InitTypeDef *ADC_InitStruct)
  119. {
  120. uint32_t tmpreg1 = 0;
  121. uint8_t tmpreg2 = 0;
  122. tmpreg1 = ADCx->CTLR1;
  123. tmpreg1 &= CTLR1_CLEAR_Mask;
  124. tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_Mode | (uint32_t)ADC_InitStruct->ADC_OutputBuffer |
  125. (uint32_t)ADC_InitStruct->ADC_Pga | ((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8));
  126. ADCx->CTLR1 = tmpreg1;
  127. tmpreg1 = ADCx->CTLR2;
  128. tmpreg1 &= CTLR2_CLEAR_Mask;
  129. tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv |
  130. ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1));
  131. ADCx->CTLR2 = tmpreg1;
  132. tmpreg1 = ADCx->RSQR1;
  133. tmpreg1 &= RSQR1_CLEAR_Mask;
  134. tmpreg2 |= (uint8_t)(ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1);
  135. tmpreg1 |= (uint32_t)tmpreg2 << 20;
  136. ADCx->RSQR1 = tmpreg1;
  137. }
  138. /*********************************************************************
  139. * @fn ADC_StructInit
  140. *
  141. * @brief Fills each ADC_InitStruct member with its default value.
  142. *
  143. * @param ADC_InitStruct - pointer to an ADC_InitTypeDef structure that
  144. * contains the configuration information for the specified ADC
  145. * peripheral.
  146. *
  147. * @return none
  148. */
  149. void ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct)
  150. {
  151. ADC_InitStruct->ADC_Mode = ADC_Mode_Independent;
  152. ADC_InitStruct->ADC_ScanConvMode = DISABLE;
  153. ADC_InitStruct->ADC_ContinuousConvMode = DISABLE;
  154. ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  155. ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right;
  156. ADC_InitStruct->ADC_NbrOfChannel = 1;
  157. }
  158. /*********************************************************************
  159. * @fn ADC_Cmd
  160. *
  161. * @brief Enables or disables the specified ADC peripheral.
  162. *
  163. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  164. * NewState - ENABLE or DISABLE.
  165. *
  166. * @return none
  167. */
  168. void ADC_Cmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  169. {
  170. if(NewState != DISABLE)
  171. {
  172. ADCx->CTLR2 |= CTLR2_ADON_Set;
  173. }
  174. else
  175. {
  176. ADCx->CTLR2 &= CTLR2_ADON_Reset;
  177. }
  178. }
  179. /*********************************************************************
  180. * @fn ADC_DMACmd
  181. *
  182. * @brief Enables or disables the specified ADC DMA request.
  183. *
  184. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  185. * NewState - ENABLE or DISABLE.
  186. *
  187. * @return none
  188. */
  189. void ADC_DMACmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  190. {
  191. if(NewState != DISABLE)
  192. {
  193. ADCx->CTLR2 |= CTLR2_DMA_Set;
  194. }
  195. else
  196. {
  197. ADCx->CTLR2 &= CTLR2_DMA_Reset;
  198. }
  199. }
  200. /*********************************************************************
  201. * @fn ADC_ITConfig
  202. *
  203. * @brief Enables or disables the specified ADC interrupts.
  204. *
  205. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  206. * ADC_IT - specifies the ADC interrupt sources to be enabled or disabled.
  207. * ADC_IT_EOC - End of conversion interrupt mask.
  208. * ADC_IT_AWD - Analog watchdog interrupt mask.
  209. * ADC_IT_JEOC - End of injected conversion interrupt mask.
  210. * NewState - ENABLE or DISABLE.
  211. *
  212. * @return none
  213. */
  214. void ADC_ITConfig(ADC_TypeDef *ADCx, uint16_t ADC_IT, FunctionalState NewState)
  215. {
  216. uint8_t itmask = 0;
  217. itmask = (uint8_t)ADC_IT;
  218. if(NewState != DISABLE)
  219. {
  220. ADCx->CTLR1 |= itmask;
  221. }
  222. else
  223. {
  224. ADCx->CTLR1 &= (~(uint32_t)itmask);
  225. }
  226. }
  227. /*********************************************************************
  228. * @fn ADC_ResetCalibration
  229. *
  230. * @brief Resets the selected ADC calibration registers.
  231. *
  232. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  233. *
  234. * @return none
  235. */
  236. void ADC_ResetCalibration(ADC_TypeDef *ADCx)
  237. {
  238. ADCx->CTLR2 |= CTLR2_RSTCAL_Set;
  239. }
  240. /*********************************************************************
  241. * @fn ADC_GetResetCalibrationStatus
  242. *
  243. * @brief Gets the selected ADC reset calibration registers status.
  244. *
  245. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  246. *
  247. * @return FlagStatus: SET or RESET.
  248. */
  249. FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef *ADCx)
  250. {
  251. FlagStatus bitstatus = RESET;
  252. if((ADCx->CTLR2 & CTLR2_RSTCAL_Set) != (uint32_t)RESET)
  253. {
  254. bitstatus = SET;
  255. }
  256. else
  257. {
  258. bitstatus = RESET;
  259. }
  260. return bitstatus;
  261. }
  262. /*********************************************************************
  263. * @fn ADC_StartCalibration
  264. *
  265. * @brief Starts the selected ADC calibration process.
  266. *
  267. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  268. *
  269. * @return None
  270. */
  271. void ADC_StartCalibration(ADC_TypeDef *ADCx)
  272. {
  273. ADCx->CTLR2 |= CTLR2_CAL_Set;
  274. }
  275. /*********************************************************************
  276. * @fn ADC_GetCalibrationStatus
  277. *
  278. * @brief Gets the selected ADC calibration status.
  279. *
  280. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  281. *
  282. * @return FlagStatus: SET or RESET.
  283. */
  284. FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef *ADCx)
  285. {
  286. FlagStatus bitstatus = RESET;
  287. if((ADCx->CTLR2 & CTLR2_CAL_Set) != (uint32_t)RESET)
  288. {
  289. bitstatus = SET;
  290. }
  291. else
  292. {
  293. bitstatus = RESET;
  294. }
  295. return bitstatus;
  296. }
  297. /*********************************************************************
  298. * @fn ADC_SoftwareStartConvCmd
  299. *
  300. * @brief Enables or disables the selected ADC software start conversion.
  301. *
  302. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  303. * NewState - ENABLE or DISABLE.
  304. *
  305. * @return None
  306. */
  307. void ADC_SoftwareStartConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  308. {
  309. if(NewState != DISABLE)
  310. {
  311. ADCx->CTLR2 |= CTLR2_EXTTRIG_SWSTART_Set;
  312. }
  313. else
  314. {
  315. ADCx->CTLR2 &= CTLR2_EXTTRIG_SWSTART_Reset;
  316. }
  317. }
  318. /*********************************************************************
  319. * @fn ADC_GetSoftwareStartConvStatus
  320. *
  321. * @brief Gets the selected ADC Software start conversion Status.
  322. *
  323. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  324. *
  325. * @return FlagStatus - SET or RESET.
  326. */
  327. FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef *ADCx)
  328. {
  329. FlagStatus bitstatus = RESET;
  330. if((ADCx->CTLR2 & CTLR2_SWSTART_Set) != (uint32_t)RESET)
  331. {
  332. bitstatus = SET;
  333. }
  334. else
  335. {
  336. bitstatus = RESET;
  337. }
  338. return bitstatus;
  339. }
  340. /*********************************************************************
  341. * @fn ADC_DiscModeChannelCountConfig
  342. *
  343. * @brief Configures the discontinuous mode for the selected ADC regular
  344. * group channel.
  345. *
  346. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  347. * Number - specifies the discontinuous mode regular channel
  348. * count value(1-8).
  349. *
  350. * @return None
  351. */
  352. void ADC_DiscModeChannelCountConfig(ADC_TypeDef *ADCx, uint8_t Number)
  353. {
  354. uint32_t tmpreg1 = 0;
  355. uint32_t tmpreg2 = 0;
  356. tmpreg1 = ADCx->CTLR1;
  357. tmpreg1 &= CTLR1_DISCNUM_Reset;
  358. tmpreg2 = Number - 1;
  359. tmpreg1 |= tmpreg2 << 13;
  360. ADCx->CTLR1 = tmpreg1;
  361. }
  362. /*********************************************************************
  363. * @fn ADC_DiscModeCmd
  364. *
  365. * @brief Enables or disables the discontinuous mode on regular group
  366. * channel for the specified ADC.
  367. *
  368. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  369. * NewState - ENABLE or DISABLE.
  370. *
  371. * @return None
  372. */
  373. void ADC_DiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  374. {
  375. if(NewState != DISABLE)
  376. {
  377. ADCx->CTLR1 |= CTLR1_DISCEN_Set;
  378. }
  379. else
  380. {
  381. ADCx->CTLR1 &= CTLR1_DISCEN_Reset;
  382. }
  383. }
  384. /*********************************************************************
  385. * @fn ADC_RegularChannelConfig
  386. *
  387. * @brief Configures for the selected ADC regular channel its corresponding
  388. * rank in the sequencer and its sample time.
  389. *
  390. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  391. * ADC_Channel - the ADC channel to configure.
  392. * ADC_Channel_0 - ADC Channel0 selected.
  393. * ADC_Channel_1 - ADC Channel1 selected.
  394. * ADC_Channel_2 - ADC Channel2 selected.
  395. * ADC_Channel_3 - ADC Channel3 selected.
  396. * ADC_Channel_4 - ADC Channel4 selected.
  397. * ADC_Channel_5 - ADC Channel5 selected.
  398. * ADC_Channel_6 - ADC Channel6 selected.
  399. * ADC_Channel_7 - ADC Channel7 selected.
  400. * ADC_Channel_8 - ADC Channel8 selected.
  401. * ADC_Channel_9 - ADC Channel9 selected.
  402. * ADC_Channel_10 - ADC Channel10 selected.
  403. * ADC_Channel_11 - ADC Channel11 selected.
  404. * ADC_Channel_12 - ADC Channel12 selected.
  405. * ADC_Channel_13 - ADC Channel13 selected.
  406. * ADC_Channel_14 - ADC Channel14 selected.
  407. * ADC_Channel_15 - ADC Channel15 selected.
  408. * ADC_Channel_16 - ADC Channel16 selected.
  409. * ADC_Channel_17 - ADC Channel17 selected.
  410. * Rank - The rank in the regular group sequencer.
  411. * This parameter must be between 1 to 16.
  412. * ADC_SampleTime - The sample time value to be set for the selected channel.
  413. * ADC_SampleTime_1Cycles5 - Sample time equal to 1.5 cycles.
  414. * ADC_SampleTime_7Cycles5 - Sample time equal to 7.5 cycles.
  415. * ADC_SampleTime_13Cycles5 - Sample time equal to 13.5 cycles.
  416. * ADC_SampleTime_28Cycles5 - Sample time equal to 28.5 cycles.
  417. * ADC_SampleTime_41Cycles5 - Sample time equal to 41.5 cycles.
  418. * ADC_SampleTime_55Cycles5 - Sample time equal to 55.5 cycles.
  419. * ADC_SampleTime_71Cycles5 - Sample time equal to 71.5 cycles.
  420. * ADC_SampleTime_239Cycles5 - Sample time equal to 239.5 cycles.
  421. *
  422. * @return None
  423. */
  424. void ADC_RegularChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
  425. {
  426. uint32_t tmpreg1 = 0, tmpreg2 = 0;
  427. if(ADC_Channel > ADC_Channel_9)
  428. {
  429. tmpreg1 = ADCx->SAMPTR1;
  430. tmpreg2 = SAMPTR1_SMP_Set << (3 * (ADC_Channel - 10));
  431. tmpreg1 &= ~tmpreg2;
  432. tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10));
  433. tmpreg1 |= tmpreg2;
  434. ADCx->SAMPTR1 = tmpreg1;
  435. }
  436. else
  437. {
  438. tmpreg1 = ADCx->SAMPTR2;
  439. tmpreg2 = SAMPTR2_SMP_Set << (3 * ADC_Channel);
  440. tmpreg1 &= ~tmpreg2;
  441. tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel);
  442. tmpreg1 |= tmpreg2;
  443. ADCx->SAMPTR2 = tmpreg1;
  444. }
  445. if(Rank < 7)
  446. {
  447. tmpreg1 = ADCx->RSQR3;
  448. tmpreg2 = RSQR3_SQ_Set << (5 * (Rank - 1));
  449. tmpreg1 &= ~tmpreg2;
  450. tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1));
  451. tmpreg1 |= tmpreg2;
  452. ADCx->RSQR3 = tmpreg1;
  453. }
  454. else if(Rank < 13)
  455. {
  456. tmpreg1 = ADCx->RSQR2;
  457. tmpreg2 = RSQR2_SQ_Set << (5 * (Rank - 7));
  458. tmpreg1 &= ~tmpreg2;
  459. tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7));
  460. tmpreg1 |= tmpreg2;
  461. ADCx->RSQR2 = tmpreg1;
  462. }
  463. else
  464. {
  465. tmpreg1 = ADCx->RSQR1;
  466. tmpreg2 = RSQR1_SQ_Set << (5 * (Rank - 13));
  467. tmpreg1 &= ~tmpreg2;
  468. tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13));
  469. tmpreg1 |= tmpreg2;
  470. ADCx->RSQR1 = tmpreg1;
  471. }
  472. }
  473. /*********************************************************************
  474. * @fn ADC_ExternalTrigConvCmd
  475. *
  476. * @brief Enables or disables the ADCx conversion through external trigger.
  477. *
  478. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  479. * NewState - ENABLE or DISABLE.
  480. *
  481. * @return None
  482. */
  483. void ADC_ExternalTrigConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  484. {
  485. if(NewState != DISABLE)
  486. {
  487. ADCx->CTLR2 |= CTLR2_EXTTRIG_Set;
  488. }
  489. else
  490. {
  491. ADCx->CTLR2 &= CTLR2_EXTTRIG_Reset;
  492. }
  493. }
  494. /*********************************************************************
  495. * @fn ADC_GetConversionValue
  496. *
  497. * @brief Returns the last ADCx conversion result data for regular channel.
  498. *
  499. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  500. *
  501. * @return ADCx->RDATAR - The Data conversion value.
  502. */
  503. uint16_t ADC_GetConversionValue(ADC_TypeDef *ADCx)
  504. {
  505. return (uint16_t)ADCx->RDATAR;
  506. }
  507. /*********************************************************************
  508. * @fn ADC_GetDualModeConversionValue
  509. *
  510. * @brief Returns the last ADC1 and ADC2 conversion result data in dual mode.
  511. *
  512. * @return RDATAR_ADDRESS - The Data conversion value.
  513. */
  514. uint32_t ADC_GetDualModeConversionValue(void)
  515. {
  516. return (*(__IO uint32_t *)RDATAR_ADDRESS);
  517. }
  518. /*********************************************************************
  519. * @fn ADC_AutoInjectedConvCmd
  520. *
  521. * @brief Enables or disables the selected ADC automatic injected group
  522. * conversion after regular one.
  523. *
  524. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  525. * NewState - ENABLE or DISABLE.
  526. *
  527. * @return None
  528. */
  529. void ADC_AutoInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  530. {
  531. if(NewState != DISABLE)
  532. {
  533. ADCx->CTLR1 |= CTLR1_JAUTO_Set;
  534. }
  535. else
  536. {
  537. ADCx->CTLR1 &= CTLR1_JAUTO_Reset;
  538. }
  539. }
  540. /*********************************************************************
  541. * @fn ADC_InjectedDiscModeCmd
  542. *
  543. * @brief Enables or disables the discontinuous mode for injected group
  544. * channel for the specified ADC.
  545. *
  546. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  547. * NewState - ENABLE or DISABLE.
  548. *
  549. * @return None
  550. */
  551. void ADC_InjectedDiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  552. {
  553. if(NewState != DISABLE)
  554. {
  555. ADCx->CTLR1 |= CTLR1_JDISCEN_Set;
  556. }
  557. else
  558. {
  559. ADCx->CTLR1 &= CTLR1_JDISCEN_Reset;
  560. }
  561. }
  562. /*********************************************************************
  563. * @fn ADC_ExternalTrigInjectedConvConfig
  564. *
  565. * @brief Configures the ADCx external trigger for injected channels conversion.
  566. *
  567. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  568. * ADC_ExternalTrigInjecConv - specifies the ADC trigger to start
  569. * injected conversion.
  570. * ADC_ExternalTrigInjecConv_T1_TRGO - Timer1 TRGO event selected.
  571. * ADC_ExternalTrigInjecConv_T1_CC4 - Timer1 capture compare4 selected.
  572. * ADC_ExternalTrigInjecConv_T2_TRGO - Timer2 TRGO event selected.
  573. * ADC_ExternalTrigInjecConv_T2_CC1 - Timer2 capture compare1 selected.
  574. * ADC_ExternalTrigInjecConv_T3_CC4 - Timer3 capture compare4 selected.
  575. * ADC_ExternalTrigInjecConv_T4_TRGO - Timer4 TRGO event selected.
  576. * ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 - External interrupt
  577. * line 15 event selected.
  578. * ADC_ExternalTrigInjecConv_None: Injected conversion started
  579. * by software and not by external trigger.
  580. *
  581. * @return None
  582. */
  583. void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef *ADCx, uint32_t ADC_ExternalTrigInjecConv)
  584. {
  585. uint32_t tmpreg = 0;
  586. tmpreg = ADCx->CTLR2;
  587. tmpreg &= CTLR2_JEXTSEL_Reset;
  588. tmpreg |= ADC_ExternalTrigInjecConv;
  589. ADCx->CTLR2 = tmpreg;
  590. }
  591. /*********************************************************************
  592. * @fn ADC_ExternalTrigInjectedConvCmd
  593. *
  594. * @brief Enables or disables the ADCx injected channels conversion through
  595. * external trigger.
  596. *
  597. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  598. * NewState - ENABLE or DISABLE.
  599. *
  600. * @return None
  601. */
  602. void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  603. {
  604. if(NewState != DISABLE)
  605. {
  606. ADCx->CTLR2 |= CTLR2_JEXTTRIG_Set;
  607. }
  608. else
  609. {
  610. ADCx->CTLR2 &= CTLR2_JEXTTRIG_Reset;
  611. }
  612. }
  613. /*********************************************************************
  614. * @fn ADC_SoftwareStartInjectedConvCmd
  615. *
  616. * @brief Enables or disables the selected ADC start of the injected
  617. * channels conversion.
  618. *
  619. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  620. * NewState - ENABLE or DISABLE.
  621. *
  622. * @return None
  623. */
  624. void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  625. {
  626. if(NewState != DISABLE)
  627. {
  628. ADCx->CTLR2 |= CTLR2_JEXTTRIG_JSWSTART_Set;
  629. }
  630. else
  631. {
  632. ADCx->CTLR2 &= CTLR2_JEXTTRIG_JSWSTART_Reset;
  633. }
  634. }
  635. /*********************************************************************
  636. * @fn ADC_GetSoftwareStartInjectedConvCmdStatus
  637. *
  638. * @brief Gets the selected ADC Software start injected conversion Status.
  639. *
  640. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  641. *
  642. * @return FlagStatus: SET or RESET.
  643. */
  644. FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef *ADCx)
  645. {
  646. FlagStatus bitstatus = RESET;
  647. if((ADCx->CTLR2 & CTLR2_JSWSTART_Set) != (uint32_t)RESET)
  648. {
  649. bitstatus = SET;
  650. }
  651. else
  652. {
  653. bitstatus = RESET;
  654. }
  655. return bitstatus;
  656. }
  657. /*********************************************************************
  658. * @fn ADC_InjectedChannelConfig
  659. *
  660. * @brief Configures for the selected ADC injected channel its corresponding
  661. * rank in the sequencer and its sample time.
  662. *
  663. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  664. * ADC_Channel - the ADC channel to configure.
  665. * ADC_Channel_0 - ADC Channel0 selected.
  666. * ADC_Channel_1 - ADC Channel1 selected.
  667. * ADC_Channel_2 - ADC Channel2 selected.
  668. * ADC_Channel_3 - ADC Channel3 selected.
  669. * ADC_Channel_4 - ADC Channel4 selected.
  670. * ADC_Channel_5 - ADC Channel5 selected.
  671. * ADC_Channel_6 - ADC Channel6 selected.
  672. * ADC_Channel_7 - ADC Channel7 selected.
  673. * ADC_Channel_8 - ADC Channel8 selected.
  674. * ADC_Channel_9 - ADC Channel9 selected.
  675. * ADC_Channel_10 - ADC Channel10 selected.
  676. * ADC_Channel_11 - ADC Channel11 selected.
  677. * ADC_Channel_12 - ADC Channel12 selected.
  678. * ADC_Channel_13 - ADC Channel13 selected.
  679. * ADC_Channel_14 - ADC Channel14 selected.
  680. * ADC_Channel_15 - ADC Channel15 selected.
  681. * ADC_Channel_16 - ADC Channel16 selected.
  682. * ADC_Channel_17 - ADC Channel17 selected.
  683. * Rank - The rank in the regular group sequencer.
  684. * This parameter must be between 1 to 4.
  685. * ADC_SampleTime - The sample time value to be set for the selected channel.
  686. * ADC_SampleTime_1Cycles5 - Sample time equal to 1.5 cycles.
  687. * ADC_SampleTime_7Cycles5 - Sample time equal to 7.5 cycles.
  688. * ADC_SampleTime_13Cycles5 - Sample time equal to 13.5 cycles.
  689. * ADC_SampleTime_28Cycles5 - Sample time equal to 28.5 cycles.
  690. * ADC_SampleTime_41Cycles5 - Sample time equal to 41.5 cycles.
  691. * ADC_SampleTime_55Cycles5 - Sample time equal to 55.5 cycles.
  692. * ADC_SampleTime_71Cycles5 - Sample time equal to 71.5 cycles.
  693. * ADC_SampleTime_239Cycles5 - Sample time equal to 239.5 cycles.
  694. *
  695. * @return None
  696. */
  697. void ADC_InjectedChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
  698. {
  699. uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0;
  700. if(ADC_Channel > ADC_Channel_9)
  701. {
  702. tmpreg1 = ADCx->SAMPTR1;
  703. tmpreg2 = SAMPTR1_SMP_Set << (3 * (ADC_Channel - 10));
  704. tmpreg1 &= ~tmpreg2;
  705. tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10));
  706. tmpreg1 |= tmpreg2;
  707. ADCx->SAMPTR1 = tmpreg1;
  708. }
  709. else
  710. {
  711. tmpreg1 = ADCx->SAMPTR2;
  712. tmpreg2 = SAMPTR2_SMP_Set << (3 * ADC_Channel);
  713. tmpreg1 &= ~tmpreg2;
  714. tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel);
  715. tmpreg1 |= tmpreg2;
  716. ADCx->SAMPTR2 = tmpreg1;
  717. }
  718. tmpreg1 = ADCx->ISQR;
  719. tmpreg3 = (tmpreg1 & ISQR_JL_Set) >> 20;
  720. tmpreg2 = ISQR_JSQ_Set << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1)));
  721. tmpreg1 &= ~tmpreg2;
  722. tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1)));
  723. tmpreg1 |= tmpreg2;
  724. ADCx->ISQR = tmpreg1;
  725. }
  726. /*********************************************************************
  727. * @fn ADC_InjectedSequencerLengthConfig
  728. *
  729. * @brief Configures the sequencer length for injected channels.
  730. *
  731. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  732. * Length - The sequencer length.
  733. * This parameter must be a number between 1 to 4.
  734. *
  735. * @return None
  736. */
  737. void ADC_InjectedSequencerLengthConfig(ADC_TypeDef *ADCx, uint8_t Length)
  738. {
  739. uint32_t tmpreg1 = 0;
  740. uint32_t tmpreg2 = 0;
  741. tmpreg1 = ADCx->ISQR;
  742. tmpreg1 &= ISQR_JL_Reset;
  743. tmpreg2 = Length - 1;
  744. tmpreg1 |= tmpreg2 << 20;
  745. ADCx->ISQR = tmpreg1;
  746. }
  747. /*********************************************************************
  748. * @fn ADC_SetInjectedOffset
  749. *
  750. * @brief Set the injected channels conversion value offset.
  751. *
  752. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  753. * ADC_InjectedChannel: the ADC injected channel to set its offset.
  754. * ADC_InjectedChannel_1 - Injected Channel1 selected.
  755. * ADC_InjectedChannel_2 - Injected Channel2 selected.
  756. * ADC_InjectedChannel_3 - Injected Channel3 selected.
  757. * ADC_InjectedChannel_4 - Injected Channel4 selected.
  758. * Offset - the offset value for the selected ADC injected channel.
  759. * This parameter must be a 12bit value.
  760. *
  761. * @return None
  762. */
  763. void ADC_SetInjectedOffset(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset)
  764. {
  765. __IO uint32_t tmp = 0;
  766. tmp = (uint32_t)ADCx;
  767. tmp += ADC_InjectedChannel;
  768. *(__IO uint32_t *)tmp = (uint32_t)Offset;
  769. }
  770. /*********************************************************************
  771. * @fn ADC_GetInjectedConversionValue
  772. *
  773. * @brief Returns the ADC injected channel conversion result.
  774. *
  775. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  776. * ADC_InjectedChannel - the ADC injected channel to set its offset.
  777. * ADC_InjectedChannel_1 - Injected Channel1 selected.
  778. * ADC_InjectedChannel_2 - Injected Channel2 selected.
  779. * ADC_InjectedChannel_3 - Injected Channel3 selected.
  780. * ADC_InjectedChannel_4 - Injected Channel4 selected.
  781. *
  782. * @return tmp - The Data conversion value.
  783. */
  784. uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel)
  785. {
  786. __IO uint32_t tmp = 0;
  787. tmp = (uint32_t)ADCx;
  788. tmp += ADC_InjectedChannel + IDATAR_Offset;
  789. return (uint16_t)(*(__IO uint32_t *)tmp);
  790. }
  791. /*********************************************************************
  792. * @fn ADC_AnalogWatchdogCmd
  793. *
  794. * @brief Enables or disables the analog watchdog on single/all regular
  795. * or injected channels.
  796. *
  797. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  798. * ADC_AnalogWatchdog - the ADC analog watchdog configuration.
  799. * ADC_AnalogWatchdog_SingleRegEnable - Analog watchdog on a
  800. * single regular channel.
  801. * ADC_AnalogWatchdog_SingleInjecEnable - Analog watchdog on a
  802. * single injected channel.
  803. * ADC_AnalogWatchdog_SingleRegOrInjecEnable - Analog watchdog
  804. * on a single regular or injected channel.
  805. * ADC_AnalogWatchdog_AllRegEnable - Analog watchdog on all
  806. * regular channel.
  807. * ADC_AnalogWatchdog_AllInjecEnable - Analog watchdog on all
  808. * injected channel.
  809. * ADC_AnalogWatchdog_AllRegAllInjecEnable - Analog watchdog on
  810. * all regular and injected channels.
  811. * ADC_AnalogWatchdog_None - No channel guarded by the analog
  812. * watchdog.
  813. *
  814. * @return none
  815. */
  816. void ADC_AnalogWatchdogCmd(ADC_TypeDef *ADCx, uint32_t ADC_AnalogWatchdog)
  817. {
  818. uint32_t tmpreg = 0;
  819. tmpreg = ADCx->CTLR1;
  820. tmpreg &= CTLR1_AWDMode_Reset;
  821. tmpreg |= ADC_AnalogWatchdog;
  822. ADCx->CTLR1 = tmpreg;
  823. }
  824. /*********************************************************************
  825. * @fn ADC_AnalogWatchdogThresholdsConfig
  826. *
  827. * @brief Configures the high and low thresholds of the analog watchdog.
  828. *
  829. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  830. * HighThreshold - the ADC analog watchdog High threshold value.
  831. * This parameter must be a 12bit value.
  832. * LowThreshold - the ADC analog watchdog Low threshold value.
  833. * This parameter must be a 12bit value.
  834. *
  835. * @return none
  836. */
  837. void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef *ADCx, uint16_t HighThreshold,
  838. uint16_t LowThreshold)
  839. {
  840. ADCx->WDHTR = HighThreshold;
  841. ADCx->WDLTR = LowThreshold;
  842. }
  843. /*********************************************************************
  844. * @fn ADC_AnalogWatchdogSingleChannelConfig
  845. *
  846. * @brief Configures the analog watchdog guarded single channel.
  847. *
  848. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  849. * ADC_Channel - the ADC channel to configure.
  850. * ADC_Channel_0 - ADC Channel0 selected.
  851. * ADC_Channel_1 - ADC Channel1 selected.
  852. * ADC_Channel_2 - ADC Channel2 selected.
  853. * ADC_Channel_3 - ADC Channel3 selected.
  854. * ADC_Channel_4 - ADC Channel4 selected.
  855. * ADC_Channel_5 - ADC Channel5 selected.
  856. * ADC_Channel_6 - ADC Channel6 selected.
  857. * ADC_Channel_7 - ADC Channel7 selected.
  858. * ADC_Channel_8 - ADC Channel8 selected.
  859. * ADC_Channel_9 - ADC Channel9 selected.
  860. * ADC_Channel_10 - ADC Channel10 selected.
  861. * ADC_Channel_11 - ADC Channel11 selected.
  862. * ADC_Channel_12 - ADC Channel12 selected.
  863. * ADC_Channel_13 - ADC Channel13 selected.
  864. * ADC_Channel_14 - ADC Channel14 selected.
  865. * ADC_Channel_15 - ADC Channel15 selected.
  866. * ADC_Channel_16 - ADC Channel16 selected.
  867. * ADC_Channel_17 - ADC Channel17 selected.
  868. *
  869. * @return None
  870. */
  871. void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel)
  872. {
  873. uint32_t tmpreg = 0;
  874. tmpreg = ADCx->CTLR1;
  875. tmpreg &= CTLR1_AWDCH_Reset;
  876. tmpreg |= ADC_Channel;
  877. ADCx->CTLR1 = tmpreg;
  878. }
  879. /*********************************************************************
  880. * @fn ADC_TempSensorVrefintCmd
  881. *
  882. * @brief Enables or disables the temperature sensor and Vrefint channel.
  883. *
  884. * @param NewState - ENABLE or DISABLE.
  885. *
  886. * @return none
  887. */
  888. void ADC_TempSensorVrefintCmd(FunctionalState NewState)
  889. {
  890. if(NewState != DISABLE)
  891. {
  892. ADC1->CTLR2 |= CTLR2_TSVREFE_Set;
  893. }
  894. else
  895. {
  896. ADC1->CTLR2 &= CTLR2_TSVREFE_Reset;
  897. }
  898. }
  899. /*********************************************************************
  900. * @fn ADC_GetFlagStatus
  901. *
  902. * @brief Checks whether the specified ADC flag is set or not.
  903. *
  904. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  905. * ADC_FLAG - specifies the flag to check.
  906. * ADC_FLAG_AWD - Analog watchdog flag.
  907. * ADC_FLAG_EOC - End of conversion flag.
  908. * ADC_FLAG_JEOC - End of injected group conversion flag.
  909. * ADC_FLAG_JSTRT - Start of injected group conversion flag.
  910. * ADC_FLAG_STRT - Start of regular group conversion flag.
  911. *
  912. * @return FlagStatus: SET or RESET.
  913. */
  914. FlagStatus ADC_GetFlagStatus(ADC_TypeDef *ADCx, uint8_t ADC_FLAG)
  915. {
  916. FlagStatus bitstatus = RESET;
  917. if((ADCx->STATR & ADC_FLAG) != (uint8_t)RESET)
  918. {
  919. bitstatus = SET;
  920. }
  921. else
  922. {
  923. bitstatus = RESET;
  924. }
  925. return bitstatus;
  926. }
  927. /*********************************************************************
  928. * @fn ADC_ClearFlag
  929. *
  930. * @brief Clears the ADCx's pending flags.
  931. *
  932. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  933. * ADC_FLAG - specifies the flag to clear.
  934. * ADC_FLAG_AWD - Analog watchdog flag.
  935. * ADC_FLAG_EOC - End of conversion flag.
  936. * ADC_FLAG_JEOC - End of injected group conversion flag.
  937. * ADC_FLAG_JSTRT - Start of injected group conversion flag.
  938. * ADC_FLAG_STRT - Start of regular group conversion flag.
  939. *
  940. * @return none
  941. */
  942. void ADC_ClearFlag(ADC_TypeDef *ADCx, uint8_t ADC_FLAG)
  943. {
  944. ADCx->STATR = ~(uint32_t)ADC_FLAG;
  945. }
  946. /*********************************************************************
  947. * @fn ADC_GetITStatus
  948. *
  949. * @brief Checks whether the specified ADC interrupt has occurred or not.
  950. *
  951. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  952. * ADC_IT - specifies the ADC interrupt source to check.
  953. * ADC_IT_EOC - End of conversion interrupt mask.
  954. * ADC_IT_AWD - Analog watchdog interrupt mask.
  955. * ADC_IT_JEOC - End of injected conversion interrupt mask.
  956. *
  957. * @return FlagStatus: SET or RESET.
  958. */
  959. ITStatus ADC_GetITStatus(ADC_TypeDef *ADCx, uint16_t ADC_IT)
  960. {
  961. ITStatus bitstatus = RESET;
  962. uint32_t itmask = 0, enablestatus = 0;
  963. itmask = ADC_IT >> 8;
  964. enablestatus = (ADCx->CTLR1 & (uint8_t)ADC_IT);
  965. if(((ADCx->STATR & itmask) != (uint32_t)RESET) && enablestatus)
  966. {
  967. bitstatus = SET;
  968. }
  969. else
  970. {
  971. bitstatus = RESET;
  972. }
  973. return bitstatus;
  974. }
  975. /*********************************************************************
  976. * @fn ADC_ClearITPendingBit
  977. *
  978. * @brief Clears the ADCx's interrupt pending bits.
  979. *
  980. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  981. * ADC_IT - specifies the ADC interrupt pending bit to clear.
  982. * ADC_IT_EOC - End of conversion interrupt mask.
  983. * ADC_IT_AWD - Analog watchdog interrupt mask.
  984. * ADC_IT_JEOC - End of injected conversion interrupt mask.
  985. *
  986. * @return none
  987. */
  988. void ADC_ClearITPendingBit(ADC_TypeDef *ADCx, uint16_t ADC_IT)
  989. {
  990. uint8_t itmask = 0;
  991. itmask = (uint8_t)(ADC_IT >> 8);
  992. ADCx->STATR = ~(uint32_t)itmask;
  993. }
  994. /*********************************************************************
  995. * @fn TempSensor_Volt_To_Temper
  996. *
  997. * @brief Internal Temperature Sensor Voltage to temperature.
  998. *
  999. * @param Value - Voltage Value(mv).
  1000. *
  1001. * @return Temper - Temperature Value.
  1002. */
  1003. s32 TempSensor_Volt_To_Temper(s32 Value)
  1004. {
  1005. s32 Temper, Refer_Volt, Refer_Temper;
  1006. s32 k = 43;
  1007. Refer_Volt = (s32)((*(u32 *)0x1FFFF720) & 0x0000FFFF);
  1008. Refer_Temper = (s32)(((*(u32 *)0x1FFFF720) >> 16) & 0x0000FFFF);
  1009. Temper = Refer_Temper - ((Value - Refer_Volt) * 10 + (k >> 1)) / k;
  1010. return Temper;
  1011. }
  1012. /*********************************************************************
  1013. * @fn ADC_BufferCmd
  1014. *
  1015. * @brief Enables or disables the ADCx buffer.
  1016. *
  1017. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  1018. * NewState - ENABLE or DISABLE.
  1019. *
  1020. * @return none
  1021. */
  1022. void ADC_BufferCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
  1023. {
  1024. if(NewState != DISABLE)
  1025. {
  1026. ADCx->CTLR1 |= (1 << 26);
  1027. }
  1028. else
  1029. {
  1030. ADCx->CTLR1 &= ~(1 << 26);
  1031. }
  1032. }
  1033. /*********************************************************************
  1034. * @fn Get_CalibrationValue
  1035. *
  1036. * @brief Get ADCx Calibration Value.
  1037. *
  1038. * @param ADCx - where x can be 1 or 2 to select the ADC peripheral.
  1039. *
  1040. * @return CalibrationValue
  1041. */
  1042. int16_t Get_CalibrationValue(ADC_TypeDef *ADCx)
  1043. {
  1044. __IO uint8_t i, j;
  1045. uint16_t buf[10];
  1046. __IO uint16_t t;
  1047. #if defined (CH32V20x_D6)
  1048. __IO uint16_t p;
  1049. #endif
  1050. for(i = 0; i < 10; i++){
  1051. ADC_ResetCalibration(ADCx);
  1052. while(ADC_GetResetCalibrationStatus(ADCx));
  1053. ADC_StartCalibration(ADCx);
  1054. while(ADC_GetCalibrationStatus(ADCx));
  1055. buf[i] = ADCx->RDATAR;
  1056. }
  1057. for(i = 0; i < 10; i++){
  1058. for(j = 0; j < 9; j++){
  1059. if(buf[j] > buf[j + 1])
  1060. {
  1061. t = buf[j];
  1062. buf[j] = buf[j + 1];
  1063. buf[j + 1] = t;
  1064. }
  1065. }
  1066. }
  1067. #if defined (CH32V20x_D8) || defined (CH32V20x_D8W)
  1068. t = 0;
  1069. for( i = 0; i < 6; i++ ) {
  1070. t += buf[i + 2];
  1071. }
  1072. t = ( t / 6 ) + ( ( t % 6 ) / 3 );
  1073. return ( int16_t )( 2048 - ( int16_t )t );
  1074. #else
  1075. t = 0;
  1076. p = 0;
  1077. /* 1024 */
  1078. for(i = 0; i < 6; i++ ){
  1079. if(buf[i+2] > 1536) break;
  1080. t += buf[i+2];
  1081. }
  1082. if(i > 0){
  1083. t = ( t / i ) + ( (( t % i )*2) / i );
  1084. }
  1085. else t = 1024;
  1086. /* 2048 */
  1087. j = 6-i;
  1088. if(j > 0){
  1089. for(; i < 6; i++ ){
  1090. p += buf[i+2];
  1091. }
  1092. p = ( p / j ) + ( (( p % j )*2) / j );
  1093. }
  1094. else p = 2048;
  1095. return ( int16_t )(((( int16_t )( 1024 - ( int16_t )t ) + ( int16_t )( 2048 - ( int16_t )p ))/2) + ((( int16_t )( 1024 - ( int16_t )t ) + ( int16_t )( 2048 - ( int16_t )p ))%2));
  1096. #endif
  1097. }