You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

313 lines
9.2 KiB

4 years ago
  1. /*********************************************************
  2. *Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *: lib_adc.c
  4. * : AE Team
  5. * : V1.01
  6. * : 2021/06/09
  7. * : ADC模块库函数
  8. * :
  9. 使
  10. **********************************************************/
  11. #include "lib_adc.h"
  12. /***************************************************************
  13. ADC_Init
  14. ADC功能初始化函数
  15. ADC_InitStruct
  16. SUCCESS
  17. ERROR
  18. ***************************************************************/
  19. ErrorStatus ADC_Init(ADC_InitStruType *ADC_InitStruct)
  20. {
  21. if (ADC_InitStruct->CLKS > ADC_CLKS_MAX
  22. || ADC_InitStruct->CLKDIV > ADC_CLKDIV_MAX
  23. || ADC_InitStruct->VREF_SEL > ADC_VREF_SEL_MAX
  24. || ADC_InitStruct->VREFP > ADC_VREFP_MAX
  25. || ADC_InitStruct->VREFN > ADC_VREFN_MAX
  26. || ADC_InitStruct->CHS > ADC_CHS_MAX
  27. || ADC_InitStruct->SMPS > ADC_SMPS_MAX
  28. || ADC_InitStruct->ST > ADC_ST_MAX
  29. || ADC_InitStruct->BITSEL > ADC_BITSEL_MAX)
  30. {
  31. return ERROR;
  32. }
  33. ADC_Reset();
  34. ADC->VREFCON.VREF_EN = ENABLE;
  35. ADC->VREFCON.IREF_EN = ENABLE;
  36. ADC->CON1.HSEN = DISABLE;
  37. ADC->CHS.CHS = ADC_InitStruct->CHS;
  38. ADC->CON1.CLKS = ADC_InitStruct->CLKS;
  39. ADC->CON1.CLKDIV = ADC_InitStruct->CLKDIV;
  40. ADC->CON1.VREFP = ADC_InitStruct->VREFP;
  41. ADC->CON1.VREFN = ADC_VREFN_VSS;
  42. ADC->VREFCON.VREF_SEL = ADC_VREF_SEL_0;
  43. ADC->CON1.SMPS = ADC_InitStruct->SMPS;
  44. ADC->CON1.ST = ADC_InitStruct->ST;
  45. ADC->CON0.BIT_SEL = ADC_InitStruct->BITSEL;
  46. ADC_Enable();
  47. return SUCCESS;
  48. }
  49. /***************************************************************
  50. ADC_Set_CH
  51. ADC模拟通道
  52. ***************************************************************/
  53. void ADC_Set_CH(ADC_TYPE_CHS AdcCH)
  54. {
  55. ADC->CHS.CHS = AdcCH; /* ADCCHS:bit0-4 ADC模拟通道选择 */
  56. }
  57. /***************************************************************
  58. ADC_ACPConfig
  59. ADC
  60. ADC_ACP_InitStruct
  61. SUCCESS
  62. ERROR
  63. ***************************************************************/
  64. ErrorStatus ADC_ACPConfig(ADC_ACP_TypeDef *ADC_ACP_InitStruct)
  65. {
  66. if (ADC_ACP_InitStruct->ACPC_OVER_TIME > ADC_ACPC_OVFL_TIME_MAX
  67. || ADC_ACP_InitStruct->ACPC_TIMES > ADC_ACPC_TIMES_MAX
  68. || ADC_ACP_InitStruct->ACPC_MIN_TARGET > ADC_ACP_MIN_MAX
  69. || ADC_ACP_InitStruct->ACPC_MAX_TARGET > ADC_ACP_MAX_MAX)
  70. {
  71. return ERROR;
  72. }
  73. if (ADC_ACP_InitStruct ->ACP_EN == ENABLE)
  74. {
  75. if (ADC->CON1.CLKS == ADC_CLKS_PCLK)
  76. {
  77. ADC->ACPC.CLKS = ADC_ACPC_CLKS_PCLK;
  78. }
  79. else
  80. {
  81. ADC->ACPC.CLKS = ADC_ACPC_CLKS_LRC;
  82. }
  83. ADC->ACPC.OVFL_TIME = ADC_ACP_InitStruct ->ACPC_OVER_TIME;
  84. ADC->ACPC.TIMES = ADC_ACP_InitStruct->ACPC_TIMES;
  85. ADC->IE.ACPOVIE = ENABLE;
  86. /* 假设用户将高阀值设置成0(最小值),我们可以认为其想关闭该功能 */
  87. if (ADC_ACP_InitStruct ->ACPC_MAX_TARGET == 0x0)
  88. {
  89. ADC->IE.ACPMAXIE = DISABLE;
  90. }
  91. else
  92. {
  93. ADC->ACPCMP.CMP_MAX = ADC_ACP_InitStruct ->ACPC_MAX_TARGET;
  94. ADC->IE.ACPMAXIE = ENABLE;
  95. }
  96. /* 假设用户将低阀值设置成0xfff(最大值),我们可以认为其想关闭该功能 */
  97. if (ADC_ACP_InitStruct ->ACPC_MIN_TARGET == 0xfff)
  98. {
  99. ADC->IE.ACPMINIE = DISABLE;
  100. }
  101. else
  102. {
  103. ADC->ACPCMP.CMP_MIN = ADC_ACP_InitStruct ->ACPC_MIN_TARGET;
  104. ADC->IE.ACPMINIE = ENABLE;
  105. }
  106. ADC_ACP_Enable();
  107. }
  108. else
  109. {
  110. ADC_ACP_Disable();
  111. }
  112. return SUCCESS;
  113. }
  114. /***************************************************************
  115. ADC_Start
  116. ADC
  117. SUCCESS
  118. ERROR
  119. ***************************************************************/
  120. ErrorStatus ADC_Start(void)
  121. {
  122. if (ADC->CON1.SMPS == ADC_SMPS_SOFT)
  123. {
  124. return ERROR;
  125. }
  126. ADC->CON0.Word |= ADC_TRIG_MASK; /* 40001004 BIT1*/
  127. return SUCCESS;
  128. }
  129. /***************************************************************
  130. ADC_SampStart
  131. ADC -
  132. SUCCESS
  133. ERROR
  134. ***************************************************************/
  135. ErrorStatus ADC_SoftStart(void)
  136. {
  137. if (ADC->CON1.SMPS == ADC_SMPS_HARD)
  138. {
  139. return ERROR;
  140. }
  141. ADC ->CON1.SMPON = SET;/* 40001008 BIT13*/
  142. return SUCCESS;
  143. }
  144. /***************************************************************
  145. ADC_SampStop
  146. ADC -
  147. SUCCESS
  148. ERROR
  149. ***************************************************************/
  150. ErrorStatus ADC_SoftStop(void)
  151. {
  152. if (ADC->CON1.SMPS == ADC_SMPS_HARD)
  153. {
  154. return ERROR;
  155. }
  156. ADC ->CON1.SMPON = RESET;/* 40001008 BIT13*/
  157. return SUCCESS;
  158. }
  159. /***************************************************************
  160. ADC_GetConvValue
  161. ADC
  162. ***************************************************************/
  163. uint16_t ADC_GetConvValue(void)
  164. {
  165. return ((uint16_t)ADC->DR.DR); /* 40001000 BIT15-0*/
  166. }
  167. /***************************************************************
  168. ADC_GetConvStatus
  169. ADC
  170. SET
  171. RESET
  172. ***************************************************************/
  173. FlagStatus ADC_GetConvStatus(void)
  174. {
  175. if (ADC->CON0.Word & (ADC_TRIG_MASK)) /* BIT1*/
  176. {
  177. return RESET;
  178. }
  179. return SET;
  180. }
  181. /***************************************************************
  182. ADC_GetACPMeanValue
  183. ADC
  184. ***************************************************************/
  185. uint16_t ADC_GetACPMeanValue(void)
  186. {
  187. return ((uint16_t)ADC->ACPMEAN.MEAN_DATA);
  188. }
  189. /***************************************************************
  190. ADC_GetIFStatus
  191. ADC
  192. IFName
  193. ADC_IF ADC中断
  194. ADC_IF_ACPMIN
  195. ADC_IF_ACPMAX
  196. ADC_IF_ACPOVER
  197. ***************************************************************/
  198. ITStatus ADC_GetIFStatus(ADC_TYPE_IF IFName)
  199. {
  200. if (ADC->IF.Word & IFName)
  201. {
  202. return SET;
  203. }
  204. return RESET;
  205. }
  206. /***************************************************************
  207. ADC_GetIEStatus
  208. ADC
  209. IEName
  210. ADC_IE ADC中断
  211. ADC_IE_ACPMIN
  212. ADC_IE_ACPMAX
  213. ADC_IE_ACPOVER自动转换溢出中断
  214. 使
  215. ***************************************************************/
  216. ITStatus ADC_GetIEStatus(ADC_TYPE_IE IEName)
  217. {
  218. if (ADC->IE.Word & IEName)
  219. {
  220. return SET;
  221. }
  222. return RESET;
  223. }
  224. /***************************************************************
  225. ADC_ClearIFStatus
  226. ADC
  227. IFName
  228. ADC_IF ADC中断
  229. ADC_IF_ACPMIN
  230. ADC_IF_ACPMAX
  231. ADC_IF_ACPOVER
  232. SUCCESS
  233. ERROR
  234. ***************************************************************/
  235. ErrorStatus ADC_ClearIFStatus(ADC_TYPE_IF IFName)
  236. {
  237. ADC->IF.Word = (uint32_t)IFName;
  238. return SUCCESS;
  239. }
  240. /***************************************************************
  241. ADC_Reset
  242. ADC复位
  243. ***************************************************************/
  244. void ADC_Reset(void)
  245. {
  246. ADC->CON0.Word = 0x00000000;
  247. ADC->CON1.Word = 0x00041000;
  248. ADC->CHS.Word = 0x00000100;
  249. ADC->IE.Word = 0x00000000;
  250. ADC->IF.Word = 0x00000000;
  251. ADC->ACPC.Word = 0x00000000;
  252. ADC->ACPCMP.Word = 0x0fff0000;
  253. ADC->VREFCON.Word = 0x00000000;
  254. }