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