274 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			274 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /********************************** (C) COPYRIGHT *******************************
 | |||
|  |  * File Name          : CH59x_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 __CH59x_ADC_H__
 | |||
|  | #define __CH59x_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_PGA_2_ = 0x10,  // 6dB, 2倍
 | |||
|  |     ADC_PGA_4,          // 12dB, 4倍
 | |||
|  |     ADC_PGA_8,          // 18dB, 8倍
 | |||
|  |     ADC_PGA_16,         // 24dB, 16倍
 | |||
|  | } 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, uint32_t startAddr, uint32_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 = R8_ADC_CONVERT)
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @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_StartAutoDMA()        (R8_ADC_CTRL_DMA |= RB_ADC_AUTO_EN)
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   停止定时间隔自动连续 ADC | |||
|  |  */ | |||
|  | #define ADC_StopAutoDMA()         (R8_ADC_CTRL_DMA &= ~RB_ADC_AUTO_EN)
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   开启连续转换 ADC | |||
|  |  */ | |||
|  | #define ADC_StartContDMA()        (R8_ADC_CTRL_DMA |= RB_ADC_CONT_EN)
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   停止连续转换 ADC | |||
|  |  */ | |||
|  | #define ADC_StopContDMA()         (R8_ADC_CTRL_DMA &= ~RB_ADC_CONT_EN)
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   关闭ADC电源 | |||
|  |  */ | |||
|  | #define ADC_DisablePower()        (R8_ADC_CFG &= ~RB_ADC_POWER_ON)
 | |||
|  | 
 | |||
|  | #ifdef __cplusplus
 | |||
|  | } | |||
|  | #endif
 | |||
|  | 
 | |||
|  | #endif // __CH59x_ADC_H__
 |