lib_adc.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. /***************************************************************
  2. *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
  3. *文件名: lib_timer.c
  4. *作 者: Liut
  5. *版 本: V1.00
  6. *日 期: 2017/07/14
  7. *描 述: ADC模块库函数
  8. *备 注: 适用于 ES8P508x芯片
  9. 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
  10. ***************************************************************/
  11. #include "lib_adc.h"
  12. /***************************************************************
  13. 函数名:ADC_Init
  14. 描 述:初始化ADC模块
  15. 输入值:初始化配置结构体地址
  16. 输出值:无
  17. 返回值:无
  18. ***************************************************************/
  19. void ADC_Init(ADC_InitStruType * ADC_InitStruct)
  20. {
  21. ADC->VREFCON.VREF_EN = ENABLE; //内部VREFP使能
  22. ADC->VREFCON.IREF_EN = ENABLE; //IREF使能位
  23. ADC->CON1.VCMBUF_EN = ENABLE; //ADC共模电压VCM BUF使能
  24. ADC ->CON1.VCMBUF_HS = ENABLE; //ADC共模电压VCM BUF高速模式使能
  25. ADC->CON1.HSEN = ENABLE; //ADC转换速度:高速
  26. ADC->CHS.VDD5_FLAG_EN = DISABLE; //屏蔽VDD检测控制
  27. ADC->CON1.CLKS = ADC_InitStruct->ADC_ClkS; //ADCCON1:bit3 ADC时钟源选择
  28. ADC->CON1.CLKDIV = ADC_InitStruct->ADC_ClkDiv; //ADCCON1:bit2-0 ADC时钟源预分频
  29. ADC->CON1.VREFP = ADC_InitStruct->ADC_VrefP; //ADCCON1:bit9-8 ADC正向参考电压选择
  30. ADC->CON1.SMPS = ADC_InitStruct->ADC_SampS; //ADCCON1:bit12 ADC采样模式选择
  31. ADC->CHS.CHS = ADC_InitStruct->ADC_ChS; //ADCCHS:bit0-3 ADC模拟通道选择
  32. ADC->CON1.ST = ADC_InitStruct->ST; //ADCCON1:bit20-16 ADC采样时间选择 ST*2+1个Tadclk
  33. //ADC->VREFCON.VREF_SEL=ADC_InitStruct->VREF_SEL;//内部参考电压选择
  34. ADC->CON1.VREFN = ADC_InitStruct->ADC_VREFN; //负向参考电压使能位
  35. ADC->CON1.VRBUF_EN = ADC_InitStruct->ADC_VRBUF_EN; //VREF BUF使能位
  36. }
  37. /***************************************************************
  38. 函数名:ADC_Set_CH
  39. 描 述:选择ADC模拟通道
  40. 输入值:通道
  41. 输出值:无
  42. 返回值:无
  43. ***************************************************************/
  44. void ADC_Set_CH(ADC_TYPE_CHS AdcCH)
  45. {
  46. ADC->CHS.CHS = AdcCH;
  47. }
  48. /***************************************************************
  49. 函数名:ADC_GetConvValue
  50. 描 述:获取ADC转换结果
  51. 输入值:无
  52. 输出值:无
  53. 返回值:转换值
  54. ***************************************************************/
  55. uint16_t ADC_GetConvValue(void)
  56. {
  57. return ((uint16_t)ADC->DR.DR);
  58. }
  59. /***************************************************************
  60. 函数名:ADC_GetConvStatus
  61. 描 述:获取ADC转换状态
  62. 输入值:无
  63. 输出值:无
  64. 返回值:RESET(完成)/SET(正在转换)
  65. ***************************************************************/
  66. FlagStatus ADC_GetConvStatus(void)
  67. {
  68. FlagStatus bitstatus = RESET;
  69. /* 检测转换状态寄存器 */
  70. if ((ADC->CON0.TRIG != (uint32_t)RESET))
  71. bitstatus = SET; //正在转换
  72. else
  73. bitstatus = RESET; //转换完成
  74. return bitstatus;
  75. }
  76. /***************************************************************
  77. 函数名:ADC_ACPConfig
  78. 描 述:ADC 自动比较功能初始化
  79. 输入值:ADC_ACP_InitStruct 自动比较功能初始化结构体
  80. 输出值:无
  81. 返回值:SUCCESS 成功
  82. ERROR 失败
  83. ***************************************************************/
  84. ErrorStatus ADC_ACPConfig(ADC_ACP_TypeDef *ADC_ACP_InitStruct)
  85. {
  86. if(ADC_ACP_InitStruct->ACPC_OVER_TIME > ADC_ACPC_OVFL_TIME_MAX
  87. ||ADC_ACP_InitStruct->ACPC_TIMES > ADC_ACPC_TIMES_MAX
  88. ||ADC_ACP_InitStruct->ACPC_MIN_TARGET > ADC_ACP_MIN_MAX
  89. ||ADC_ACP_InitStruct->ACPC_MAX_TARGET > ADC_ACP_MAX_MAX)
  90. {
  91. return ERROR;
  92. }
  93. if(ADC_ACP_InitStruct->ACP_EN == ENABLE)
  94. {
  95. if(ADC->CON1.CLKS == ADC_ClkS_PCLK)
  96. {
  97. ADC->ACPC.CLKS = ADC_ACPC_CLKS_PCLK;
  98. }
  99. else
  100. {
  101. ADC->ACPC.CLKS = ADC_ACPC_CLKS_LRC;
  102. }
  103. ADC->ACPC.OVFL_TIME = ADC_ACP_InitStruct ->ACPC_OVER_TIME;
  104. ADC->ACPC.TIMES = ADC_ACP_InitStruct->ACPC_TIMES;
  105. ADC->IE.ACPOVIE = ENABLE;
  106. /* 假设用户将高阀值设置成0(最小值),我们可以认为其想关闭该功能 */
  107. if(ADC_ACP_InitStruct ->ACPC_MAX_TARGET ==0x0)
  108. {
  109. ADC->IE.ACPMAXIE = DISABLE;
  110. }
  111. else
  112. {
  113. ADC->ACPCMP.CMP_MAX =ADC_ACP_InitStruct ->ACPC_MAX_TARGET;
  114. ADC->IE.ACPMAXIE = ENABLE;
  115. }
  116. /* 假设用户将低阀值设置成0xfff(最大值),我们可以认为其想关闭该功能 */
  117. if(ADC_ACP_InitStruct ->ACPC_MIN_TARGET == 0xfff)
  118. {
  119. ADC->IE.ACPMINIE = DISABLE;
  120. }
  121. else
  122. {
  123. ADC->ACPCMP.CMP_MIN =ADC_ACP_InitStruct ->ACPC_MIN_TARGET;
  124. ADC->IE.ACPMINIE = ENABLE;
  125. }
  126. ADC->CON0.ACP_EN = ENABLE;
  127. }
  128. else
  129. {
  130. ADC->CON0.ACP_EN = DISABLE;
  131. }
  132. return SUCCESS;
  133. }
  134. /***************************************************************
  135. 函数名:ADC_SampStart
  136. 描 述:ADC 采样软件控制-启动函数
  137. 输入值:无
  138. 输出值:无
  139. 返回值:SUCCESS 成功
  140. ERROR 失败
  141. ***************************************************************/
  142. ErrorStatus ADC_SoftStart(void)
  143. {
  144. if(ADC->CON1.SMPS == ADC_SMPS_HARD)
  145. return ERROR;
  146. ADC ->CON1.SMPON = SET;
  147. return SUCCESS;
  148. }
  149. /***************************************************************
  150. 函数名:ADC_SampStop
  151. 描 述:ADC 采样软件控制-停止函数
  152. 输入值:无
  153. 输出值:无
  154. 返回值:SUCCESS 成功
  155. ERROR 失败
  156. ***************************************************************/
  157. ErrorStatus ADC_SoftStop(void)
  158. {
  159. if(ADC->CON1.SMPS == ADC_SMPS_HARD)
  160. return ERROR;
  161. ADC->CON1.SMPON = RESET;
  162. return SUCCESS;
  163. }
  164. /***************************************************************
  165. 函数名:ADC_GetACPMeanValue
  166. 描 述:ADC 获得单次自动比较平均值
  167. 输入值:无
  168. 输出值:无
  169. 返回值:采样数据
  170. ***************************************************************/
  171. uint16_t ADC_GetACPMeanValue(void)
  172. {
  173. return ((uint16_t)ADC->ACPMEAN.MEAN_DATA);
  174. }
  175. /***************************************************************
  176. 函数名:ADC_GetACPMINValue
  177. 描 述:ADC 获得单次自动比较平均值
  178. 输入值:无
  179. 输出值:无
  180. 返回值:采样数据
  181. ***************************************************************/
  182. uint16_t ADC_GetACPMinValue(void)
  183. {
  184. return ((uint16_t)ADC->ACPCMP.CMP_MIN);
  185. }
  186. /***************************************************************
  187. 函数名:ADC_GetACPMAXValue
  188. 描 述:ADC 获得单次自动比较平均值
  189. 输入值:无
  190. 输出值:无
  191. 返回值:采样数据
  192. ***************************************************************/
  193. uint16_t ADC_GetACPMaxValue(void)
  194. {
  195. return ((uint16_t)ADC->ACPCMP.CMP_MAX);
  196. }
  197. /***************************************************************
  198. 函数名:ADC_GetFlagStatus
  199. 描 述:读取ADC标志位状态
  200. 输入值:IFName:ADC中断标志
  201. 输出值:无
  202. 返回值:SET/RESET
  203. ***************************************************************/
  204. FlagStatus ADC_GetFlagStatus(ADC_TYPE_IF IFName)
  205. {
  206. FlagStatus bitstatus = RESET;
  207. /* 检查中断标志位 */
  208. if (((ADC->IF.Word & IFName) != (uint32_t)RESET))
  209. bitstatus = SET; //转换完成
  210. else
  211. bitstatus = RESET; //无中断
  212. return bitstatus;
  213. }
  214. /***************************************************************
  215. 函数名:ADC_GetITStatus
  216. 描 述:读取ADC中断状态,未使能相应中断时不会返回SET
  217. 输入值:无
  218. 输出值:无
  219. 返回值:SET(中断)/RESET(无中断)
  220. ***************************************************************/
  221. ITStatus ADC_GetITStatus(ADC_TYPE_IE IEName)
  222. {
  223. ITStatus bitstatus = RESET;
  224. /* 检查中断标志位 */
  225. if (((ADC->IE.Word & IEName) != (uint32_t)RESET))
  226. bitstatus = SET; //转换完成,进中断
  227. else
  228. bitstatus = RESET; //无中断
  229. return bitstatus;
  230. }
  231. /***************************************************************
  232. 函数名:ADC_ClearIFStatus
  233. 描 述:ADC 清除特定类型中断
  234. 输入值:IFName 中断类型选择
  235. ADC_IF ADC中断
  236. ADC_IF_ACPMIN 自动转换低阀值超出中断
  237. ADC_IF_ACPMAX 自动转换高阀值超出中断
  238. ADC_IF_ACPOVER 自动转换溢出中断
  239. 输出值:无
  240. 返回值:SUCCESS 成功
  241. ERROR 失败
  242. ***************************************************************/
  243. ErrorStatus ADC_ClearIFStatus(ADC_TYPE_IF IFName)
  244. {
  245. ADC->IF.Word = (uint32_t)IFName;
  246. return SUCCESS;
  247. }
  248. /***************************************************************
  249. 函数名:ADC_Reset
  250. 描 述:ADC复位
  251. 输入值:无
  252. 输出值:无
  253. 返回值:无
  254. ***************************************************************/
  255. void ADC_Reset(void)
  256. {
  257. ADC->CON0.Word = 0x00000030;
  258. ADC->CON1.Word = 0x00041000;
  259. ADC->CHS.Word = 0x00000100;
  260. ADC->IE.Word = 0x00000000;
  261. ADC->IF.Word = 0x00000000;
  262. ADC->ACPC.Word = 0x00000000;
  263. ADC->ACPCMP.Word = 0x0FFF0000;
  264. ADC->VREFCON.Word = 0x00000000;
  265. }
  266. /*************************END OF FILE**********************/