1 #ifndef __SWM341_ADC_H__
2 #define __SWM341_ADC_H__
3 
4 typedef struct {
5     uint8_t  clk_src;       //ADC转换时钟源:ADC_CLKSRC_HRC、ADC_CLKSRC_XTAL、...
6     uint8_t  samplAvg;      //采样取平均,触发启动ADC转换后,ADC在一个通道上连续采样、转换多次,并将它们的平均值作为该通道转换结果
7 
8     uint8_t  EOC_IEn;       //EOC中断使能,     可针对每个序列设置,其有效值为ADC_SEQ0、ADC_SEQ1、ADC_SEQ2、ADC_SEQ3及其组合(即“按位或”运算)
9     uint8_t  HalfIEn;       //FIFO半满中断使能,可针对每个序列设置,其有效值为ADC_SEQ0、ADC_SEQ1、ADC_SEQ2、ADC_SEQ3及其组合(即“按位或”运算)
10 } ADC_InitStructure;
11 
12 typedef struct {
13     uint16_t channels;      //ADC序列转换通道选中,ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
14     uint8_t  trig_src;      //ADC序列触发方式:ADC_TRIGGER_SW、ADC_TRIGGER_TIMER2、ADC_TRIGGER_TIMER3、... ...
15     uint16_t conv_cnt;      //ADC序列转换次数,可取值1--256
16     uint8_t  samp_tim;      //ADC序列采样时间,可取值ADC_SAMPLE_1CLOCK、ADC_SAMPLE_2CLOCK、ADC_SAMPLE_4CLOCK、ADC_SAMPLE_8CLOCK
17 } ADC_SEQ_InitStructure;
18 
19 typedef struct {
20     uint16_t UpperLimit;    //比较上限值
21     uint16_t UpperLimitIEn; //ADC转换结果大于UpperLimit中断使能
22     uint16_t LowerLimit;    //比较下限值
23     uint16_t LowerLimitIEn; //ADC转换结果小于LowerLimit中断使能
24 } ADC_CMP_InitStructure;
25 
26 #define ADC_CH0     0x001
27 #define ADC_CH1     0x002
28 #define ADC_CH2     0x004
29 #define ADC_CH3     0x008
30 #define ADC_CH4     0x010
31 #define ADC_CH5     0x020
32 #define ADC_CH6     0x040
33 #define ADC_CH7     0x080
34 #define ADC_CH8     0x100
35 #define ADC_CH9     0x200
36 #define ADC_CH10    0x400
37 #define ADC_CH11    0x800
38 
39 #define ADC_SEQ0    0x1
40 #define ADC_SEQ1    0x2
41 #define ADC_SEQ2    0x4
42 #define ADC_SEQ3    0x8
43 
44 #define ADC_CLKSRC_HRC          ((0 << 2) | 0)
45 #define ADC_CLKSRC_XTAL         ((0 << 2) | 1)
46 #define ADC_CLKSRC_PLL          ((0 << 2) | 2)
47 #define ADC_CLKSRC_HRC_DIV4     ((2 << 2) | 0)
48 #define ADC_CLKSRC_XTAL_DIV4    ((2 << 2) | 1)
49 #define ADC_CLKSRC_PLL_DIV4     ((2 << 2) | 2)
50 #define ADC_CLKSRC_HRC_DIV8     ((3 << 2) | 0)
51 #define ADC_CLKSRC_XTAL_DIV8    ((3 << 2) | 1)
52 #define ADC_CLKSRC_PLL_DIV8     ((3 << 2) | 2)
53 
54 #define ADC_AVG_SAMPLE1         0
55 #define ADC_AVG_SAMPLE2         1   //一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果
56 #define ADC_AVG_SAMPLE4         2
57 #define ADC_AVG_SAMPLE8         3
58 
59 #define ADC_TRIGGER_NO          0
60 #define ADC_TRIGGER_SW          1   //软件启动
61 #define ADC_TRIGGER_TIMER2      2
62 #define ADC_TRIGGER_TIMER3      3
63 #define ADC_TRIGGER_EXTRIG0     4
64 #define ADC_TRIGGER_EXTRIG1     5
65 #define ADC_TRIGGER_PWM0        0x10
66 #define ADC_TRIGGER_PWM1        0x11
67 #define ADC_TRIGGER_PWM2        0x12
68 #define ADC_TRIGGER_PWM3        0x13
69 #define ADC_TRIGGER_PWM4        0x14
70 
71 #define ADC_SAMPLE_1CLOCK       0
72 #define ADC_SAMPLE_2CLOCK       1
73 #define ADC_SAMPLE_4CLOCK       2
74 #define ADC_SAMPLE_8CLOCK       3
75 #define ADC_SAMPLE_16CLOCK      4
76 #define ADC_SAMPLE_32CLOCK      5
77 #define ADC_SAMPLE_64CLOCK      6
78 #define ADC_SAMPLE_128CLOCK     7
79 
80 
81 /* Interrupt Type */
82 #define ADC_IT_EOC          (1 << 0)    //End Of Conversion
83 #define ADC_IT_FIFO_OVF     (1 << 1)    //FIFO Overflow
84 #define ADC_IT_FIFO_HALF    (1 << 2)    //FIFO Half Full
85 #define ADC_IT_FIFO_FULL    (1 << 3)    //FIFO Full
86 #define ADC_IT_CMP_MAX      (1 << 4)    //转换结果大于COMP.MAX
87 #define ADC_IT_CMP_MIN      (1 << 5)    //转换结果小于COMP.MIN
88 
89 
90 void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct);      //ADC模数转换器初始化
91 void ADC_SEQ_Init(ADC_TypeDef * ADCx, uint32_t seq, ADC_SEQ_InitStructure * initStruct);    //ADC序列初始化
92 void ADC_CMP_Init(ADC_TypeDef * ADCx, uint32_t seq, ADC_CMP_InitStructure * initStruct);    //ADC比较功能初始化
93 void ADC_Open(ADC_TypeDef * ADCx);                          //ADC开启,可以软件启动、或硬件触发ADC转换
94 void ADC_Calibrate(ADC_TypeDef * ADCx);                     //ADC校准
95 void ADC_Close(ADC_TypeDef * ADCx);                         //ADC关闭,无法软件启动、或硬件触发ADC转换
96 void ADC_Start(ADC_TypeDef * ADCx, uint32_t seq);           //启动指定ADC,开始模数转换
97 void ADC_Stop(ADC_TypeDef * ADCx, uint32_t seq);            //关闭指定ADC,停止模数转换
98 
99 uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t seq, uint32_t *chn);     //从指定通道读取转换结果
100 uint32_t ADC_DataAvailable(ADC_TypeDef * ADCx, uint32_t seq);           //指定序列是否有数据可读取
101 
102 
103 void ADC_INTEn(ADC_TypeDef * ADCx, uint32_t seq, uint32_t it);
104 void ADC_INTEn(ADC_TypeDef * ADCx, uint32_t seq, uint32_t it);
105 void ADC_INTClr(ADC_TypeDef * ADCx, uint32_t seq, uint32_t it);
106 uint32_t ADC_INTStat(ADC_TypeDef * ADCx, uint32_t seq, uint32_t it);
107 
108 
109 #endif //__SWM341_ADC_H__
110