SWM320_adc.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  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) PLLInit();
  50. ADCx->CTRL &= ~(1 << ADC_CTRL_CLKSRC_Pos);
  51. SYS->PLLDIV &= ~SYS_PLLDIV_ADVCO_Msk;
  52. SYS->PLLDIV |= ((initStruct->clk_src - 2) << SYS_PLLDIV_ADVCO_Pos);
  53. SYS->PLLDIV &= ~SYS_PLLDIV_ADDIV_Msk;
  54. SYS->PLLDIV |= (initStruct->clk_div << SYS_PLLDIV_ADDIV_Pos);
  55. }
  56. ADCx->CALIBSET = (ADCx == ADC0) ? SYS->BKP[0] : SYS->BKP[1];
  57. ADCx->CALIBEN = (1 << ADC_CALIBEN_OFFSET_Pos) | (1 << ADC_CALIBEN_K_Pos);
  58. ADCx->CTRL2 &= ~(ADC_CTRL2_ADCEVCM_Msk | ADC_CTRL2_PGAIVCM_Msk | ADC_CTRL2_PGAGAIN_Msk | ADC_CTRL2_PGAVCM_Msk);
  59. ADCx->CTRL2 |= (0 << ADC_CTRL2_ADCEVCM_Pos) |
  60. (initStruct->pga_ref << ADC_CTRL2_PGAIVCM_Pos) |
  61. (6 << ADC_CTRL2_PGAGAIN_Pos) |
  62. ((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos);
  63. ADCx->CTRL &= ~( 0xFF << ADC_CTRL_CH0_Pos);
  64. ADCx->CTRL |= (initStruct->channels << ADC_CTRL_CH0_Pos);
  65. ADCx->CTRL &= ~(ADC_CTRL_AVG_Msk | ADC_CTRL_TRIG_Msk | ADC_CTRL_CONT_Msk);
  66. ADCx->CTRL |= (initStruct->samplAvg << ADC_CTRL_AVG_Pos) |
  67. (initStruct->trig_src << ADC_CTRL_TRIG_Pos) |
  68. (initStruct->Continue << ADC_CTRL_CONT_Pos);
  69. ADCx->IF = 0xFFFFFFFF; //清除中断标志
  70. ADCx->IE &= ~(ADC_IE_CH0EOC_Msk | ADC_IE_CH1EOC_Msk | ADC_IE_CH2EOC_Msk | ADC_IE_CH3EOC_Msk |
  71. ADC_IE_CH4EOC_Msk | ADC_IE_CH5EOC_Msk | ADC_IE_CH6EOC_Msk | ADC_IE_CH7EOC_Msk);
  72. ADCx->IE |= (((initStruct->EOC_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0EOC_Pos) |
  73. (((initStruct->EOC_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1EOC_Pos) |
  74. (((initStruct->EOC_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2EOC_Pos) |
  75. (((initStruct->EOC_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3EOC_Pos) |
  76. (((initStruct->EOC_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4EOC_Pos) |
  77. (((initStruct->EOC_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5EOC_Pos) |
  78. (((initStruct->EOC_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6EOC_Pos) |
  79. (((initStruct->EOC_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7EOC_Pos);
  80. ADCx->IE &= ~(ADC_IE_CH0OVF_Msk | ADC_IE_CH1OVF_Msk | ADC_IE_CH2OVF_Msk | ADC_IE_CH3OVF_Msk |
  81. ADC_IE_CH4OVF_Msk | ADC_IE_CH5OVF_Msk | ADC_IE_CH6OVF_Msk | ADC_IE_CH7OVF_Msk);
  82. ADCx->IE |= (((initStruct->OVF_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0OVF_Pos) |
  83. (((initStruct->OVF_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1OVF_Pos) |
  84. (((initStruct->OVF_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2OVF_Pos) |
  85. (((initStruct->OVF_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3OVF_Pos) |
  86. (((initStruct->OVF_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4OVF_Pos) |
  87. (((initStruct->OVF_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5OVF_Pos) |
  88. (((initStruct->OVF_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6OVF_Pos) |
  89. (((initStruct->OVF_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7OVF_Pos);
  90. ADCx->IE &= ~(ADC_IE_CH0HFULL_Msk | ADC_IE_CH1HFULL_Msk | ADC_IE_CH2HFULL_Msk | ADC_IE_CH3HFULL_Msk |
  91. ADC_IE_CH4HFULL_Msk | ADC_IE_CH5HFULL_Msk | ADC_IE_CH6HFULL_Msk | ADC_IE_CH7HFULL_Msk);
  92. ADCx->IE |= (((initStruct->HFULL_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0HFULL_Pos) |
  93. (((initStruct->HFULL_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1HFULL_Pos) |
  94. (((initStruct->HFULL_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2HFULL_Pos) |
  95. (((initStruct->HFULL_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3HFULL_Pos) |
  96. (((initStruct->HFULL_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4HFULL_Pos) |
  97. (((initStruct->HFULL_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5HFULL_Pos) |
  98. (((initStruct->HFULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6HFULL_Pos) |
  99. (((initStruct->HFULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7HFULL_Pos);
  100. ADCx->IE &= ~(uint32_t)(ADC_IE_CH0FULL_Msk | ADC_IE_CH1FULL_Msk | ADC_IE_CH2FULL_Msk | ADC_IE_CH3FULL_Msk |
  101. ADC_IE_CH4FULL_Msk | ADC_IE_CH5FULL_Msk | ADC_IE_CH6FULL_Msk | ADC_IE_CH7FULL_Msk);
  102. ADCx->IE |= (((initStruct->FULL_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0FULL_Pos) |
  103. (((initStruct->FULL_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1FULL_Pos) |
  104. (((initStruct->FULL_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2FULL_Pos) |
  105. (((initStruct->FULL_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3FULL_Pos) |
  106. (((initStruct->FULL_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4FULL_Pos) |
  107. (((initStruct->FULL_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5FULL_Pos) |
  108. (((initStruct->FULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6FULL_Pos) |
  109. (((initStruct->FULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7FULL_Pos);
  110. switch((uint32_t)ADCx)
  111. {
  112. case ((uint32_t)ADC0):
  113. if(initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
  114. {
  115. NVIC_EnableIRQ(ADC0_IRQn);
  116. }
  117. else
  118. {
  119. NVIC_DisableIRQ(ADC0_IRQn);
  120. }
  121. break;
  122. case ((uint32_t)ADC1):
  123. if(initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
  124. {
  125. NVIC_EnableIRQ(ADC1_IRQn);
  126. }
  127. else
  128. {
  129. NVIC_DisableIRQ(ADC1_IRQn);
  130. }
  131. break;
  132. }
  133. }
  134. /******************************************************************************************************************************************
  135. * 函数名称: ADC_Open()
  136. * 功能说明: ADC开启,可以软件启动、或硬件触发ADC转换
  137. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  138. * 输 出: 无
  139. * 注意事项: 无
  140. ******************************************************************************************************************************************/
  141. void ADC_Open(ADC_TypeDef * ADCx)
  142. {
  143. ADCx->CTRL |= (0x01 << ADC_CTRL_EN_Pos);
  144. }
  145. /******************************************************************************************************************************************
  146. * 函数名称: ADC_Close()
  147. * 功能说明: ADC关闭,无法软件启动、或硬件触发ADC转换
  148. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  149. * 输 出: 无
  150. * 注意事项: 无
  151. ******************************************************************************************************************************************/
  152. void ADC_Close(ADC_TypeDef * ADCx)
  153. {
  154. ADCx->CTRL &= ~(0x01 << ADC_CTRL_EN_Pos);
  155. }
  156. /******************************************************************************************************************************************
  157. * 函数名称: ADC_Start()
  158. * 功能说明: 软件触发模式下启动ADC转换
  159. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  160. * 输 出: 无
  161. * 注意事项: 无
  162. ******************************************************************************************************************************************/
  163. void ADC_Start(ADC_TypeDef * ADCx)
  164. {
  165. ADCx->START |= (0x01 << ADC_START_GO_Pos);
  166. }
  167. /******************************************************************************************************************************************
  168. * 函数名称: ADC_Stop()
  169. * 功能说明: 软件触发模式下停止ADC转换
  170. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  171. * 输 出: 无
  172. * 注意事项: 无
  173. ******************************************************************************************************************************************/
  174. void ADC_Stop(ADC_TypeDef * ADCx)
  175. {
  176. ADCx->START &= ~(0x01 << ADC_START_GO_Pos);
  177. }
  178. static uint32_t chn2idx(uint32_t chn)
  179. {
  180. uint32_t idx = 0;
  181. switch(chn)
  182. {
  183. case 0x01: idx = 0; break;
  184. case 0x02: idx = 1; break;
  185. case 0x04: idx = 2; break;
  186. case 0x08: idx = 3; break;
  187. case 0x10: idx = 4; break;
  188. case 0x20: idx = 5; break;
  189. case 0x40: idx = 6; break;
  190. case 0x80: idx = 7; break;
  191. }
  192. return idx;
  193. }
  194. /******************************************************************************************************************************************
  195. * 函数名称: ADC_Read()
  196. * 功能说明: 从指定通道读取转换结果
  197. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  198. * uint32_t chn 要读取转换结果的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  199. * 输 出: uint32_t 读取到的转换结果
  200. * 注意事项: 无
  201. ******************************************************************************************************************************************/
  202. uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn)
  203. {
  204. uint32_t dat = 0;
  205. uint32_t idx = chn2idx(chn);
  206. dat = ADCx->CH[idx].DATA;
  207. ADCx->CH[idx].STAT = 0x01; //清除EOC标志
  208. return dat;
  209. }
  210. /******************************************************************************************************************************************
  211. * 函数名称: ADC_IsEOC()
  212. * 功能说明: 指定通道是否End Of Conversion
  213. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  214. * uint32_t chn 要查询状态的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  215. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  216. * 注意事项: 无
  217. ******************************************************************************************************************************************/
  218. uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn)
  219. {
  220. uint32_t idx = chn2idx(chn);
  221. return (ADCx->CH[idx].STAT & ADC_STAT_EOC_Msk) ? 1 : 0;
  222. }
  223. /******************************************************************************************************************************************
  224. * 函数名称: ADC_ChnSelect()
  225. * 功能说明: ADC通道选通,模数转换会在选通的通道上依次采样转换
  226. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  227. * uint32_t chns 要选通的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
  228. * 输 出: 无
  229. * 注意事项: 无
  230. ******************************************************************************************************************************************/
  231. void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns)
  232. {
  233. ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
  234. ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos);
  235. }
  236. /******************************************************************************************************************************************
  237. * 函数名称: ADC_IntEOCEn()
  238. * 功能说明: 转换完成中断使能
  239. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  240. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  241. * 输 出: 无
  242. * 注意事项: 无
  243. ******************************************************************************************************************************************/
  244. void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn)
  245. {
  246. uint32_t idx = chn2idx(chn);
  247. ADCx->IE |= (0x01 << (idx*4));
  248. }
  249. /******************************************************************************************************************************************
  250. * 函数名称: ADC_IntEOCDis()
  251. * 功能说明: 转换完成中断禁止
  252. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  253. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  254. * 输 出: 无
  255. * 注意事项: 无
  256. ******************************************************************************************************************************************/
  257. void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn)
  258. {
  259. uint32_t idx = chn2idx(chn);
  260. ADCx->IE &= ~(0x01 << (idx*4));
  261. }
  262. /******************************************************************************************************************************************
  263. * 函数名称: ADC_IntEOCClr()
  264. * 功能说明: 转换完成中断标志清除
  265. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  266. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  267. * 输 出: 无
  268. * 注意事项: 无
  269. ******************************************************************************************************************************************/
  270. void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn)
  271. {
  272. uint32_t idx = chn2idx(chn);
  273. ADCx->IF = (0x01 << (idx*4));
  274. }
  275. /******************************************************************************************************************************************
  276. * 函数名称: ADC_IntEOCStat()
  277. * 功能说明: 转换完成中断状态
  278. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  279. * uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  280. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  281. * 注意事项: 无
  282. ******************************************************************************************************************************************/
  283. uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn)
  284. {
  285. uint32_t idx = chn2idx(chn);
  286. return (ADCx->IF & (0x01 << (idx*4))) ? 1 : 0;
  287. }
  288. /******************************************************************************************************************************************
  289. * 函数名称: ADC_IntOVFEn()
  290. * 功能说明: 数据溢出中断使能
  291. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  292. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  293. * 输 出: 无
  294. * 注意事项: 无
  295. ******************************************************************************************************************************************/
  296. void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn)
  297. {
  298. uint32_t idx = chn2idx(chn);
  299. ADCx->IE |= (0x01 << (idx*4+1));
  300. }
  301. /******************************************************************************************************************************************
  302. * 函数名称: ADC_IntOVFDis()
  303. * 功能说明: 数据溢出中断禁止
  304. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  305. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  306. * 输 出: 无
  307. * 注意事项: 无
  308. ******************************************************************************************************************************************/
  309. void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn)
  310. {
  311. uint32_t idx = chn2idx(chn);
  312. ADCx->IE &= ~(0x01 << (idx*4+1));
  313. }
  314. /******************************************************************************************************************************************
  315. * 函数名称: ADC_IntOVFClr()
  316. * 功能说明: 数据溢出中断标志清除
  317. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  318. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  319. * 输 出: 无
  320. * 注意事项: 无
  321. ******************************************************************************************************************************************/
  322. void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn)
  323. {
  324. uint32_t idx = chn2idx(chn);
  325. ADCx->IF = (0x01 << (idx*4+1));
  326. }
  327. /******************************************************************************************************************************************
  328. * 函数名称: ADC_IntOVFStat()
  329. * 功能说明: 数据溢出中断状态
  330. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  331. * uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  332. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  333. * 注意事项: 无
  334. ******************************************************************************************************************************************/
  335. uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn)
  336. {
  337. uint32_t idx = chn2idx(chn);
  338. return (ADCx->IF & (0x01 << (idx*4+1))) ? 1 : 0;
  339. }
  340. /******************************************************************************************************************************************
  341. * 函数名称: ADC_IntHFULLEn()
  342. * 功能说明: FIFO半满中断使能
  343. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  344. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  345. * 输 出: 无
  346. * 注意事项: 无
  347. ******************************************************************************************************************************************/
  348. void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
  349. {
  350. uint32_t idx = chn2idx(chn);
  351. ADCx->IE |= (0x01 << (idx*4+2));
  352. }
  353. /******************************************************************************************************************************************
  354. * 函数名称: ADC_IntHFULLDis()
  355. * 功能说明: FIFO半满中断禁止
  356. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  357. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  358. * 输 出: 无
  359. * 注意事项: 无
  360. ******************************************************************************************************************************************/
  361. void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
  362. {
  363. uint32_t idx = chn2idx(chn);
  364. ADCx->IE &= ~(0x01 << (idx*4+2));
  365. }
  366. /******************************************************************************************************************************************
  367. * 函数名称: ADC_IntHFULLClr()
  368. * 功能说明: FIFO半满中断标志清除
  369. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  370. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  371. * 输 出: 无
  372. * 注意事项: 无
  373. ******************************************************************************************************************************************/
  374. void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
  375. {
  376. uint32_t idx = chn2idx(chn);
  377. ADCx->IF = (0x01 << (idx*4+2));
  378. }
  379. /******************************************************************************************************************************************
  380. * 函数名称: ADC_IntHFULLStat()
  381. * 功能说明: FIFO半满中断状态
  382. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  383. * uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  384. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  385. * 注意事项: 无
  386. ******************************************************************************************************************************************/
  387. uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn)
  388. {
  389. uint32_t idx = chn2idx(chn);
  390. return (ADCx->IF & (0x01 << (idx*4+2))) ? 1 : 0;
  391. }
  392. /******************************************************************************************************************************************
  393. * 函数名称: ADC_IntFULLEn()
  394. * 功能说明: FIFO满中断使能
  395. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  396. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  397. * 输 出: 无
  398. * 注意事项: 无
  399. ******************************************************************************************************************************************/
  400. void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
  401. {
  402. uint32_t idx = chn2idx(chn);
  403. ADCx->IE |= (0x01 << (idx*4+3));
  404. }
  405. /******************************************************************************************************************************************
  406. * 函数名称: ADC_IntFULLDis()
  407. * 功能说明: FIFO满中断禁止
  408. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  409. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  410. * 输 出: 无
  411. * 注意事项: 无
  412. ******************************************************************************************************************************************/
  413. void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
  414. {
  415. uint32_t idx = chn2idx(chn);
  416. ADCx->IE &= ~(0x01 << (idx*4+3));
  417. }
  418. /******************************************************************************************************************************************
  419. * 函数名称: ADC_IntFULLClr()
  420. * 功能说明: FIFO满中断标志清除
  421. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  422. * uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  423. * 输 出: 无
  424. * 注意事项: 无
  425. ******************************************************************************************************************************************/
  426. void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
  427. {
  428. uint32_t idx = chn2idx(chn);
  429. ADCx->IF = (0x01 << (idx*4+3));
  430. }
  431. /******************************************************************************************************************************************
  432. * 函数名称: ADC_IntFULLStat()
  433. * 功能说明: FIFO满中断状态
  434. * 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
  435. * uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
  436. * 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
  437. * 注意事项: 无
  438. ******************************************************************************************************************************************/
  439. uint32_t ADC_IntFULLStat(ADC_TypeDef * ADCx, uint32_t chn)
  440. {
  441. uint32_t idx = chn2idx(chn);
  442. return (ADCx->IF & (0x01 << (idx*4+3))) ? 1 : 0;
  443. }