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