aboutsummaryrefslogtreecommitdiff
path: root/CH5xx_ble_firmware_library/StdPeriphDriver/inc/CH58x_adc.h
blob: 0654a5e444fb03d0516f3a6f4553b923b994b30e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
/********************************** (C) COPYRIGHT *******************************
 * File Name          : CH57x_adc.h
 * Author             : WCH
 * Version            : V1.2
 * Date               : 2021/11/17
 * Description
 *********************************************************************************
 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
 * Attention: This software (modified or not) and binary are used for 
 * microcontroller manufactured by Nanjing Qinheng Microelectronics.
 *******************************************************************************/

#ifndef __CH58x_ADC_H__
#define __CH58x_ADC_H__

#ifdef __cplusplus
extern "C" {
#endif

#define ROM_CFG_TMP_25C    0x7F014

/**
 * @brief  adc single channel define
 */
typedef enum
{
    CH_EXTIN_0 = 0,   // ADC 外部模拟通道 0
    CH_EXTIN_1,       // ADC 外部模拟通道 1
    CH_EXTIN_2,       // ADC 外部模拟通道 2
    CH_EXTIN_3,       // ADC 外部模拟通道 3
    CH_EXTIN_4,       // ADC 外部模拟通道 4
    CH_EXTIN_5,       // ADC 外部模拟通道 5
    CH_EXTIN_6,       // ADC 外部模拟通道 6
    CH_EXTIN_7,       // ADC 外部模拟通道 7
    CH_EXTIN_8,       // ADC 外部模拟通道 8
    CH_EXTIN_9,       // ADC 外部模拟通道 9
    CH_EXTIN_10,      // ADC 外部模拟通道 10
    CH_EXTIN_11,      // ADC 外部模拟通道 11
    CH_EXTIN_12,      // ADC 外部模拟通道 12
    CH_EXTIN_13,      // ADC 外部模拟通道 13

    CH_INTE_VBAT = 14,  // ADC 内部电池检测通道
    CH_INTE_VTEMP = 15, // ADC 内部温度传感器检测通道

} ADC_SingleChannelTypeDef;

/**
 * @brief  adc differential channel define
 */
typedef enum
{
    CH_DIFF_0_2 = 0, // ADC 差分通道 #0-#2
    CH_DIFF_1_3,     // ADC 差分通道 #1-#3

} ADC_DiffChannelTypeDef;

/**
 * @brief  adc sampling clock
 */
typedef enum
{
    SampleFreq_3_2 = 0, // 3.2M 采样频率
    SampleFreq_8,       // 8M 采样频率
    SampleFreq_5_33,    // 5.33M 采样频率
    SampleFreq_4,       // 4M 采样频率
} ADC_SampClkTypeDef;

/**
 * @brief  adc signal PGA
 */
typedef enum
{
    ADC_PGA_1_4 = 0, // -12dB, 1/4倍
    ADC_PGA_1_2,     // -6dB, 1/2倍
    ADC_PGA_0,       // 0dB, 1倍,无增益
    ADC_PGA_2,       // 6dB, 2倍
} ADC_SignalPGATypeDef;

/**
 * @brief  Configuration DMA mode
 */
typedef enum
{
    ADC_Mode_Single = 0, // 单次模式
    ADC_Mode_LOOP,       // 循环模式
} ADC_DMAModeTypeDef;


/**
 * @brief   设置 ADC 采样通道
 *
 * @param   d   - refer to ADC_SingleChannelTypeDef
 */
#define ADC_ChannelCfg(d)      (R8_ADC_CHANNEL = d)

/**
 * @brief   设置 ADC 采样时钟
 *
 * @param   d   - refer to ADC_SampClkTypeDef
 */
#define ADC_SampClkCfg(d)      (R8_ADC_CFG = R8_ADC_CFG & (~RB_ADC_CLK_DIV) | (d << 6))

/**
 * @brief   设置 ADC 信号增益
 *
 * @param   d   - refer to ADC_SignalPGATypeDef
 */
#define ADC_PGACfg(d)          (R8_ADC_CFG = R8_ADC_CFG & (~RB_ADC_PGA_GAIN) | (d << 4))

/**
 * @brief   设置内部温度传感器校准值
 *
 * @param   d   - 校准值
 */
#define ADC_TempCalibCfg(d)    (R8_TEM_SENSOR = R8_TEM_SENSOR & (~RB_TEM_SEN_CALIB) | d)

/**
 * @brief   外部信号单通道采样初始化
 *
 * @param   sp  - refer to ADC_SampClkTypeDef
 * @param   ga  - refer to ADC_SignalPGATypeDef
 */
void ADC_ExtSingleChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga);

/**
 * @brief   外部信号差分通道采样初始化
 *
 * @param   sp  - refer to ADC_SampClkTypeDef
 * @param   ga  - refer to ADC_SignalPGATypeDef
 */
void ADC_ExtDiffChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga);

/**
 * @brief   触摸按键通道采样初始化
 */
void TouchKey_ChSampInit(void);

/**
 * @brief   关闭TouchKey电源
 */
#define TouchKey_DisableTSPower()    (R8_TKEY_CFG &= ~RB_TKEY_PWR_ON)

/**
 * @brief   内置温度传感器采样初始化
 */
void ADC_InterTSSampInit(void);

/**
 * @brief   关闭温度传感器电源
 */
#define ADC_DisableTSPower()    (R8_TEM_SENSOR = 0)

/**
 * @brief   内置电池电压采样初始化
 */
void ADC_InterBATSampInit(void);

/**
 * @brief   ADC执行单次转换
 *
 * @return  ADC转换后的数据
 */
uint16_t ADC_ExcutSingleConver(void);

/**
 * @brief   采样数据粗调,获取偏差值,必须先配置ADC后调用此函数获取校准值
 *
 * @return  偏差
 */
signed short ADC_DataCalib_Rough(void);

/**
 * @brief   TouchKey转换后数据
 *
 * @param   charg   - Touchkey充电时间,5bits有效, t=charg*Tadc
 * @param   disch   - Touchkey放电时间,3bits有效, t=disch*Tadc
 *
 * @return  当前TouchKey等效数据
 */
uint16_t TouchKey_ExcutSingleConver(uint8_t charg, uint8_t disch);

/**
 * @brief   设置连续 ADC的周期
 *
 * @param   cycle   - 单位为 16个系统时钟
 */
void ADC_AutoConverCycle(uint8_t cycle);

/**
 * @brief   配置DMA功能
 *
 * @param   s           - 是否打开DMA功能
 * @param   startAddr   - DMA 起始地址
 * @param   endAddr     - DMA 结束地址
 * @param   m           - 配置DMA模式
 */
void ADC_DMACfg(uint8_t s, uint16_t startAddr, uint16_t endAddr, ADC_DMAModeTypeDef m);

/**
 * @brief   Convert ADC value to temperature(Celsius)
 *
 * @param   adc_val - adc value
 *
 * @return  temperature (Celsius)
 */
int adc_to_temperature_celsius(uint16_t adc_val);

/**
 * @brief   获取ADC转换值
 *
 * @return  ADC转换值
 */
#define ADC_ReadConverValue()     (R16_ADC_DATA)

/**
 * @brief   ADC执行单次转换
 */
#define ADC_StartUp()             (R8_ADC_CONVERT = RB_ADC_START)

/**
 * @brief   获取ADC中断状态
 */
#define ADC_GetITStatus()         (R8_ADC_INT_FLAG & RB_ADC_IF_EOC)

/**
 * @brief   清除ADC中断标志
 */
#define ADC_ClearITFlag()         (R8_ADC_CONVERT = 0)

/**
 * @brief   获取ADC DMA完成状态
 */
#define ADC_GetDMAStatus()        (R8_ADC_DMA_IF & RB_ADC_IF_DMA_END)

/**
 * @brief   清除ADC DMA完成标志
 */
#define ADC_ClearDMAFlag()        (R8_ADC_DMA_IF |= RB_ADC_IF_DMA_END)

/**
 * @brief   开启自动连续 ADC
 */
#define ADC_StartDMA()            (R8_ADC_CTRL_DMA |= RB_ADC_AUTO_EN)

/**
 * @brief   停止自动连续 ADC
 */
#define ADC_StopDMA()            (R8_ADC_CTRL_DMA &= ~RB_ADC_AUTO_EN)

/**
 * @brief   获取TouchKey中断状态
 */
#define TouchKey_GetITStatus()    (R8_ADC_INT_FLAG & RB_ADC_IF_EOC)

/**
 * @brief   清除TouchKey中断标志
 */
#define TouchKey_ClearITFlag()    (R8_TKEY_CTRL |= RB_TKEY_PWR_ON)


#ifdef __cplusplus
}
#endif

#endif // __CH58x_ADC_H__