SWM320_adc.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM320_adc.c
  3. * 功能说明: SWM320单片机的ADC数模转换器功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.1.0 2017年10月25日
  7. * 升级记录:
  8. *******************************************************************************************************************************************
  9. * @attention
  10. *
  11. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
  12. * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
  13. * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  14. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
  15. * -ECTION WITH THEIR PRODUCTS.
  16. *
  17. * COPYRIGHT 2012 Synwit Technology
  18. *******************************************************************************************************************************************/
  19. #include "SWM320.h"
  20. #include "SWM320_adc.h"
  21. /******************************************************************************************************************************************
  22. * 函数名称: ADC_Init()
  23. * 功能说明: ADC模数转换器初始化
  24. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,有效值包括ADC0、ADC1
  25. * ADC_InitStructure * initStruct 包含ADC各相关定值的结构体
  26. * 输 出: 无
  27. * 注意事项: 无
  28. ******************************************************************************************************************************************/
  29. void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct)
  30. {
  31. switch ((uint32_t)ADCx)
  32. {
  33. case ((uint32_t)ADC0):
  34. SYS->CLKEN |= (0x01 << SYS_CLKEN_ADC0_Pos);
  35. break;
  36. case ((uint32_t)ADC1):
  37. SYS->CLKEN |= (0x01 << SYS_CLKEN_ADC1_Pos);
  38. break;
  39. }
  40. ADC_Close(ADCx); //一些关键寄存器只能在ADC关闭时设置
  41. if (initStruct->clk_src == ADC_CLKSRC_HRC)
  42. {
  43. ADCx->CTRL |= (1 << ADC_CTRL_CLKSRC_Pos);
  44. ADCx->CTRL2 &= ~ADC_CTRL2_CLKDIV_Msk;
  45. ADCx->CTRL2 |= (initStruct->clk_div << ADC_CTRL2_CLKDIV_Pos);
  46. }
  47. else
  48. {
  49. if (SYS->PLLCR & SYS_PLLCR_OFF_Msk)
  50. PLLInit();
  51. ADCx->CTRL &= ~(1 << ADC_CTRL_CLKSRC_Pos);
  52. SYS->PLLDIV &= ~SYS_PLLDIV_ADVCO_Msk;
  53. SYS->PLLDIV |= ((initStruct->clk_src - 2) << SYS_PLLDIV_ADVCO_Pos);
  54. SYS->PLLDIV &= ~SYS_PLLDIV_ADDIV_Msk;
  55. SYS->PLLDIV |= (initStruct->clk_div << SYS_PLLDIV_ADDIV_Pos);
  56. }
  57. ADCx->CALIBSET = (ADCx == ADC0) ? SYS->BKP[0] : SYS->BKP[1];
  58. ADCx->CALIBEN = (1 << ADC_CALIBEN_OFFSET_Pos) | (1 << ADC_CALIBEN_K_Pos);
  59. ADCx->CTRL2 &= ~(ADC_CTRL2_ADCEVCM_Msk | ADC_CTRL2_PGAIVCM_Msk | ADC_CTRL2_PGAGAIN_Msk | ADC_CTRL2_PGAVCM_Msk);
  60. ADCx->CTRL2 |= (0 << ADC_CTRL2_ADCEVCM_Pos) |
  61. (initStruct->pga_ref << ADC_CTRL2_PGAIVCM_Pos) |
  62. (6 << ADC_CTRL2_PGAGAIN_Pos) |
  63. ((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos);
  64. ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
  65. ADCx->CTRL |= (initStruct->channels << ADC_CTRL_CH0_Pos);
  66. ADCx->CTRL &= ~(ADC_CTRL_AVG_Msk | ADC_CTRL_TRIG_Msk | ADC_CTRL_CONT_Msk);
  67. ADCx->CTRL |= (initStruct->samplAvg << ADC_CTRL_AVG_Pos) |
  68. (initStruct->trig_src << ADC_CTRL_TRIG_Pos) |
  69. (initStruct->Continue << ADC_CTRL_CONT_Pos);
  70. ADCx->IF = 0xFFFFFFFF; //清除中断标志
  71. ADCx->IE &= ~(ADC_IE_CH0EOC_Msk | ADC_IE_CH1EOC_Msk | ADC_IE_CH2EOC_Msk | ADC_IE_CH3EOC_Msk |
  72. ADC_IE_CH4EOC_Msk | ADC_IE_CH5EOC_Msk | ADC_IE_CH6EOC_Msk | ADC_IE_CH7EOC_Msk);
  73. ADCx->IE |= (((initStruct->EOC_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0EOC_Pos) |
  74. (((initStruct->EOC_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1EOC_Pos) |
  75. (((initStruct->EOC_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2EOC_Pos) |
  76. (((initStruct->EOC_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3EOC_Pos) |
  77. (((initStruct->EOC_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4EOC_Pos) |
  78. (((initStruct->EOC_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5EOC_Pos) |
  79. (((initStruct->EOC_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6EOC_Pos) |
  80. (((initStruct->EOC_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7EOC_Pos);
  81. ADCx->IE &= ~(ADC_IE_CH0OVF_Msk | ADC_IE_CH1OVF_Msk | ADC_IE_CH2OVF_Msk | ADC_IE_CH3OVF_Msk |
  82. ADC_IE_CH4OVF_Msk | ADC_IE_CH5OVF_Msk | ADC_IE_CH6OVF_Msk | ADC_IE_CH7OVF_Msk);
  83. ADCx->IE |= (((initStruct->OVF_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0OVF_Pos) |
  84. (((initStruct->OVF_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1OVF_Pos) |
  85. (((initStruct->OVF_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2OVF_Pos) |
  86. (((initStruct->OVF_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3OVF_Pos) |
  87. (((initStruct->OVF_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4OVF_Pos) |
  88. (((initStruct->OVF_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5OVF_Pos) |
  89. (((initStruct->OVF_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6OVF_Pos) |
  90. (((initStruct->OVF_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7OVF_Pos);
  91. ADCx->IE &= ~(ADC_IE_CH0HFULL_Msk | ADC_IE_CH1HFULL_Msk | ADC_IE_CH2HFULL_Msk | ADC_IE_CH3HFULL_Msk |
  92. ADC_IE_CH4HFULL_Msk | ADC_IE_CH5HFULL_Msk | ADC_IE_CH6HFULL_Msk | ADC_IE_CH7HFULL_Msk);
  93. ADCx->IE |= (((initStruct->HFULL_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0HFULL_Pos) |
  94. (((initStruct->HFULL_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1HFULL_Pos) |
  95. (((initStruct->HFULL_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2HFULL_Pos) |
  96. (((initStruct->HFULL_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3HFULL_Pos) |
  97. (((initStruct->HFULL_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4HFULL_Pos) |
  98. (((initStruct->HFULL_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5HFULL_Pos) |
  99. (((initStruct->HFULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6HFULL_Pos) |
  100. (((initStruct->HFULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7HFULL_Pos);
  101. ADCx->IE &= ~(uint32_t)(ADC_IE_CH0FULL_Msk | ADC_IE_CH1FULL_Msk | ADC_IE_CH2FULL_Msk | ADC_IE_CH3FULL_Msk |
  102. ADC_IE_CH4FULL_Msk | ADC_IE_CH5FULL_Msk | ADC_IE_CH6FULL_Msk | ADC_IE_CH7FULL_Msk);
  103. ADCx->IE |= (((initStruct->FULL_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0FULL_Pos) |
  104. (((initStruct->FULL_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1FULL_Pos) |
  105. (((initStruct->FULL_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2FULL_Pos) |
  106. (((initStruct->FULL_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3FULL_Pos) |
  107. (((initStruct->FULL_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4FULL_Pos) |
  108. (((initStruct->FULL_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5FULL_Pos) |
  109. (((initStruct->FULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6FULL_Pos) |
  110. (((initStruct->FULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7FULL_Pos);
  111. switch ((uint32_t)ADCx)
  112. {
  113. case ((uint32_t)ADC0):
  114. if (initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
  115. {
  116. NVIC_EnableIRQ(ADC0_IRQn);
  117. }
  118. else
  119. {
  120. NVIC_DisableIRQ(ADC0_IRQn);
  121. }
  122. break;
  123. case ((uint32_t)ADC1):
  124. if (initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
  125. {
  126. NVIC_EnableIRQ(ADC1_IRQn);
  127. }
  128. else
  129. {
  130. NVIC_DisableIRQ(ADC1_IRQn);
  131. }
  132. break;
  133. }
  134. }
  135. /******************************************************************************************************************************************
  136. * 函数名称: ADC_Open()
  137. * 功能说明: ADC开启,可以软件启动、或硬件触发ADC转换
  138. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  139. * 输 出: 无
  140. * 注意事项: 无
  141. ******************************************************************************************************************************************/
  142. void ADC_Open(ADC_TypeDef *ADCx)
  143. {
  144. ADCx->CTRL |= (0x01 << ADC_CTRL_EN_Pos);
  145. }
  146. /******************************************************************************************************************************************
  147. * 函数名称: ADC_Close()
  148. * 功能说明: ADC关闭,无法软件启动、或硬件触发ADC转换
  149. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  150. * 输 出: 无
  151. * 注意事项: 无
  152. ******************************************************************************************************************************************/
  153. void ADC_Close(ADC_TypeDef *ADCx)
  154. {
  155. ADCx->CTRL &= ~(0x01 << ADC_CTRL_EN_Pos);
  156. }
  157. /******************************************************************************************************************************************
  158. * 函数名称: ADC_Start()
  159. * 功能说明: 软件触发模式下启动ADC转换
  160. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  161. * 输 出: 无
  162. * 注意事项: 无
  163. ******************************************************************************************************************************************/
  164. void ADC_Start(ADC_TypeDef *ADCx)
  165. {
  166. ADCx->START |= (0x01 << ADC_START_GO_Pos);
  167. }
  168. /******************************************************************************************************************************************
  169. * 函数名称: ADC_Stop()
  170. * 功能说明: 软件触发模式下停止ADC转换
  171. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  172. * 输 出: 无
  173. * 注意事项: 无
  174. ******************************************************************************************************************************************/
  175. void ADC_Stop(ADC_TypeDef *ADCx)
  176. {
  177. ADCx->START &= ~(0x01 << ADC_START_GO_Pos);
  178. }
  179. static uint32_t chn2idx(uint32_t chn)
  180. {
  181. uint32_t idx = 0;
  182. switch (chn)
  183. {
  184. case 0x01:
  185. idx = 0;
  186. break;
  187. case 0x02:
  188. idx = 1;
  189. break;
  190. case 0x04:
  191. idx = 2;
  192. break;
  193. case 0x08:
  194. idx = 3;
  195. break;
  196. case 0x10:
  197. idx = 4;
  198. break;
  199. case 0x20:
  200. idx = 5;
  201. break;
  202. case 0x40:
  203. idx = 6;
  204. break;
  205. case 0x80:
  206. idx = 7;
  207. break;
  208. }
  209. return idx;
  210. }
  211. /******************************************************************************************************************************************
  212. * 函数名称: ADC_Read()
  213. * 功能说明: 从指定通道读取转换结果
  214. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  215. * uint32_t chn 要读取转换结果的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  216. * 输 出: uint32_t 读取到的转换结果
  217. * 注意事项: 无
  218. ******************************************************************************************************************************************/
  219. uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn)
  220. {
  221. uint32_t dat = 0;
  222. uint32_t idx = chn2idx(chn);
  223. dat = ADCx->CH[idx].DATA;
  224. ADCx->CH[idx].STAT = 0x01; //清除EOC标志
  225. return dat;
  226. }
  227. /******************************************************************************************************************************************
  228. * 函数名称: ADC_IsEOC()
  229. * 功能说明: 指定通道是否End Of Conversion
  230. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  231. * uint32_t chn 要查询状态的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  232. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  233. * 注意事项: 无
  234. ******************************************************************************************************************************************/
  235. uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn)
  236. {
  237. uint32_t idx = chn2idx(chn);
  238. return (ADCx->CH[idx].STAT & ADC_STAT_EOC_Msk) ? 1 : 0;
  239. }
  240. /******************************************************************************************************************************************
  241. * 函数名称: ADC_ChnSelect()
  242. * 功能说明: ADC通道选通,模数转换会在选通的通道上依次采样转换
  243. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  244. * uint32_t chns 要选通的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
  245. * 输 出: 无
  246. * 注意事项: 无
  247. ******************************************************************************************************************************************/
  248. void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns)
  249. {
  250. ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
  251. ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos);
  252. }
  253. /******************************************************************************************************************************************
  254. * 函数名称: ADC_IntEOCEn()
  255. * 功能说明: 转换完成中断使能
  256. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  257. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  258. * 输 出: 无
  259. * 注意事项: 无
  260. ******************************************************************************************************************************************/
  261. void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn)
  262. {
  263. uint32_t idx = chn2idx(chn);
  264. ADCx->IE |= (0x01 << (idx * 4));
  265. }
  266. /******************************************************************************************************************************************
  267. * 函数名称: ADC_IntEOCDis()
  268. * 功能说明: 转换完成中断禁止
  269. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  270. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  271. * 输 出: 无
  272. * 注意事项: 无
  273. ******************************************************************************************************************************************/
  274. void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn)
  275. {
  276. uint32_t idx = chn2idx(chn);
  277. ADCx->IE &= ~(0x01 << (idx * 4));
  278. }
  279. /******************************************************************************************************************************************
  280. * 函数名称: ADC_IntEOCClr()
  281. * 功能说明: 转换完成中断标志清除
  282. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  283. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  284. * 输 出: 无
  285. * 注意事项: 无
  286. ******************************************************************************************************************************************/
  287. void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn)
  288. {
  289. uint32_t idx = chn2idx(chn);
  290. ADCx->IF = (0x01 << (idx * 4));
  291. }
  292. /******************************************************************************************************************************************
  293. * 函数名称: ADC_IntEOCStat()
  294. * 功能说明: 转换完成中断状态
  295. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  296. * uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  297. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  298. * 注意事项: 无
  299. ******************************************************************************************************************************************/
  300. uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn)
  301. {
  302. uint32_t idx = chn2idx(chn);
  303. return (ADCx->IF & (0x01 << (idx * 4))) ? 1 : 0;
  304. }
  305. /******************************************************************************************************************************************
  306. * 函数名称: ADC_IntOVFEn()
  307. * 功能说明: 数据溢出中断使能
  308. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  309. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  310. * 输 出: 无
  311. * 注意事项: 无
  312. ******************************************************************************************************************************************/
  313. void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn)
  314. {
  315. uint32_t idx = chn2idx(chn);
  316. ADCx->IE |= (0x01 << (idx * 4 + 1));
  317. }
  318. /******************************************************************************************************************************************
  319. * 函数名称: ADC_IntOVFDis()
  320. * 功能说明: 数据溢出中断禁止
  321. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  322. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  323. * 输 出: 无
  324. * 注意事项: 无
  325. ******************************************************************************************************************************************/
  326. void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn)
  327. {
  328. uint32_t idx = chn2idx(chn);
  329. ADCx->IE &= ~(0x01 << (idx * 4 + 1));
  330. }
  331. /******************************************************************************************************************************************
  332. * 函数名称: ADC_IntOVFClr()
  333. * 功能说明: 数据溢出中断标志清除
  334. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  335. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  336. * 输 出: 无
  337. * 注意事项: 无
  338. ******************************************************************************************************************************************/
  339. void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn)
  340. {
  341. uint32_t idx = chn2idx(chn);
  342. ADCx->IF = (0x01 << (idx * 4 + 1));
  343. }
  344. /******************************************************************************************************************************************
  345. * 函数名称: ADC_IntOVFStat()
  346. * 功能说明: 数据溢出中断状态
  347. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  348. * uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  349. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  350. * 注意事项: 无
  351. ******************************************************************************************************************************************/
  352. uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn)
  353. {
  354. uint32_t idx = chn2idx(chn);
  355. return (ADCx->IF & (0x01 << (idx * 4 + 1))) ? 1 : 0;
  356. }
  357. /******************************************************************************************************************************************
  358. * 函数名称: ADC_IntHFULLEn()
  359. * 功能说明: FIFO半满中断使能
  360. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  361. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  362. * 输 出: 无
  363. * 注意事项: 无
  364. ******************************************************************************************************************************************/
  365. void ADC_IntHFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
  366. {
  367. uint32_t idx = chn2idx(chn);
  368. ADCx->IE |= (0x01 << (idx * 4 + 2));
  369. }
  370. /******************************************************************************************************************************************
  371. * 函数名称: ADC_IntHFULLDis()
  372. * 功能说明: FIFO半满中断禁止
  373. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  374. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  375. * 输 出: 无
  376. * 注意事项: 无
  377. ******************************************************************************************************************************************/
  378. void ADC_IntHFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
  379. {
  380. uint32_t idx = chn2idx(chn);
  381. ADCx->IE &= ~(0x01 << (idx * 4 + 2));
  382. }
  383. /******************************************************************************************************************************************
  384. * 函数名称: ADC_IntHFULLClr()
  385. * 功能说明: FIFO半满中断标志清除
  386. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  387. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  388. * 输 出: 无
  389. * 注意事项: 无
  390. ******************************************************************************************************************************************/
  391. void ADC_IntHFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
  392. {
  393. uint32_t idx = chn2idx(chn);
  394. ADCx->IF = (0x01 << (idx * 4 + 2));
  395. }
  396. /******************************************************************************************************************************************
  397. * 函数名称: ADC_IntHFULLStat()
  398. * 功能说明: FIFO半满中断状态
  399. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  400. * uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  401. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  402. * 注意事项: 无
  403. ******************************************************************************************************************************************/
  404. uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
  405. {
  406. uint32_t idx = chn2idx(chn);
  407. return (ADCx->IF & (0x01 << (idx * 4 + 2))) ? 1 : 0;
  408. }
  409. /******************************************************************************************************************************************
  410. * 函数名称: ADC_IntFULLEn()
  411. * 功能说明: FIFO满中断使能
  412. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  413. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  414. * 输 出: 无
  415. * 注意事项: 无
  416. ******************************************************************************************************************************************/
  417. void ADC_IntFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
  418. {
  419. uint32_t idx = chn2idx(chn);
  420. ADCx->IE |= (0x01 << (idx * 4 + 3));
  421. }
  422. /******************************************************************************************************************************************
  423. * 函数名称: ADC_IntFULLDis()
  424. * 功能说明: FIFO满中断禁止
  425. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  426. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  427. * 输 出: 无
  428. * 注意事项: 无
  429. ******************************************************************************************************************************************/
  430. void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
  431. {
  432. uint32_t idx = chn2idx(chn);
  433. ADCx->IE &= ~(0x01 << (idx * 4 + 3));
  434. }
  435. /******************************************************************************************************************************************
  436. * 函数名称: ADC_IntFULLClr()
  437. * 功能说明: FIFO满中断标志清除
  438. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  439. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  440. * 输 出: 无
  441. * 注意事项: 无
  442. ******************************************************************************************************************************************/
  443. void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
  444. {
  445. uint32_t idx = chn2idx(chn);
  446. ADCx->IF = (0x01 << (idx * 4 + 3));
  447. }
  448. /******************************************************************************************************************************************
  449. * 函数名称: ADC_IntFULLStat()
  450. * 功能说明: FIFO满中断状态
  451. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  452. * uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  453. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  454. * 注意事项: 无
  455. ******************************************************************************************************************************************/
  456. uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
  457. {
  458. uint32_t idx = chn2idx(chn);
  459. return (ADCx->IF & (0x01 << (idx * 4 + 3))) ? 1 : 0;
  460. }