apm32f0xx_adc.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. /*!
  2. * @file apm32f0xx_adc.h
  3. *
  4. * @brief This file contains all the functions prototypes for the ADC firmware library
  5. *
  6. * @version V1.0.3
  7. *
  8. * @date 2022-09-20
  9. *
  10. * @attention
  11. *
  12. * Copyright (C) 2020-2022 Geehy Semiconductor
  13. *
  14. * You may not use this file except in compliance with the
  15. * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
  16. *
  17. * The program is only for reference, which is distributed in the hope
  18. * that it will be useful and instructional for customers to develop
  19. * their software. Unless required by applicable law or agreed to in
  20. * writing, the program is distributed on an "AS IS" BASIS, WITHOUT
  21. * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
  23. * and limitations under the License.
  24. */
  25. /* Define to prevent recursive inclusion */
  26. #ifndef __APM32F0XX_ADC_H
  27. #define __APM32F0XX_ADC_H
  28. #ifdef __cplusplus
  29. extern "C" {
  30. #endif
  31. /* Includes */
  32. #include "apm32f0xx.h"
  33. /** @addtogroup APM32F0xx_StdPeriphDriver
  34. @{
  35. */
  36. /** @addtogroup ADC_Driver
  37. @{
  38. */
  39. /** @defgroup ADC_Macros Macros
  40. @{
  41. */
  42. /* ADC_channels */
  43. #define ADC_Channel_TempSensor ((uint32_t)ADC_CHANNEL_16) /*!< ADC TempSensor Channel definition */
  44. #define ADC_Channel_Vrefint ((uint32_t)ADC_CHANNEL_17) /*!< ADC Vrefint Channel definition */
  45. #define ADC_Channel_Vbat ((uint32_t)ADC_CHANNEL_18) /*!< ADC Vbat Channel definition */
  46. /* ADC CFG mask */
  47. #define CFG1_CLEAR_MASK ((uint32_t)0xFFFFD203)
  48. /* Calibration time out */
  49. #define CALIBRATION_TIMEOUT ((uint32_t)0x0000F000)
  50. /**@} end of group ADC_Macros */
  51. /** @defgroup ADC_Enumerations Enumerations
  52. @{
  53. */
  54. /**
  55. * @brief ADC conversion mode
  56. */
  57. typedef enum
  58. {
  59. ADC_CONVERSION_SINGLE = ((uint8_t)0), /*!< Single conversion mode */
  60. ADC_CONVERSION_CONTINUOUS = ((uint8_t)1), /*!< Continuous conversion mode */
  61. } ADC_CONVERSION_T;
  62. /**
  63. * @brief ADC Jitter
  64. */
  65. typedef enum
  66. {
  67. ADC_JITTER_PCLKDIV2 = ((uint8_t)0x01), /*!< ADC clocked by PCLK div2 */
  68. ADC_JITTER_PCLKDIV4 = ((uint8_t)0x02), /*!< ADC clocked by PCLK div4 */
  69. } ADC_JITTER_T;
  70. /**
  71. * @brief ADC clock mode
  72. */
  73. typedef enum
  74. {
  75. ADC_CLOCK_MODE_ASYNCLK = ((uint8_t)0x00), /*!< ADC Asynchronous clock mode */
  76. ADC_CLOCK_MODE_SYNCLKDIV2 = ((uint8_t)0x01), /*!< Synchronous clock mode divided by 2 */
  77. ADC_CLOCK_MODE_SYNCLKDIV4 = ((uint8_t)0x02), /*!< Synchronous clock mode divided by 4 */
  78. } ADC_CLOCK_MODE_T;
  79. /**
  80. * @brief ADC data resolution
  81. */
  82. typedef enum
  83. {
  84. ADC_RESOLUTION_12B = ((uint8_t)0x00), /*!< ADC Resolution is 12 bits */
  85. ADC_RESOLUTION_10B = ((uint8_t)0x01), /*!< ADC Resolution is 10 bits */
  86. ADC_RESOLUTION_8B = ((uint8_t)0x02), /*!< ADC Resolution is 8 bits */
  87. ADC_RESOLUTION_6B = ((uint8_t)0x03), /*!< ADC Resolution is 6 bits */
  88. } ADC_RESOLUTION_T;
  89. /**
  90. * @brief ADC data alignment
  91. */
  92. typedef enum
  93. {
  94. ADC_DATA_ALIGN_RIGHT = ((uint8_t)0), /*!< Data alignment right */
  95. ADC_DATA_ALIGN_LEFT = ((uint8_t)1), /*!< Data alignment left */
  96. } ADC_DATA_ALIGN_T;
  97. /**
  98. * @brief ADC scan sequence direction
  99. */
  100. typedef enum
  101. {
  102. ADC_SCAN_DIR_UPWARD = ((uint8_t)0), /*!< from CHSEL0 to CHSEL17 */
  103. ADC_SCAN_DIR_BACKWARD = ((uint8_t)1), /*!< from CHSEL17 to CHSEL0 */
  104. } ADC_SCAN_DIR_T;
  105. /**
  106. * @brief ADC DMA Mode
  107. */
  108. typedef enum
  109. {
  110. ADC_DMA_MODE_ONESHOUT = ((uint8_t)0), /*!< ADC DMA Mode Select one shot */
  111. ADC_DMA_MODE_CIRCULAR = ((uint8_t)1), /*!< ADC DMA Mode Select circular */
  112. } ADC_DMA_MODE_T;
  113. /**
  114. * @brief ADC external conversion trigger edge selectio
  115. */
  116. typedef enum
  117. {
  118. ADC_EXT_TRIG_EDGE_NONE = ((uint8_t)0x00), /*!< ADC External Trigger Conversion mode disabled */
  119. ADC_EXT_TRIG_EDGE_RISING = ((uint8_t)0x01), /*!< ADC External Trigger Conversion mode rising edge */
  120. ADC_EXT_TRIG_EDGE_FALLING = ((uint8_t)0x02), /*!< ADC External Trigger Conversion mode falling edge */
  121. ADC_EXT_TRIG_EDGE_ALL = ((uint8_t)0x03), /*!< ADC External Trigger Conversion mode rising and falling edges */
  122. } ADC_EXT_TRIG_EDGE_T;
  123. /**
  124. * @brief ADC external trigger sources selection
  125. */
  126. typedef enum
  127. {
  128. ADC_EXT_TRIG_CONV_TRG0 = ((uint8_t)0x00), /*!< ADC External Trigger Conversion timer1 TRG0 */
  129. ADC_EXT_TRIG_CONV_TRG1 = ((uint8_t)0x01), /*!< ADC External Trigger Conversion timer1 CC4 */
  130. ADC_EXT_TRIG_CONV_TRG2 = ((uint8_t)0x02), /*!< ADC External Trigger Conversion timer2 TRGO */
  131. ADC_EXT_TRIG_CONV_TRG3 = ((uint8_t)0x03), /*!< ADC External Trigger Conversion timer3 TRG0 */
  132. ADC_EXT_TRIG_CONV_TRG4 = ((uint8_t)0x04), /*!< ADC External Trigger Conversion timer15 TRG0 */
  133. } ADC_EXT_TRIG_CONV_T;
  134. /**
  135. * @brief ADC analog watchdog channel selection
  136. */
  137. typedef enum
  138. {
  139. ADC_ANALG_WDT_CHANNEL_0 = ((uint8_t)0x00), /*!< AWD Channel 0 */
  140. ADC_ANALG_WDT_CHANNEL_1 = ((uint8_t)0x01), /*!< AWD Channel 1 */
  141. ADC_ANALG_WDT_CHANNEL_2 = ((uint8_t)0x02), /*!< AWD Channel 2 */
  142. ADC_ANALG_WDT_CHANNEL_3 = ((uint8_t)0x03), /*!< AWD Channel 3 */
  143. ADC_ANALG_WDT_CHANNEL_4 = ((uint8_t)0x04), /*!< AWD Channel 4 */
  144. ADC_ANALG_WDT_CHANNEL_5 = ((uint8_t)0x05), /*!< AWD Channel 5 */
  145. ADC_ANALG_WDT_CHANNEL_6 = ((uint8_t)0x06), /*!< AWD Channel 6 */
  146. ADC_ANALG_WDT_CHANNEL_7 = ((uint8_t)0x07), /*!< AWD Channel 7 */
  147. ADC_ANALG_WDT_CHANNEL_8 = ((uint8_t)0x08), /*!< AWD Channel 8 */
  148. ADC_ANALG_WDT_CHANNEL_9 = ((uint8_t)0x09), /*!< AWD Channel 9 */
  149. ADC_ANALG_WDT_CHANNEL_10 = ((uint8_t)0x0A), /*!< AWD Channel 10 */
  150. ADC_ANALG_WDT_CHANNEL_11 = ((uint8_t)0x0B), /*!< AWD Channel 11 */
  151. ADC_ANALG_WDT_CHANNEL_12 = ((uint8_t)0x0C), /*!< AWD Channel 12 */
  152. ADC_ANALG_WDT_CHANNEL_13 = ((uint8_t)0x0D), /*!< AWD Channel 13 */
  153. ADC_ANALG_WDT_CHANNEL_14 = ((uint8_t)0x0E), /*!< AWD Channel 14 */
  154. ADC_ANALG_WDT_CHANNEL_15 = ((uint8_t)0x0F), /*!< AWD Channel 15 */
  155. ADC_ANALG_WDT_CHANNEL_16 = ((uint8_t)0x10), /*!< AWD Channel 16 */
  156. ADC_ANALG_WDT_CHANNEL_17 = ((uint8_t)0x11), /*!< AWD Channel 17 */
  157. ADC_ANALG_WDT_CHANNEL_18 = ((uint8_t)0x12), /*!< AWD Channel 18 */
  158. } ADC_ANALG_WDT_CHANNEL_T;
  159. /**
  160. * @brief ADC sampling times
  161. */
  162. typedef enum
  163. {
  164. ADC_SAMPLE_TIME_1_5 = ((uint8_t)0x00), /*!< 1.5 ADC clock cycles */
  165. ADC_SAMPLE_TIME_7_5 = ((uint8_t)0x01), /*!< 7.5 ADC clock cycles */
  166. ADC_SAMPLE_TIME_13_5 = ((uint8_t)0x02), /*!< 13.5 ADC clock cycles */
  167. ADC_SAMPLE_TIME_28_5 = ((uint8_t)0x03), /*!< 28.5 ADC clock cycles */
  168. ADC_SAMPLE_TIME_41_5 = ((uint8_t)0x04), /*!< 41.5 ADC clock cycles */
  169. ADC_SAMPLE_TIME_55_5 = ((uint8_t)0x05), /*!< 55.5 ADC clock cycles */
  170. ADC_SAMPLE_TIME_71_5 = ((uint8_t)0x06), /*!< 71.5 ADC clock cycles */
  171. ADC_SAMPLE_TIME_239_5 = ((uint8_t)0x07), /*!< 239.5 ADC clock cycles */
  172. } ADC_SAMPLE_TIME_T;
  173. /**
  174. * @brief ADC channel selection
  175. */
  176. typedef enum
  177. {
  178. ADC_CHANNEL_0 = ((uint32_t)0x00000001), /*!< ADC Channel 0 */
  179. ADC_CHANNEL_1 = ((uint32_t)0x00000002), /*!< ADC Channel 1 */
  180. ADC_CHANNEL_2 = ((uint32_t)0x00000004), /*!< ADC Channel 2 */
  181. ADC_CHANNEL_3 = ((uint32_t)0x00000008), /*!< ADC Channel 3 */
  182. ADC_CHANNEL_4 = ((uint32_t)0x00000010), /*!< ADC Channel 4 */
  183. ADC_CHANNEL_5 = ((uint32_t)0x00000020), /*!< ADC Channel 5 */
  184. ADC_CHANNEL_6 = ((uint32_t)0x00000040), /*!< ADC Channel 6 */
  185. ADC_CHANNEL_7 = ((uint32_t)0x00000080), /*!< ADC Channel 7 */
  186. ADC_CHANNEL_8 = ((uint32_t)0x00000100), /*!< ADC Channel 8 */
  187. ADC_CHANNEL_9 = ((uint32_t)0x00000200), /*!< ADC Channel 9 */
  188. ADC_CHANNEL_10 = ((uint32_t)0x00000400), /*!< ADC Channel 10 */
  189. ADC_CHANNEL_11 = ((uint32_t)0x00000800), /*!< ADC Channel 11 */
  190. ADC_CHANNEL_12 = ((uint32_t)0x00001000), /*!< ADC Channel 12 */
  191. ADC_CHANNEL_13 = ((uint32_t)0x00002000), /*!< ADC Channel 13 */
  192. ADC_CHANNEL_14 = ((uint32_t)0x00004000), /*!< ADC Channel 14 */
  193. ADC_CHANNEL_15 = ((uint32_t)0x00008000), /*!< ADC Channel 15 */
  194. ADC_CHANNEL_16 = ((uint32_t)0x00010000), /*!< ADC Channel 16 */
  195. ADC_CHANNEL_17 = ((uint32_t)0x00020000), /*!< ADC Channel 17 */
  196. ADC_CHANNEL_18 = ((uint32_t)0x00040000), /*!< ADC Channel 18 (Not for APM32F030 devices) */
  197. } ADC_CHANNEL_T;
  198. /**
  199. * @brief ADC interrupts definition
  200. */
  201. typedef enum
  202. {
  203. ADC_INT_ADRDY = ((uint8_t)0x01), /*!< ADC ready interrupt */
  204. ADC_INT_CSMP = ((uint8_t)0x02), /*!< End of sampling interrupt */
  205. ADC_INT_CC = ((uint8_t)0x04), /*!< End of conversion interrupt */
  206. ADC_INT_CS = ((uint8_t)0x08), /*!< End of sequence interrupt */
  207. ADC_INT_OVR = ((uint8_t)0x10), /*!< ADC overrun interrupt */
  208. ADC_INT_AWD = ((uint8_t)0x80), /*!< Analog watchdog interrupt */
  209. } ADC_INT_T;
  210. /**
  211. * @brief ADC Interrupt flag
  212. */
  213. typedef enum
  214. {
  215. ADC_INT_FLAG_ADRDY = ((uint8_t)0x01), /*!< ADC ready interrupt flag */
  216. ADC_INT_FLAG_CSMP = ((uint8_t)0x02), /*!< End of sampling interrupt flag */
  217. ADC_INT_FLAG_CC = ((uint8_t)0x04), /*!< End of conversion interrupt flag */
  218. ADC_INT_FLAG_CS = ((uint8_t)0x08), /*!< End of sequence interrupt flag */
  219. ADC_INT_FLAG_OVR = ((uint8_t)0x10), /*!< ADC overrun interrupt flag */
  220. ADC_INT_FLAG_AWD = ((uint8_t)0x80), /*!< Analog watchdog interrupt flag */
  221. } ADC_INT_FLAG_T;
  222. /**
  223. * @brief ADC flag
  224. */
  225. typedef enum
  226. {
  227. ADC_FLAG_ADCON = ((uint32_t)0x01000001), /*!< ADC enable flag */
  228. ADC_FLAG_ADCOFF = ((uint32_t)0x01000002), /*!< ADC disable flag */
  229. ADC_FLAG_ADCSTA = ((uint32_t)0x01000004), /*!< ADC start conversion flag */
  230. ADC_FLAG_ADCSTOP = ((uint32_t)0x01000010), /*!< ADC stop conversion flag */
  231. ADC_FLAG_ADCCAL = ((int) 0x81000000), /*!< ADC calibration flag */
  232. ADC_FLAG_ADRDY = ((uint8_t)0x01), /*!< ADC ready flag */
  233. ADC_FLAG_CSMP = ((uint8_t)0x02), /*!< End of sampling flag */
  234. ADC_FLAG_CC = ((uint8_t)0x04), /*!< End of conversion flag */
  235. ADC_FLAG_CS = ((uint8_t)0x08), /*!< End of sequence flag */
  236. ADC_FLAG_OVR = ((uint8_t)0x10), /*!< ADC overrun flag */
  237. ADC_FLAG_AWD = ((uint8_t)0x80), /*!< Analog watchdog flag */
  238. } ADC_FLAG_T;
  239. /**@} end of group ADC_Enumerations */
  240. /** @defgroup ADC_Structures Structures
  241. @{
  242. */
  243. /**
  244. * @brief ADC Config struct definition
  245. */
  246. typedef struct
  247. {
  248. ADC_RESOLUTION_T resolution; /*!< Specifies the ADC data resolution */
  249. ADC_DATA_ALIGN_T dataAlign; /*!< Specifies the data alignment mode */
  250. ADC_SCAN_DIR_T scanDir; /*!< Specifies the scan mode */
  251. ADC_CONVERSION_T convMode; /*!< Specifies the conversion mode */
  252. ADC_EXT_TRIG_CONV_T extTrigConv; /*!< Specifies the external trigger sources */
  253. ADC_EXT_TRIG_EDGE_T extTrigEdge; /*!< Specifies the external conversion trigger edge */
  254. } ADC_Config_T;
  255. /**@} end of group ADC_Structures */
  256. /** @defgroup ADC_Variables Variables
  257. @{
  258. */
  259. /**@} end of group ADC_Variables */
  260. /** @defgroup ADC_Functions Functions
  261. @{
  262. */
  263. /* ADC reset and configuration */
  264. void ADC_Reset(void);
  265. void ADC_Config(ADC_Config_T* adcConfig);
  266. void ADC_ConfigStructInit(ADC_Config_T* adcConfig);
  267. void ADC_Enable(void);
  268. void ADC_Disable(void);
  269. void ADC_EnableAutoPowerOff(void);
  270. void ADC_DisableAutoPowerOff(void);
  271. void ADC_EnableWaitMode(void);
  272. void ADC_DisableWaitMode(void);
  273. void ADC_ConfigChannel(uint32_t channel, uint8_t sampleTime);
  274. void ADC_EnableContinuousMode(void);
  275. void ADC_DisableContinuousMode(void);
  276. void ADC_EnableDiscMode(void);
  277. void ADC_DisableDiscMode(void);
  278. void ADC_EnableOverrunMode(void);
  279. void ADC_DisableOverrunMode(void);
  280. void ADC_StopConversion(void);
  281. void ADC_StartConversion(void);
  282. void ADC_DMARequestMode(ADC_DMA_MODE_T DMARequestMode);
  283. /* ADC clock and jitter */
  284. void ADC_ClockMode(ADC_CLOCK_MODE_T clockMode);
  285. void ADC_EnableJitter(ADC_JITTER_T jitter);
  286. void ADC_DisableJitter(ADC_JITTER_T jitter);
  287. /* ADC analog watchdog */
  288. void ADC_EnableAnalogWatchdog(void);
  289. void ADC_DisableAnalogWatchdog(void);
  290. void ADC_AnalogWatchdogLowThreshold(uint16_t lowThreshold);
  291. void ADC_AnalogWatchdogHighThreshold(uint16_t highThreshold);
  292. void ADC_AnalogWatchdogSingleChannel(uint32_t channel);
  293. void ADC_EnableAnalogWatchdogSingleChannel(void);
  294. void ADC_DisableAnalogWatchdogSingleChannel(void);
  295. /* ADC common configuration */
  296. void ADC_EnableTempSensor(void);
  297. void ADC_DisableTempSensor(void);
  298. void ADC_EnableVrefint(void);
  299. void ADC_DisableVrefint(void);
  300. void ADC_EnableVbat(void); /*!< Not for APM32F030 devices */
  301. void ADC_DisableVbat(void); /*!< Not for APM32F030 devices */
  302. /* Read data */
  303. uint32_t ADC_ReadCalibrationFactor(void);
  304. uint16_t ADC_ReadConversionValue(void);
  305. /* DMA */
  306. void ADC_EnableDMA(void);
  307. void ADC_DisableDMA(void);
  308. /* Interrupt and flag */
  309. void ADC_EnableInterrupt(uint8_t interrupt);
  310. void ADC_DisableInterrupt(uint8_t interrupt);
  311. uint8_t ADC_ReadStatusFlag(ADC_FLAG_T flag);
  312. void ADC_ClearStatusFlag(uint32_t flag);
  313. uint8_t ADC_ReadIntFlag(ADC_INT_FLAG_T flag);
  314. void ADC_ClearIntFlag(uint32_t flag);
  315. #ifdef __cplusplus
  316. }
  317. #endif
  318. #endif /* __APM32F0XX_ADC_H */
  319. /**@} end of group ADC_Functions */
  320. /**@} end of group ADC_Driver */
  321. /**@} end of group APM32F0xx_StdPeriphDriver */